diff --git a/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt b/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt index afe597224..ba8821ae7 100644 --- a/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt +++ b/src/test/java/com/projectswg/holocore/resources/support/global/zone/creation/CharacterCreationTest.kt @@ -1,47 +1,19 @@ package com.projectswg.holocore.resources.support.global.zone.creation import com.projectswg.holocore.headless.HeadlessSWGClient -import com.projectswg.holocore.headless.MemoryUserDatabase import com.projectswg.holocore.resources.support.objects.swg.SWGObject import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject -import com.projectswg.holocore.services.gameplay.combat.CombatDeathblowService -import com.projectswg.holocore.services.gameplay.combat.CombatExperienceService -import com.projectswg.holocore.services.gameplay.player.experience.ExperiencePointService -import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService -import com.projectswg.holocore.services.support.global.commands.CommandExecutionService -import com.projectswg.holocore.services.support.global.commands.CommandQueueService -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.services.support.global.zone.ZoneService -import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach +import com.projectswg.holocore.test.runners.IntegrationTest import org.junit.jupiter.api.Assertions.assertAll import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class CharacterCreationTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() +class CharacterCreationTest : IntegrationTest() { @BeforeEach - fun setUp() { - registerService(LoginService(memoryUserDatabase)) - registerService(ZoneService()) - registerService(CharacterCreationService()) - registerService(SkillService()) - registerService(CommandQueueService(5)) - registerService(CommandExecutionService()) - registerService(CombatDeathblowService()) - registerService(ExperiencePointService()) - registerService(CombatExperienceService()) - - memoryUserDatabase.addUser("username", "password") - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() + fun setUpUser() { + addUser("username", "password") } @Test diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt index 621792a19..cfa26b1fa 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/TipCreditsTest.kt @@ -26,55 +26,12 @@ ***********************************************************************************/ package com.projectswg.holocore.services.gameplay.player -import com.projectswg.common.data.location.Location import com.projectswg.holocore.headless.* -import com.projectswg.holocore.resources.support.data.server_info.loader.ServerData -import com.projectswg.holocore.resources.support.data.server_info.loader.npc.NpcStaticSpawnLoader -import com.projectswg.holocore.resources.support.npc.spawn.NPCCreator -import com.projectswg.holocore.resources.support.npc.spawn.SimpleSpawnInfo -import com.projectswg.holocore.resources.support.npc.spawn.Spawner -import com.projectswg.holocore.resources.support.objects.ObjectCreator -import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureDifficulty -import com.projectswg.holocore.resources.support.objects.swg.custom.AIObject -import com.projectswg.holocore.services.gameplay.player.character.TippingService -import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService -import com.projectswg.holocore.services.support.global.chat.ChatMailService -import com.projectswg.holocore.services.support.global.chat.ChatSystemService -import com.projectswg.holocore.services.support.global.commands.CommandExecutionService -import com.projectswg.holocore.services.support.global.commands.CommandQueueService -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.services.support.global.zone.ZoneService -import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService -import com.projectswg.holocore.services.support.global.zone.sui.SuiService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach +import com.projectswg.holocore.test.runners.IntegrationTest import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.BeforeAll -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class TipCreditsTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() - - @BeforeEach - fun setUp() { - registerService(LoginService(memoryUserDatabase)) - registerService(ZoneService()) - registerService(CharacterCreationService()) - registerService(SkillService()) - registerService(CommandQueueService(5)) - registerService(CommandExecutionService()) - registerService(ChatSystemService()) - registerService(ChatMailService()) - registerService(SuiService()) - registerService(TippingService()) - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() - } +class TipCreditsTest : IntegrationTest() { @Test fun negativeAmount() { @@ -101,7 +58,7 @@ class TipCreditsTest : TestRunnerSimulatedWorld() { @Test fun npc() { val zonedInCharacter1 = createZonedInCharacter("Playerone", "Charone") - val womprat = spawnNPCs("creature_womprat", zonedInCharacter1.player.creatureObject.location, 1).first() + val womprat = spawnNPC("creature_womprat", zonedInCharacter1.player.creatureObject.location) assertThrows(TipException::class.java) { zonedInCharacter1.tipCash(womprat, 1) @@ -181,35 +138,10 @@ class TipCreditsTest : TestRunnerSimulatedWorld() { private fun createZonedInCharacter(username: String, characterName: String): ZonedInCharacter { val password = "password" - memoryUserDatabase.addUser(username, password) + addUser(username, password) return HeadlessSWGClient.createZonedInCharacter(username, password, characterName) } - companion object { - @JvmStatic - @BeforeAll - fun setUpAll() { - ServerData.terrains // Eagerly load, so even the very first command is fast in the 'swimming' state check - } - } - - private fun spawnNPCs(npcId: String, location: Location, amount: Int): Collection { - val egg = ObjectCreator.createObjectFromTemplate("object/tangible/ground_spawning/shared_patrol_spawner.iff") - egg.moveToContainer(null, location) - - val spawnInfo = SimpleSpawnInfo.builder() - .withNpcId(npcId) - .withDifficulty(CreatureDifficulty.NORMAL) - .withMinLevel(1) - .withMaxLevel(1) - .withLocation(location) - .withAmount(amount) - .withSpawnerFlag(NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE) - .build() - - return NPCCreator.createAllNPCs(Spawner(spawnInfo, egg)) - } - } private data class CreditsSnapshot(private val character: ZonedInCharacter) { diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt index 7d4089995..d4c357d50 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/experience/SkillTreeTest.kt @@ -27,40 +27,19 @@ package com.projectswg.holocore.services.gameplay.player.experience import com.projectswg.holocore.headless.HeadlessSWGClient -import com.projectswg.holocore.headless.MemoryUserDatabase import com.projectswg.holocore.headless.adminGrantSkill import com.projectswg.holocore.headless.surrenderSkill import com.projectswg.holocore.resources.support.global.player.AccessLevel -import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService -import com.projectswg.holocore.services.support.global.commands.CommandExecutionService -import com.projectswg.holocore.services.support.global.commands.CommandQueueService -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.services.support.global.zone.ZoneService -import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach +import com.projectswg.holocore.test.runners.IntegrationTest import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class SkillTreeTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() +class SkillTreeTest : IntegrationTest() { @BeforeEach fun setUp() { - memoryUserDatabase.addUser("username", "password", accessLevel = AccessLevel.DEV) - registerService(LoginService(memoryUserDatabase)) - registerService(ZoneService()) - registerService(CharacterCreationService()) - registerService(SkillService()) - registerService(CommandQueueService(5)) - registerService(CommandExecutionService()) - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() + addUser("username", "password", accessLevel = AccessLevel.DEV) } @Test diff --git a/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt b/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt index 026c9b0b1..60aa0431a 100644 --- a/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt +++ b/src/test/java/com/projectswg/holocore/services/gameplay/player/group/GroupTest.kt @@ -27,39 +27,11 @@ package com.projectswg.holocore.services.gameplay.player.group import com.projectswg.holocore.headless.* -import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService -import com.projectswg.holocore.services.support.global.commands.CommandExecutionService -import com.projectswg.holocore.services.support.global.commands.CommandQueueService -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.services.support.global.zone.ZoneService -import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach +import com.projectswg.holocore.test.runners.IntegrationTest +import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test -class GroupTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() - - @BeforeEach - fun setUp() { - registerService(LoginService(memoryUserDatabase)) - registerService(ZoneService()) - registerService(CharacterCreationService()) - registerService(SkillService()) - registerService(CommandQueueService(5)) - registerService(CommandExecutionService()) - - registerService(GroupService()) - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() - } +class GroupTest : IntegrationTest() { @Test fun formGroup() { @@ -81,8 +53,10 @@ class GroupTest : TestRunnerSimulatedWorld() { zonedInCharacter1.makeGroupLeader(zonedInCharacter2) - assertFalse(zonedInCharacter1.isGroupLeader()) - assertTrue(zonedInCharacter2.isGroupLeader()) + assertAll( + { assertFalse(zonedInCharacter1.isGroupLeader()) }, + { assertTrue(zonedInCharacter2.isGroupLeader()) }, + ) } @Test @@ -94,8 +68,10 @@ class GroupTest : TestRunnerSimulatedWorld() { zonedInCharacter2.makeGroupLeader(zonedInCharacter2) - assertFalse(zonedInCharacter2.isGroupLeader()) - assertTrue(zonedInCharacter1.isGroupLeader()) + assertAll( + { assertFalse(zonedInCharacter2.isGroupLeader()) }, + { assertTrue(zonedInCharacter1.isGroupLeader()) }, + ) } @Test @@ -111,9 +87,11 @@ class GroupTest : TestRunnerSimulatedWorld() { zonedInCharacter2.leaveCurrentGroup() - assertTrue(zonedInCharacter1.isInGroupWith(zonedInCharacter3)) - assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter2)) - assertFalse(zonedInCharacter3.isInGroupWith(zonedInCharacter2)) + assertAll( + { assertTrue(zonedInCharacter1.isInGroupWith(zonedInCharacter3)) }, + { assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter2)) }, + { assertFalse(zonedInCharacter3.isInGroupWith(zonedInCharacter2)) }, + ) } @Test @@ -129,9 +107,11 @@ class GroupTest : TestRunnerSimulatedWorld() { zonedInCharacter1.kickFromGroup(zonedInCharacter2) - assertTrue(zonedInCharacter1.isInGroupWith(zonedInCharacter3)) - assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter2)) - assertFalse(zonedInCharacter3.isInGroupWith(zonedInCharacter2)) + assertAll( + { assertTrue(zonedInCharacter1.isInGroupWith(zonedInCharacter3)) }, + { assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter2)) }, + { assertFalse(zonedInCharacter3.isInGroupWith(zonedInCharacter2)) }, + ) } @Test @@ -147,14 +127,16 @@ class GroupTest : TestRunnerSimulatedWorld() { zonedInCharacter1.leaveCurrentGroup() - assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter2)) - assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter3)) - assertTrue(zonedInCharacter2.isGroupLeader() || zonedInCharacter3.isGroupLeader(), "one of the remaining members should be the new leader") + assertAll( + { assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter2)) }, + { assertFalse(zonedInCharacter1.isInGroupWith(zonedInCharacter3)) }, + { assertTrue(zonedInCharacter2.isGroupLeader() || zonedInCharacter3.isGroupLeader(), "one of the remaining members should be the new leader") }, + ) } private fun createZonedInCharacter(username: String, characterName: String): ZonedInCharacter { val password = "password" - memoryUserDatabase.addUser(username, password) + addUser(username, password) return HeadlessSWGClient.createZonedInCharacter(username, password, characterName) } diff --git a/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt b/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt index f099b5a62..14439d809 100644 --- a/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt +++ b/src/test/java/com/projectswg/holocore/services/support/CharacterManagementTest.kt @@ -26,34 +26,18 @@ ***********************************************************************************/ package com.projectswg.holocore.services.support -import com.projectswg.holocore.headless.* -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.BeforeEach +import com.projectswg.holocore.headless.HeadlessSWGClient +import com.projectswg.holocore.test.runners.IntegrationTest +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -class CharacterManagementTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() - - @BeforeEach - fun setUp() { - registerService(LoginService(memoryUserDatabase)) - registerService(CharacterCreationService()) - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() - } +class CharacterManagementTest : IntegrationTest() { @Test fun deleteCharacter() { - memoryUserDatabase.addUser("username", "password") + addUser("username", "password") val headlessSWGClient = HeadlessSWGClient("username") val characterSelectionScreen = headlessSWGClient.login("password") val characterId = characterSelectionScreen.createCharacter("firstcharacter") @@ -65,7 +49,7 @@ class CharacterManagementTest : TestRunnerSimulatedWorld() { @Test fun characterCreationRateLimit() { - memoryUserDatabase.addUser("username", "password") + addUser("username", "password") val headlessSWGClient = HeadlessSWGClient("username") val characterSelectionScreen = headlessSWGClient.login("password") characterSelectionScreen.createCharacter("firstcharacter") diff --git a/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt b/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt index ec6750b3d..63e5d85a1 100644 --- a/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt +++ b/src/test/java/com/projectswg/holocore/services/support/KillAdminCommandTest.kt @@ -27,58 +27,21 @@ package com.projectswg.holocore.services.support import com.projectswg.common.data.encodables.tangible.Posture -import com.projectswg.common.data.location.Location -import com.projectswg.holocore.headless.* +import com.projectswg.holocore.headless.HeadlessSWGClient +import com.projectswg.holocore.headless.adminKill import com.projectswg.holocore.resources.support.data.server_info.loader.npc.NpcStaticSpawnLoader import com.projectswg.holocore.resources.support.global.player.AccessLevel -import com.projectswg.holocore.resources.support.npc.spawn.NPCCreator -import com.projectswg.holocore.resources.support.npc.spawn.SimpleSpawnInfo -import com.projectswg.holocore.resources.support.npc.spawn.Spawner -import com.projectswg.holocore.resources.support.objects.ObjectCreator -import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureDifficulty -import com.projectswg.holocore.resources.support.objects.swg.custom.AIObject -import com.projectswg.holocore.services.gameplay.combat.CombatDeathblowService -import com.projectswg.holocore.services.gameplay.combat.CombatExperienceService -import com.projectswg.holocore.services.gameplay.player.experience.ExperiencePointService -import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService -import com.projectswg.holocore.services.support.global.commands.CommandExecutionService -import com.projectswg.holocore.services.support.global.commands.CommandQueueService -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.services.support.global.zone.ZoneService -import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach +import com.projectswg.holocore.test.runners.IntegrationTest import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -class KillAdminCommandTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() - - @BeforeEach - fun setUp() { - registerService(LoginService(memoryUserDatabase)) - registerService(ZoneService()) - registerService(CharacterCreationService()) - registerService(SkillService()) - registerService(CommandQueueService(5)) - registerService(CommandExecutionService()) - registerService(CombatDeathblowService()) - registerService(ExperiencePointService()) - registerService(CombatExperienceService()) - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() - } +class KillAdminCommandTest : IntegrationTest() { @Test fun killNpc() { - memoryUserDatabase.addUser("username", "password", AccessLevel.DEV) + addUser("username", "password", AccessLevel.DEV) val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") - val npc = spawnNPCs("creature_bantha", character.player.creatureObject.location, 1, NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE).first() + val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE) character.adminKill(npc) @@ -87,9 +50,9 @@ class KillAdminCommandTest : TestRunnerSimulatedWorld() { @Test fun killInvulnerableNpc() { - memoryUserDatabase.addUser("username", "password", AccessLevel.DEV) + addUser("username", "password", AccessLevel.DEV) val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") - val npc = spawnNPCs("creature_bantha", character.player.creatureObject.location, 1, NpcStaticSpawnLoader.SpawnerFlag.INVULNERABLE).first() + val npc = spawnNPC("creature_bantha", character.player.creatureObject.location, NpcStaticSpawnLoader.SpawnerFlag.INVULNERABLE) character.adminKill(npc) @@ -101,7 +64,7 @@ class KillAdminCommandTest : TestRunnerSimulatedWorld() { @Test fun killSelf() { - memoryUserDatabase.addUser("username", "password", AccessLevel.DEV) + addUser("username", "password", AccessLevel.DEV) val character = HeadlessSWGClient.createZonedInCharacter("username", "password", "adminchar") character.adminKill(character.player.creatureObject) @@ -109,21 +72,4 @@ class KillAdminCommandTest : TestRunnerSimulatedWorld() { assertNotEquals(Posture.DEAD, character.player.creatureObject) } - private fun spawnNPCs(npcId: String, location: Location, amount: Int, spawnerFlag: NpcStaticSpawnLoader.SpawnerFlag): Collection { - val egg = ObjectCreator.createObjectFromTemplate("object/tangible/ground_spawning/shared_patrol_spawner.iff") - egg.moveToContainer(null, location) - - val spawnInfo = SimpleSpawnInfo.builder() - .withNpcId(npcId) - .withDifficulty(CreatureDifficulty.NORMAL) - .withMinLevel(1) - .withMaxLevel(1) - .withLocation(location) - .withAmount(amount) - .withSpawnerFlag(spawnerFlag) - .build() - - return NPCCreator.createAllNPCs(Spawner(spawnInfo, egg)) - } - } diff --git a/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt b/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt index 24aa64ebe..488d53ecf 100644 --- a/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt +++ b/src/test/java/com/projectswg/holocore/services/support/LoginTest.kt @@ -26,32 +26,20 @@ ***********************************************************************************/ package com.projectswg.holocore.services.support -import com.projectswg.holocore.headless.* -import com.projectswg.holocore.services.support.global.zone.LoginService -import com.projectswg.holocore.test.runners.TestRunnerSimulatedWorld -import org.junit.jupiter.api.AfterEach +import com.projectswg.holocore.headless.AccountBannedException +import com.projectswg.holocore.headless.HeadlessSWGClient +import com.projectswg.holocore.headless.WrongClientVersionException +import com.projectswg.holocore.headless.WrongCredentialsException +import com.projectswg.holocore.test.runners.IntegrationTest import org.junit.jupiter.api.Assertions.assertNotNull -import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -class LoginTest : TestRunnerSimulatedWorld() { - - private val memoryUserDatabase = MemoryUserDatabase() - - @BeforeEach - fun setUp() { - registerService(LoginService(memoryUserDatabase)) - } - - @AfterEach - fun tearDown() { - memoryUserDatabase.clear() - } +class LoginTest : IntegrationTest() { @Test fun validCredentials() { - memoryUserDatabase.addUser("username", "password") + addUser("username", "password") val headlessSWGClient = HeadlessSWGClient("username") val characterSelectionScreen = headlessSWGClient.login("password") @@ -61,7 +49,7 @@ class LoginTest : TestRunnerSimulatedWorld() { @Test fun validCredentialsButBanned() { - memoryUserDatabase.addUser("username", "password", banned = true) + addUser("username", "password", banned = true) val headlessSWGClient = HeadlessSWGClient("username") assertThrows { headlessSWGClient.login("password") } @@ -69,7 +57,7 @@ class LoginTest : TestRunnerSimulatedWorld() { @Test fun wrongUsername() { - memoryUserDatabase.addUser("username", "password") + addUser("username", "password") val headlessSWGClient = HeadlessSWGClient("wrongusername") assertThrows { headlessSWGClient.login("password") } @@ -77,7 +65,7 @@ class LoginTest : TestRunnerSimulatedWorld() { @Test fun wrongPassword() { - memoryUserDatabase.addUser("username", "password") + addUser("username", "password") val headlessSWGClient = HeadlessSWGClient("username") assertThrows { headlessSWGClient.login("wrongpassword") } @@ -85,7 +73,7 @@ class LoginTest : TestRunnerSimulatedWorld() { @Test fun wrongVersion() { - memoryUserDatabase.addUser("username", "password") + addUser("username", "password") val headlessSWGClient = HeadlessSWGClient("username", "20030404-14:00") assertThrows { headlessSWGClient.login("password") } diff --git a/src/test/java/com/projectswg/holocore/test/runners/IntegrationTest.kt b/src/test/java/com/projectswg/holocore/test/runners/IntegrationTest.kt new file mode 100644 index 000000000..e85889c85 --- /dev/null +++ b/src/test/java/com/projectswg/holocore/test/runners/IntegrationTest.kt @@ -0,0 +1,132 @@ +/*********************************************************************************** + * Copyright (c) 2023 /// Project SWG /// www.projectswg.com * + * * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * + * Our goal is to create an emulator which will provide a server for players to * + * continue playing a game similar to the one they used to play. We are basing * + * it on the final publish of the game prior to end-game events. * + * * + * This file is part of Holocore. * + * * + * --------------------------------------------------------------------------------* + * * + * Holocore is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Affero General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * * + * Holocore is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Affero General Public License for more details. * + * * + * You should have received a copy of the GNU Affero General Public License * + * along with Holocore. If not, see . * + ***********************************************************************************/ +package com.projectswg.holocore.test.runners + +import com.projectswg.common.data.location.Location +import com.projectswg.holocore.headless.MemoryUserDatabase +import com.projectswg.holocore.resources.support.data.server_info.loader.ServerData +import com.projectswg.holocore.resources.support.data.server_info.loader.npc.NpcStaticSpawnLoader +import com.projectswg.holocore.resources.support.global.player.AccessLevel +import com.projectswg.holocore.resources.support.npc.spawn.NPCCreator +import com.projectswg.holocore.resources.support.npc.spawn.SimpleSpawnInfo +import com.projectswg.holocore.resources.support.npc.spawn.Spawner +import com.projectswg.holocore.resources.support.objects.ObjectCreator +import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureDifficulty +import com.projectswg.holocore.resources.support.objects.swg.custom.AIObject +import com.projectswg.holocore.services.gameplay.combat.CombatDeathblowService +import com.projectswg.holocore.services.gameplay.combat.CombatExperienceService +import com.projectswg.holocore.services.gameplay.player.character.TippingService +import com.projectswg.holocore.services.gameplay.player.experience.ExperiencePointService +import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService +import com.projectswg.holocore.services.gameplay.player.group.GroupService +import com.projectswg.holocore.services.support.global.chat.ChatMailService +import com.projectswg.holocore.services.support.global.chat.ChatSystemService +import com.projectswg.holocore.services.support.global.commands.CommandExecutionService +import com.projectswg.holocore.services.support.global.commands.CommandQueueService +import com.projectswg.holocore.services.support.global.zone.CharacterLookupService +import com.projectswg.holocore.services.support.global.zone.LoginService +import com.projectswg.holocore.services.support.global.zone.ZoneService +import com.projectswg.holocore.services.support.global.zone.creation.CharacterCreationService +import com.projectswg.holocore.services.support.global.zone.sui.SuiService +import com.projectswg.holocore.services.support.objects.SimulatedObjectStorage +import com.projectswg.holocore.services.support.objects.awareness.AwarenessService +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.BeforeEach + +/** + * Integration test runner that sets up all the services required for a full integration test. + * This includes all the services required for a character to be able to log in and perform actions. + * + * Integrations tests should be using [com.projectswg.holocore.headless.HeadlessSWGClient] to perform actions. + */ +abstract class IntegrationTest : TestRunnerSynchronousIntents() { + + private val memoryUserDatabase = MemoryUserDatabase() + + @BeforeEach + fun setUpServices() { + registerService(CharacterLookupService()) + registerService(SimulatedObjectStorage()) + registerService(AwarenessService()) + registerService(LoginService(memoryUserDatabase)) + registerService(ZoneService()) + registerService(CommandQueueService(5)) + registerService(CommandExecutionService()) + registerService(CharacterCreationService()) + registerService(ExperiencePointService()) + registerService(CombatExperienceService()) + registerService(CombatDeathblowService()) + registerService(SkillService()) + registerService(ChatSystemService()) + registerService(ChatMailService()) + registerService(SuiService()) + registerService(TippingService()) + registerService(GroupService()) + } + + @AfterEach + fun wipeUserDatabase() { + memoryUserDatabase.clear() + } + + companion object { + @JvmStatic + @BeforeAll + fun setUpAll() { + ServerData.terrains // Eagerly load, so even the very first command is fast in the 'swimming' state check + } + } + + fun addUser(username: String, password: String, accessLevel: AccessLevel = AccessLevel.PLAYER, banned: Boolean = false) { + memoryUserDatabase.addUser(username, password, accessLevel, banned) + } + + /** + * Spawns a single NPC at the given location. + * + * @param npcId the ID of the NPC to spawn - e.g. "creature_bantha" + * @param location the location to spawn the NPCs at + * @param spawnerFlag the spawner flag to use - defaults to [NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE] + */ + fun spawnNPC(npcId: String, location: Location, spawnerFlag: NpcStaticSpawnLoader.SpawnerFlag = NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE): AIObject { + val egg = ObjectCreator.createObjectFromTemplate("object/tangible/ground_spawning/shared_patrol_spawner.iff") + egg.moveToContainer(null, location) + + val spawnInfo = SimpleSpawnInfo.builder() + .withNpcId(npcId) + .withDifficulty(CreatureDifficulty.NORMAL) + .withMinLevel(1) + .withMaxLevel(1) + .withLocation(location) + .withAmount(1) + .withSpawnerFlag(spawnerFlag) + .build() + + return NPCCreator.createAllNPCs(Spawner(spawnInfo, egg)).first() + } +}