Reduced amount of test setup required to write a new integration test by introducing a new IntegrationTest superclass that encapsulates common steps

This commit is contained in:
Mads Boddum
2023-11-30 10:59:42 +01:00
parent cc080b457e
commit a71ecd749e
8 changed files with 197 additions and 282 deletions
@@ -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
@@ -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<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(amount)
.withSpawnerFlag(NpcStaticSpawnLoader.SpawnerFlag.ATTACKABLE)
.build()
return NPCCreator.createAllNPCs(Spawner(spawnInfo, egg))
}
}
private data class CreditsSnapshot(private val character: ZonedInCharacter) {
@@ -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
@@ -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)
}
@@ -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")
@@ -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<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(amount)
.withSpawnerFlag(spawnerFlag)
.build()
return NPCCreator.createAllNPCs(Spawner(spawnInfo, egg))
}
}
@@ -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<AccountBannedException> { 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<WrongCredentialsException> { 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<WrongCredentialsException> { 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<WrongClientVersionException> { headlessSWGClient.login("password") }
@@ -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 <http://www.gnu.org/licenses/>. *
***********************************************************************************/
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()
}
}