File size: 2,368 Bytes
8dc7642
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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()