Added a few more unit tests for global uniques (#6018)

This commit is contained in:
Xander Lenstra 2022-01-23 15:18:15 +01:00 committed by GitHub
parent f9c05997dd
commit 6a8f88f202
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 135 additions and 15 deletions

View File

@ -92,7 +92,7 @@ class PopulationManager {
cityInfo.religion.updatePressureOnPopulationChange(changedAmount)
}
internal fun setPopulation(count: Int) {
fun setPopulation(count: Int) {
addPopulation(-population + count)
}

View File

@ -7,6 +7,7 @@ import com.unciv.UncivGame
import com.unciv.logic.GameInfo
import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.TileMap
import com.unciv.models.metadata.GameSettings
@ -14,6 +15,7 @@ import com.unciv.models.ruleset.*
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.stats.Stats
import com.unciv.testing.GdxTestRunner
import com.unciv.ui.worldscreen.unit.UnitActions
import org.junit.Assert
import org.junit.Before
import org.junit.Test
@ -23,7 +25,6 @@ import org.junit.runner.RunWith
class GlobalUniquesTests {
private var ruleSet = Ruleset()
// private var unit = MapUnit()
private var gameInfo = GameInfo()
private var tileMap = TileMap()
@ -48,18 +49,21 @@ class GlobalUniquesTests {
gameInfo.tileMap = tileMap
}
private fun addTile(terrain: String, position: Vector2 = Vector2.Zero): TileInfo {
private fun addTile(terrain: String, position: Vector2 = Vector2.Zero, features: List<String> = listOf()): TileInfo {
val tile = TileInfo()
tile.ruleset = ruleSet
tile.baseTerrain = terrain
for (feature in features) {
tile.terrainFeatures.add(feature)
}
tile.tileMap = tileMap
tile.position = position
tile.setTransients()
while (tileMap.tileMatrix.size < position.y + 1)
tileMap.tileMatrix.add(ArrayList<TileInfo?>())
while (tileMap.tileMatrix[position.y.toInt()].size < position.x + 1)
tileMap.tileMatrix[position.y.toInt()].add(null)
tileMap.tileMatrix[position.y.toInt()][position.x.toInt()] = tile
while (tileMap.tileMatrix.size < position.x + 1)
tileMap.tileMatrix.add(ArrayList())
while (tileMap.tileMatrix[position.x.toInt()].size < position.y + 1)
tileMap.tileMatrix[position.x.toInt()].add(null)
tileMap.tileMatrix[position.x.toInt()][position.y.toInt()] = tile
return tile
}
@ -85,32 +89,43 @@ class GlobalUniquesTests {
if (replacePalace && civInfo.cities.size == 1) {
// Add a capital indicator without any other stats
val palaceWithoutStats = Building()
palaceWithoutStats.name = "PalaceWithoutStats"
palaceWithoutStats.uniques.add("Indicates the capital city")
ruleSet.buildings[palaceWithoutStats.name] = palaceWithoutStats
val palaceWithoutStats = createBuildingWithUnique("Indicates the capital city")
cityInfo.cityConstructions.removeBuilding("Palace")
cityInfo.cityConstructions.addBuilding(palaceWithoutStats.name)
}
return cityInfo
}
private fun addUnit(name: String, civInfo: CivilizationInfo, tile: TileInfo): MapUnit {
val baseUnit = ruleSet.units[name]!!
baseUnit.ruleset = ruleSet
val mapUnit = baseUnit.getMapUnit(civInfo)
mapUnit.putInTile(tile)
return mapUnit
}
private fun addEmptySpecialist(): String {
val name = "specialist-${objectsCreated}"
++objectsCreated
objectsCreated++
ruleSet.specialists[name] = Specialist()
return name
}
private fun createBuildingWithUnique(unique: String): Building {
return createBuildingWithUniques(arrayListOf(unique))
}
private fun createBuildingWithUniques(uniques: ArrayList<String> = arrayListOf()): Building {
val building = Building()
building.uniques = arrayListOf(unique)
building.uniques = uniques
building.name = "Building-${objectsCreated}"
objectsCreated++
ruleSet.buildings[building.name] = building
return building
}
@Test
/** tests [UniqueType.Stats] */
fun stats() {
@ -162,7 +177,112 @@ class GlobalUniquesTests {
cityInfo.cityConstructions.addBuilding(building.name)
cityInfo.cityStats.update()
println(cityInfo.cityStats.finalStatList)
Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.gold == 6f)
}
@Test
fun statsPerXPopulation() {
val civInfo = addCiv()
val tile = addTile(Constants.desert)
val cityInfo = addCity(civInfo, tile, true)
val building = createBuildingWithUnique("[+3 Gold] in cities with [3] or more population")
cityInfo.population.addPopulation(2)
cityInfo.cityConstructions.addBuilding(building.name)
cityInfo.cityStats.update()
Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.gold == 0f)
cityInfo.population.setPopulation(5)
cityInfo.cityStats.update()
Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.gold == 3f)
}
@Test
fun statsFromCitiesOnSpecificTiles() {
val civInfo = addCiv()
val tile = addTile(Constants.desert)
val cityInfo = addCity(civInfo, tile, true)
val building = createBuildingWithUnique("[+3 Gold] in cities on [${Constants.desert}] tiles")
cityInfo.cityConstructions.addBuilding(building.name)
cityInfo.cityStats.update()
Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.gold == 3f)
tile.baseTerrain = Constants.grassland
cityInfo.cityStats.update()
Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.gold == 0f)
}
@Test
fun statsSpendingGreatPeople() {
val civInfo = addCiv()
val tile = addTile(Constants.desert)
val cityInfo = addCity(civInfo, tile, true)
val unit = addUnit("Great Prophet", civInfo, tile)
val building = createBuildingWithUnique("[+250 Gold] whenever a Great Person is expended")
cityInfo.cityConstructions.addBuilding(building.name)
civInfo.addGold(-civInfo.gold)
UnitActions.getFoundReligionAction(unit)()
Assert.assertTrue(civInfo.gold == 250)
}
@Test
fun statsFromTiles() {
val civInfo = addCiv()
val tile = addTile(Constants.desert)
val cityInfo = addCity(civInfo, tile, true)
val building = createBuildingWithUnique("[+4 Gold] from [${Constants.grassland}] tiles [in all cities]")
cityInfo.cityConstructions.addBuilding(building.name)
val tile2 = addTile(Constants.grassland, Vector2(0f,1f))
Assert.assertTrue(tile2.getTileStats(cityInfo, civInfo).gold == 4f)
}
@Test
fun statsFromTilesWithout() {
val civInfo = addCiv()
val tile = addTile(Constants.desert)
val cityInfo = addCity(civInfo, tile, true)
val building = createBuildingWithUnique("[+4 Gold] from [${Constants.grassland}] tiles without [${Constants.forest}] [in all cities]")
cityInfo.cityConstructions.addBuilding(building.name)
val tile2 = addTile(Constants.grassland, Vector2(0f,1f))
Assert.assertTrue(tile2.getTileStats(cityInfo, civInfo).gold == 4f)
val tile3 = addTile(Constants.grassland, Vector2(0f, 2f), listOf(Constants.forest))
Assert.assertFalse(tile3.getTileStats(cityInfo, civInfo).gold == 4f)
}
@Test
fun statsFromObject() {
val civInfo = addCiv()
val tile = addTile(Constants.desert)
val cityInfo = addCity(civInfo, tile, true)
val specialist = addEmptySpecialist()
val building = createBuildingWithUnique("[+3 Faith] from every [${specialist}]")
cityInfo.cityConstructions.addBuilding(building.name)
cityInfo.population.addPopulation(2)
cityInfo.population.specialistAllocations[specialist] = 2
cityInfo.cityStats.update()
Assert.assertTrue(cityInfo.cityStats.finalStatList["Specialists"]!!.faith == 6f)
cityInfo.cityConstructions.removeBuilding(building.name)
val building2 = createBuildingWithUnique("[+3 Faith] from every [${Constants.grassland}]")
cityInfo.cityConstructions.addBuilding(building2.name)
val tile2 = addTile(Constants.grassland, Vector2(1f, 0f))
Assert.assertTrue(tile2.getTileStats(cityInfo, civInfo).faith == 3f)
cityInfo.cityConstructions.removeBuilding(building2.name)
val emptyBuilding = createBuildingWithUniques()
val building3 = createBuildingWithUnique("[+3 Faith] from every [${emptyBuilding.name}]")
cityInfo.cityConstructions.addBuilding(emptyBuilding.name)
cityInfo.cityConstructions.addBuilding(building3.name)
cityInfo.cityStats.update()
Assert.assertTrue(cityInfo.cityStats.finalStatList["Buildings"]!!.faith == 3f)
}
}