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()