File size: 1,525 Bytes
19abe39
e9b7141
19abe39
 
 
e9b7141
 
19abe39
 
 
 
e9b7141
19abe39
 
 
e9b7141
19abe39
 
 
e9b7141
 
 
19abe39
 
 
 
 
 
 
 
e9b7141
 
 
 
 
 
 
 
 
19abe39
 
e9b7141
 
 
19abe39
e9b7141
 
 
 
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
from openenv_runtime.environment import OpenEnvOrigamiEnvironment
from openenv_runtime.models import OrigamiAction, OrigamiObservation


def test_openenv_reset_returns_observation():
    env = OpenEnvOrigamiEnvironment(mode="step", max_steps=8)
    obs = env.reset(target_name="half_horizontal")

    assert isinstance(obs, OrigamiObservation)
    assert obs.done is False
    assert obs.target_name == "half_horizontal"
    assert hasattr(obs, "prompt") and obs.prompt


def test_openenv_step_single_fold_completes_simple_target():
    env = OpenEnvOrigamiEnvironment(mode="step", max_steps=8)
    env.reset(target_name="half_horizontal")

    action = OrigamiAction(
        from_point=[0.0, 0.5],
        to_point=[1.0, 0.5],
        assignment="V",
    )
    obs = env.step(action)

    assert obs.reward is not None
    assert obs.reward > 1.0
    assert obs.done is True


def test_openenv_action_alias_from_to():
    """Client can send 'from' and 'to' (JSON-friendly) instead of from_point/to_point."""
    action = OrigamiAction.model_validate({
        "from": [0.0, 0.5],
        "to": [1.0, 0.5],
        "assignment": "V",
    })
    assert action.from_point == [0.0, 0.5]
    assert action.to_point == [1.0, 0.5]


def test_openenv_state_contains_target_and_step():
    env = OpenEnvOrigamiEnvironment(mode="step", max_steps=8)
    env.reset(target_name="half_horizontal")

    state = env.state()
    assert "paper" in state
    assert state.get("target") == "half_horizontal"
    assert state.get("step") == 0