mirror of
https://github.com/yairm210/Unciv.git
synced 2025-02-03 12:54:43 +07:00
💚 add tests for city population manager (#10347)
This commit is contained in:
parent
b178051bcf
commit
f27fa7bab6
@ -0,0 +1,267 @@
|
|||||||
|
package com.unciv.logic.city.managers
|
||||||
|
|
||||||
|
import com.badlogic.gdx.math.Vector2
|
||||||
|
import com.unciv.Constants
|
||||||
|
import com.unciv.logic.city.City
|
||||||
|
import com.unciv.logic.city.CityFocus
|
||||||
|
import com.unciv.logic.civilization.Civilization
|
||||||
|
import com.unciv.testing.GdxTestRunner
|
||||||
|
import com.unciv.testing.TestGame
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Assert.assertFalse
|
||||||
|
import org.junit.Assert.assertTrue
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@RunWith(GdxTestRunner::class)
|
||||||
|
class CityPopulationManagerTest {
|
||||||
|
|
||||||
|
private lateinit var civ: Civilization
|
||||||
|
|
||||||
|
private lateinit var city: City
|
||||||
|
|
||||||
|
private val testGame = TestGame()
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
testGame.makeHexagonalMap(3)
|
||||||
|
civ = testGame.addCiv()
|
||||||
|
city = testGame.addCity(civ, testGame.getTile(Vector2.Zero), initialPopulation = 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should increase food requirements for next pop`() {
|
||||||
|
// given
|
||||||
|
val biggerCity = testGame.addCity(civ, testGame.getTile(Vector2.X), initialPopulation = 2)
|
||||||
|
|
||||||
|
// when
|
||||||
|
val smallerCityFoodRequirements = city.population.getFoodToNextPopulation()
|
||||||
|
val greaterCityFoodRequirements = biggerCity.population.getFoodToNextPopulation()
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertTrue(smallerCityFoodRequirements < greaterCityFoodRequirements)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should change food requirements for different gamespeeds`() {
|
||||||
|
// given
|
||||||
|
val quickSpeedGame = TestGame()
|
||||||
|
quickSpeedGame.gameInfo.speed = quickSpeedGame.ruleset.speeds["Quick"]!!
|
||||||
|
val quickSpeedCity = quickSpeedGame.addCity(quickSpeedGame.addCiv(), quickSpeedGame.getTile(Vector2.Zero), initialPopulation = 1)
|
||||||
|
|
||||||
|
val epicSpeedGame = TestGame()
|
||||||
|
epicSpeedGame.gameInfo.speed = epicSpeedGame.ruleset.speeds["Epic"]!!
|
||||||
|
val epicSpeedCity = epicSpeedGame.addCity(epicSpeedGame.addCiv(), epicSpeedGame.getTile(Vector2.Zero), initialPopulation = 1)
|
||||||
|
|
||||||
|
// when
|
||||||
|
val quickFoodRequirements = quickSpeedCity.population.getFoodToNextPopulation()
|
||||||
|
val standardCityFoodRequirements = city.population.getFoodToNextPopulation()
|
||||||
|
val epicCityFoodRequirements = epicSpeedCity.population.getFoodToNextPopulation()
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertTrue(quickFoodRequirements < standardCityFoodRequirements)
|
||||||
|
assertTrue(standardCityFoodRequirements < epicCityFoodRequirements)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should increase food requirements for city states`() {
|
||||||
|
// given
|
||||||
|
val cityState = testGame.addCiv(cityStateType = "Militaristic")
|
||||||
|
val cityStateCity = testGame.addCity(cityState, testGame.getTile(Vector2.X), initialPopulation = 1)
|
||||||
|
|
||||||
|
// when
|
||||||
|
val cityFoodRequirements = city.population.getFoodToNextPopulation()
|
||||||
|
val cityStateCityFoodRequirements = cityStateCity.population.getFoodToNextPopulation()
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertTrue(cityFoodRequirements < cityStateCityFoodRequirements)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should increase food requirements for AI on easier difficulties`() {
|
||||||
|
// given
|
||||||
|
val easierDifficultyGame = TestGame()
|
||||||
|
easierDifficultyGame.gameInfo.difficulty = "Chieftain"
|
||||||
|
easierDifficultyGame.gameInfo.difficultyObject = easierDifficultyGame.ruleset.difficulties["Chieftain"]!!
|
||||||
|
val easierCity = easierDifficultyGame.addCity(easierDifficultyGame.addCiv(), easierDifficultyGame.getTile(Vector2.Zero), initialPopulation = 1)
|
||||||
|
|
||||||
|
// when
|
||||||
|
val cityFoodRequirements = city.population.getFoodToNextPopulation()
|
||||||
|
val easierCityFoodRequirements = easierCity.population.getFoodToNextPopulation()
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertTrue(easierCityFoodRequirements > cityFoodRequirements)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should decrease food requirements for AI on higher difficulties`() {
|
||||||
|
// given
|
||||||
|
val harderDifficultyGame = TestGame()
|
||||||
|
harderDifficultyGame.gameInfo.difficulty = "Deity"
|
||||||
|
harderDifficultyGame.gameInfo.difficultyObject = harderDifficultyGame.ruleset.difficulties["Deity"]!!
|
||||||
|
val harderCity = harderDifficultyGame.addCity(harderDifficultyGame.addCiv(), harderDifficultyGame.getTile(Vector2.Zero), initialPopulation = 1)
|
||||||
|
|
||||||
|
// when
|
||||||
|
val cityFoodRequirements = city.population.getFoodToNextPopulation()
|
||||||
|
val harderCityFoodRequirements = harderCity.population.getFoodToNextPopulation()
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertTrue(harderCityFoodRequirements < cityFoodRequirements)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should remove one pop when on starvation and no food reserves`() {
|
||||||
|
// given
|
||||||
|
city.population.setPopulation(2)
|
||||||
|
city.population.foodStored = 0
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(-1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(1, city.population.population)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should not remove one pop when on starvation but with enough food reserves`() {
|
||||||
|
// given
|
||||||
|
city.population.setPopulation(2)
|
||||||
|
city.population.foodStored = 5
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(-1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should not remove one pop when on starvation but with 1 pop`() {
|
||||||
|
// given
|
||||||
|
city.population.foodStored = 0
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(-1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(1, city.population.population)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should increase pop when enough food is stored`() {
|
||||||
|
// given
|
||||||
|
city.population.foodStored = 14
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertEquals(0, city.population.foodStored)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should carry over excess food when new pop is born`() {
|
||||||
|
// given
|
||||||
|
city.population.foodStored = 14
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(4)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertEquals(3, city.population.foodStored)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should start with food stored when new pop is born and uniques`() {
|
||||||
|
// given
|
||||||
|
val building = testGame.createBuilding("[50]% Food is carried over after population increases [in this city]")
|
||||||
|
city.cityConstructions.addBuilding(building)
|
||||||
|
city.population.foodStored = 14
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertEquals(7, city.population.foodStored)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should automatically assing new pop to job`() {
|
||||||
|
// given
|
||||||
|
city.population.foodStored = 14
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertEquals(0, city.population.getFreePopulation())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should automatically assing new pop to best job`() {
|
||||||
|
// given
|
||||||
|
city.lockedTiles.add(Vector2(-1f, 0f)) // force the first pop to work on a specific tile to avoid being reassigned
|
||||||
|
val goodTile = testGame.setTileTerrain(Vector2.X, Constants.grassland)
|
||||||
|
goodTile.improvement = "Farm"
|
||||||
|
assertFalse(city.workedTiles.contains(goodTile.position))
|
||||||
|
|
||||||
|
city.population.foodStored = 14
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertTrue(city.workedTiles.contains(goodTile.position))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should automatically assing new pop to best job according to city focus`() {
|
||||||
|
// given
|
||||||
|
city.cityAIFocus = CityFocus.GoldFocus
|
||||||
|
city.lockedTiles.add(Vector2(-1f, 0f)) // force the first pop to work on a specific tile to avoid being reassigned
|
||||||
|
val goodFoodTile = testGame.setTileTerrain(Vector2.X, Constants.grassland)
|
||||||
|
goodFoodTile.improvement = "Farm"
|
||||||
|
assertFalse(city.workedTiles.contains(goodFoodTile.position))
|
||||||
|
|
||||||
|
val goodGoldTile = testGame.setTileTerrain(Vector2.Y, Constants.grassland)
|
||||||
|
val goldImprovement = testGame.createTileImprovement("[+5 Gold]")
|
||||||
|
goodGoldTile.improvement = goldImprovement.name
|
||||||
|
assertFalse(city.workedTiles.contains(goodGoldTile.position))
|
||||||
|
|
||||||
|
city.population.foodStored = 14
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertTrue(city.workedTiles.contains(goodGoldTile.position))
|
||||||
|
assertFalse(city.workedTiles.contains(goodFoodTile.position))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `should automatically assing new pop to best job with specialists`() {
|
||||||
|
// given
|
||||||
|
city.cityAIFocus = CityFocus.GoldFocus
|
||||||
|
city.lockedTiles.add(Vector2(-1f, 0f)) // force the first pop to work on a specific tile to avoid being reassigned
|
||||||
|
val specialistBuilding = testGame.createBuilding()
|
||||||
|
specialistBuilding.specialistSlots.add("Merchant", 1)
|
||||||
|
city.cityConstructions.addBuilding(specialistBuilding)
|
||||||
|
|
||||||
|
city.population.foodStored = 14
|
||||||
|
assertTrue(city.population.specialistAllocations.isEmpty())
|
||||||
|
|
||||||
|
// when
|
||||||
|
city.population.nextTurn(1)
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertEquals(2, city.population.population)
|
||||||
|
assertTrue(city.population.specialistAllocations.containsKey("Merchant"))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user