chore: Modernized TileImprovementConstructionTests

This commit is contained in:
Yair Morgenstern
2023-07-03 23:43:03 +03:00
parent 537ebdcbdd
commit 86cde678b3
3 changed files with 43 additions and 276 deletions

View File

@ -126,7 +126,8 @@ class TileInfoImprovementFunctions(val tile: Tile) {
// Can't build if the improvement specifically prevents building on some present feature
improvement.getMatchingUniques(UniqueType.CannotBuildOnTile, stateForConditionals).any {
unique -> tile.matchesTerrainFilter(unique.params[0])
} -> false
} ->
false
// Can't build if an improvement is only allowed to be built on specific tiles and this is not one of them
// If multiple uniques of this type exists, we want all to match (e.g. Hill _and_ Forest would be meaningful)

View File

@ -1,17 +1,12 @@
// Taken from https://github.com/TomGrill/gdx-testing
package com.unciv.logic.map
import com.badlogic.gdx.math.Vector2
import com.unciv.logic.city.City
import com.unciv.logic.civilization.Civilization
import com.unciv.logic.map.tile.Tile
import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.RulesetCache
import com.unciv.models.ruleset.nation.Nation
import com.unciv.models.ruleset.tile.TerrainType
import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.testing.GdxTestRunner
import com.unciv.uniques.TestGame
import org.junit.Assert
import org.junit.Before
import org.junit.Test
@ -20,50 +15,46 @@ import org.junit.runner.RunWith
@RunWith(GdxTestRunner::class)
class TileImprovementConstructionTests {
private var civInfo = Civilization()
private var city = City()
private var ruleSet = Ruleset()
private val tileMap = TileMap()
private lateinit var civInfo: Civilization
private lateinit var tileMap: TileMap
val testGame = TestGame()
private fun getTile() = Tile().apply {
baseTerrain = "Plains"
ruleset = ruleSet
position = Vector2(1f, 1f) // so that it's not on the same position as the city
setOwningCity(city)
this@apply.tileMap = this@TileImprovementConstructionTests.tileMap
}
@Before
fun initTheWorld() {
RulesetCache.loadRulesets(noMods = true)
ruleSet = RulesetCache.getVanillaRuleset()
civInfo.tech.researchedTechnologies.addAll(ruleSet.technologies.values)
civInfo.tech.techsResearched.addAll(ruleSet.technologies.keys)
civInfo.nation = Nation()
city.civ = civInfo
testGame.makeHexagonalMap(3)
tileMap = testGame.tileMap
civInfo = testGame.addCiv()
civInfo.tech.researchedTechnologies.addAll(testGame.ruleset.technologies.values)
civInfo.tech.techsResearched.addAll(testGame.ruleset.technologies.keys)
testGame.addCity(civInfo, tileMap[0,0])
}
@Test
fun allTerrainSpecificImprovementsCanBeBuilt() {
for (improvement in ruleSet.tileImprovements.values) {
for (improvement in testGame.ruleset.tileImprovements.values) {
var terrain = improvement.terrainsCanBeBuiltOn.firstOrNull() ?: continue
if (terrain == "Land") terrain = ruleSet.terrains.values.first { it.type == TerrainType.Land }.name
if (terrain == "Water") terrain = ruleSet.terrains.values.first { it.type == TerrainType.Water }.name
if (terrain == "Land") terrain = testGame.ruleset.terrains.values.first { it.type == TerrainType.Land }.name
if (terrain == "Water") terrain = testGame.ruleset.terrains.values.first { it.type == TerrainType.Water }.name
// If this improvement requires additional conditions to be true,
// its too complex to handle all of them, so just skip it and hope its fine
// I would like some comments on whether this approach is fine or if it's better if I handle every single unique here as well
if (improvement.hasUnique(UniqueType.CanOnlyBeBuiltOnTile, StateForConditionals.IgnoreConditionals)) continue
if (improvement.hasUnique(UniqueType.Unbuildable, StateForConditionals.IgnoreConditionals)) continue
val tile = getTile()
val tile = tileMap[1,1]
tile.baseTerrain = terrain
tile.resource = null
if (improvement.hasUnique(UniqueType.CanOnlyImproveResource, StateForConditionals.IgnoreConditionals)) {
tile.resource = ruleSet.tileResources.values.firstOrNull { it.isImprovedBy(improvement.name) }?.name ?: continue
tile.resource = testGame.ruleset.tileResources.values.firstOrNull { it.isImprovedBy(improvement.name) }?.name ?: continue
}
tile.setTransients()
if (improvement.uniqueTo != null) civInfo.civName = improvement.uniqueTo!!
if (improvement.uniqueTo != null){
civInfo.civName = improvement.uniqueTo!!
}
val canBeBuilt = tile.improvementFunctions.canBuildImprovement(improvement, civInfo)
Assert.assertTrue(improvement.name, canBeBuilt)
@ -72,9 +63,10 @@ class TileImprovementConstructionTests {
@Test
fun allResourceImprovementsCanBeBuilt() {
for (improvement in ruleSet.tileImprovements.values) {
val tile = getTile()
tile.resource = ruleSet.tileResources.values
for (improvement in testGame.ruleset.tileImprovements.values) {
val tile = tileMap[1,1]
tile.resource = testGame.ruleset.tileResources.values
.firstOrNull { it.isImprovedBy(improvement.name) }?.name
if (tile.resource == null) continue
// If this improvement requires additional conditions to be true,
@ -89,31 +81,25 @@ class TileImprovementConstructionTests {
@Test
fun coastalImprovementsCanBeBuilt() {
val map = TileMap()
val tile = getTile()
tile.tileMap = map
tile.setTransients()
val coastTile = tileMap[1,2]
coastTile.baseTerrain = "Coast"
coastTile.setTransients()
val otherTile = tile.clone()
otherTile.baseTerrain = "Coast"
otherTile.position.y = 1f
val coastalTile = tileMap[1,1]
map.tileMatrix.add(arrayListOf(tile, otherTile))
for (improvement in ruleSet.tileImprovements.values) {
for (improvement in testGame.ruleset.tileImprovements.values) {
if (!improvement.uniques.contains("Can only be built on [Coastal] tiles")) continue
civInfo.civName = improvement.uniqueTo ?: "OtherCiv"
val canBeBuilt = tile.improvementFunctions.canBuildImprovement(improvement, civInfo)
val canBeBuilt = coastalTile.improvementFunctions.canBuildImprovement(improvement, civInfo)
Assert.assertTrue(improvement.name, canBeBuilt)
}
}
@Test
fun coastalImprovementsCanNOTBeBuiltInland() {
val tile = getTile()
tile.setTransients()
val tile = tileMap[1,1]
for (improvement in ruleSet.tileImprovements.values) {
for (improvement in testGame.ruleset.tileImprovements.values) {
if (!improvement.uniques.contains("Can only be built on [Coastal] tiles")) continue
civInfo.civName = improvement.uniqueTo ?: "OtherCiv"
val canBeBuilt = tile.improvementFunctions.canBuildImprovement(improvement, civInfo)
@ -123,11 +109,10 @@ class TileImprovementConstructionTests {
@Test
fun uniqueToOtherImprovementsCanNOTBeBuilt() {
for (improvement in ruleSet.tileImprovements.values) {
for (improvement in testGame.ruleset.tileImprovements.values) {
if (improvement.uniqueTo == null) continue
civInfo.civName = "OtherCiv"
val tile = getTile()
tile.setTransients()
val tile = tileMap[1,1]
val canBeBuilt = tile.improvementFunctions.canBuildImprovement(improvement, civInfo)
Assert.assertFalse(improvement.name, canBeBuilt)
}
@ -135,16 +120,14 @@ class TileImprovementConstructionTests {
@Test
fun improvementsCanNOTBeBuiltOnWrongResource() {
civInfo.civName = "OtherCiv"
for (resource in ruleSet.tileResources.values) {
for (resource in testGame.ruleset.tileResources.values) {
if (resource.getImprovements().isEmpty()) continue
val improvement = ruleSet.tileImprovements[resource.getImprovements().first()]!!
val improvement = testGame.ruleset.tileImprovements[resource.getImprovements().first()]!!
if (!improvement.hasUnique(UniqueType.CanOnlyImproveResource)) continue
val wrongResource = ruleSet.tileResources.values.firstOrNull {
val wrongResource = testGame.ruleset.tileResources.values.firstOrNull {
it != resource && !it.isImprovedBy(improvement.name)
} ?: continue
val tile = getTile()
val tile = tileMap[1,1]
tile.baseTerrain = "Plains"
tile.resource = wrongResource.name
tile.setTransients()
@ -155,13 +138,13 @@ class TileImprovementConstructionTests {
@Test
fun terraceFarmCanNOTBeBuiltOnBonus() {
val tile = getTile()
val tile = tileMap[1,1]
tile.resource = "Sheep"
tile.setTransients()
tile.addTerrainFeature("Hill")
civInfo.civName = "Inca"
for (improvement in ruleSet.tileImprovements.values) {
for (improvement in testGame.ruleset.tileImprovements.values) {
if (!improvement.uniques.contains("Cannot be built on [Bonus resource] tiles")) continue
val canBeBuilt = tile.improvementFunctions.canBuildImprovement(improvement, civInfo)
Assert.assertFalse(improvement.name, canBeBuilt)

View File

@ -1,217 +0,0 @@
package com.unciv.logic.map
import com.badlogic.gdx.math.Vector2
import com.unciv.Constants
import com.unciv.logic.map.tile.Tile
import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.RulesetCache
import com.unciv.testing.GdxTestRunner
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(GdxTestRunner::class)
class TileMapTests {
private var map = TileMap()
private var tile1 = Tile()
private var tile2 = Tile()
private var tile3 = Tile()
private var ruleSet = Ruleset()
@Before
fun initTheWorld() {
RulesetCache.loadRulesets(noMods = true)
ruleSet = RulesetCache.getVanillaRuleset()
map = TileMap()
tile1.position = Vector2(0f, 0f)
tile1.tileMap = map
tile1.ruleset = ruleSet
tile2.position = Vector2(0f, 1f)
tile2.tileMap = map
tile2.ruleset = ruleSet
tile3.position = Vector2(0f, 2f)
tile3.tileMap = map
tile3.ruleset = ruleSet
map.tileMatrix.add(arrayListOf(tile1, tile2, tile3))
}
@Test
fun canSeeOnFlatGround() {
tile1.baseTerrain = Constants.grassland
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.desert
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.snow
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canSeeOnFlatWater() {
tile1.baseTerrain = Constants.ocean
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.coast
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.ocean
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canSeeFromHills() {
tile1.baseTerrain = Constants.hill
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.grassland
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.coast
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canSeeOverForestFromHills() {
tile1.baseTerrain = Constants.hill
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.grassland
tile2.setTerrainTransients()
tile2.setTerrainFeatures(listOf(Constants.forest))
tile3.baseTerrain = Constants.coast
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canSeeMountainOverHills() {
tile1.baseTerrain = Constants.grassland
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.hill
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.mountain
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canSeeMountainFromForestOverHills() {
tile1.baseTerrain = Constants.grassland
tile1.setTerrainTransients()
tile1.setTerrainFeatures(listOf(Constants.forest))
tile2.baseTerrain = Constants.hill
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.mountain
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canSeeHillsFromHills() {
tile1.baseTerrain = Constants.hill
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.grassland
tile1.setTerrainFeatures(listOf(Constants.forest))
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.hill
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
@Test
fun canNOTSeeGrassOverHills() {
tile1.baseTerrain = Constants.grassland
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.hill
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.grassland
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertFalse(tile3 in visibleTiles)
}
@Test
fun canNOTSeeHillsOverHills() {
tile1.baseTerrain = Constants.grassland
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.hill
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.hill
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertFalse(tile3 in visibleTiles)
}
@Test
fun canNOTSeeOutThroughForest() {
tile1.baseTerrain = Constants.grassland
tile1.setTerrainTransients()
tile1.setTerrainFeatures(listOf(Constants.forest))
tile2.baseTerrain = Constants.grassland
tile2.setTerrainTransients()
tile2.setTerrainFeatures(listOf(Constants.forest))
tile3.baseTerrain = Constants.grassland
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertFalse(tile3 in visibleTiles)
}
@Test
fun canNOTSeeWaterOverJungle() {
tile1.baseTerrain = Constants.coast
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.grassland
tile2.setTerrainTransients()
tile2.setTerrainFeatures(listOf(Constants.forest))
tile3.baseTerrain = Constants.coast
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertFalse(tile3 in visibleTiles)
}
@Test
fun canSeeWaterOverFlatLand() {
tile1.baseTerrain = Constants.coast
tile1.setTerrainTransients()
tile2.baseTerrain = Constants.grassland
tile2.setTerrainTransients()
tile3.baseTerrain = Constants.coast
tile3.setTerrainTransients()
val visibleTiles = map.getViewableTiles(tile1.position,2)
Assert.assertTrue(tile2 in visibleTiles)
Assert.assertTrue(tile3 in visibleTiles)
}
}