openenv_hack / tests /test_environment.py
thomasm6m6's picture
Initial Freeciv OpenEnv Space
8dc7642 verified
from __future__ import annotations
from freeciv_env.models import FreecivAction
from freeciv_env.server.freeciv_environment import FreecivEnvironment
from tests.fakes import FakeFreecivSession
def make_env() -> FreecivEnvironment:
return FreecivEnvironment(session_factory=FakeFreecivSession, max_turns=5)
def test_reset_exposes_expected_action_surface() -> None:
env = make_env()
obs = env.reset()
assert obs.status == "ready"
assert obs.turn == 1
assert any(action.action_type == "end_turn" for action in obs.legal_actions)
assert any(action.action_type == "move_unit" for action in obs.legal_actions)
assert any(action.action_type == "build_city" for action in obs.legal_actions)
assert any(action.action_type == "set_city_production" for action in obs.legal_actions)
assert any(action.action_type == "set_research" for action in obs.legal_actions)
env.close()
def test_invalid_action_is_penalized_without_advancing_state() -> None:
env = make_env()
env.reset()
obs = env.step(FreecivAction(action_type="move_unit", unit_id=999, direction=7))
assert obs.status == "invalid_action"
assert obs.reward == -0.25
assert obs.turn == 1
assert env.state.turn == 1
env.close()
def test_move_unit_rewards_exploration_progress() -> None:
env = make_env()
env.reset()
obs = env.step(FreecivAction(action_type="move_unit", unit_id=201, direction=0))
assert obs.status == "ok"
assert obs.known_tiles == 5
assert obs.reward > 0.01
assert obs.unit_count == 1
env.close()
def test_build_city_rewards_city_growth() -> None:
env = make_env()
env.reset()
obs = env.step(FreecivAction(action_type="build_city", unit_id=201))
assert obs.city_count == 2
assert obs.unit_count == 0
assert obs.reward >= 0.66
env.close()
def test_set_research_rewards_tech_progress() -> None:
env = make_env()
env.reset()
obs = env.step(FreecivAction(action_type="set_research", target="Pottery"))
assert obs.techs_researched == 1
assert obs.reward >= 0.30
env.close()
def test_end_turn_advances_turn_counter() -> None:
env = make_env()
env.reset()
obs = env.step(FreecivAction(action_type="end_turn"))
assert obs.turn == 2
assert env.state.turn == 2
assert obs.reward > 0.0
env.close()