| | """ |
| | test_TaskGoal.py |
| | |
| | Coverage tests for all env_id branches in task_goal.get_language_goal. |
| | Run with: uv run python -m pytest tests/lightweight/test_TaskGoal.py -s |
| | """ |
| | from pathlib import Path |
| | import importlib.util |
| | import types |
| |
|
| | from tests._shared.repo_paths import find_repo_root |
| |
|
| |
|
| | def _load_task_goal_module(): |
| | repo_root = find_repo_root(__file__) |
| | module_path = repo_root / "src" / "robomme" / "robomme_env" / "utils" / "task_goal.py" |
| | spec = importlib.util.spec_from_file_location("task_goal_under_test", module_path) |
| | module = importlib.util.module_from_spec(spec) |
| | spec.loader.exec_module(module) |
| | return module |
| |
|
| |
|
| | mod = _load_task_goal_module() |
| | get_language_goal = mod.get_language_goal |
| |
|
| |
|
| | class _Unwrapped: |
| | """Mock env.unwrapped; arbitrary attributes can be set as needed.""" |
| | def __init__(self, **kwargs): |
| | for k, v in kwargs.items(): |
| | setattr(self, k, v) |
| |
|
| |
|
| | class _Env: |
| | def __init__(self, unwrapped): |
| | self.unwrapped = unwrapped |
| |
|
| |
|
| | class _Self: |
| | """Mock self object for called methods.""" |
| | def __init__(self, env, **kwargs): |
| | self.env = env |
| | for k, v in kwargs.items(): |
| | setattr(self, k, v) |
| |
|
| |
|
| | def _make_self(unwrapped_attrs=None, **self_attrs): |
| | unwrapped = _Unwrapped(**(unwrapped_attrs or {})) |
| | env = _Env(unwrapped) |
| | return _Self(env, **self_attrs) |
| |
|
| |
|
| | def _call(env_id, mock_self): |
| | result = get_language_goal(mock_self, env_id) |
| | print() |
| | for idx, goal in enumerate(result, start=1): |
| | print(f"[{env_id}] goal{idx}: {goal}") |
| | return result |
| |
|
| |
|
| | def test_unknown_env_returns_single_goal_when_equal(): |
| | """Unknown env_id goes to the default empty-string branch; when two goals are equal it returns a single-element list.""" |
| | s = _make_self() |
| | result = _call("UnknownEnv", s) |
| | assert result == [""] |
| |
|
| |
|
| | def test_movecube_still_returns_two_goals(): |
| | """For defined branches with different texts, still return a two-element list.""" |
| | s = _make_self() |
| | result = _call("MoveCube", s) |
| | assert len(result) == 2 |
| |
|
| |
|
| |
|
| | def test_binfill_one_color(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict( |
| | red_cubes_target_number=3, |
| | blue_cubes_target_number=0, |
| | green_cubes_target_number=0, |
| | )) |
| | result = _call("BinFill", s) |
| | assert "three red cubes" in result[0] |
| | assert " and " not in result[0] |
| | assert "three red cubes" in result[1] |
| |
|
| |
|
| | def test_binfill_two_colors(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict( |
| | red_cubes_target_number=1, |
| | blue_cubes_target_number=2, |
| | green_cubes_target_number=0, |
| | )) |
| | result = _call("BinFill", s) |
| | assert "one red cube" in result[0] |
| | assert "two blue cubes" in result[0] |
| | assert " and " in result[0] |
| | assert "one red cube" in result[1] |
| | assert "two blue cubes" in result[1] |
| |
|
| |
|
| | def test_binfill_three_colors(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict( |
| | red_cubes_target_number=2, |
| | blue_cubes_target_number=3, |
| | green_cubes_target_number=1, |
| | )) |
| | result = _call("BinFill", s) |
| | assert "two red cubes" in result[0] |
| | assert "three blue cubes" in result[0] |
| | assert "one green cube" in result[0] |
| | assert "two red cubes" in result[1] |
| | assert "three blue cubes" in result[1] |
| | assert "one green cube" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_pickxtimes_once(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict(num_repeats=1, target_color_name="red")) |
| | result = _call("PickXtimes", s) |
| | assert "repeating" not in result[0] |
| | assert "red cube" in result[0] |
| | if len(result) > 1: |
| | assert "repeating" not in result[1] |
| | assert "red cube" in result[1] |
| |
|
| |
|
| | def test_pickxtimes_multiple(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict(num_repeats=3, target_color_name="blue")) |
| | result = _call("PickXtimes", s) |
| | assert "repeating this action three times" in result[0] |
| | assert "blue cube" in result[0] |
| | assert "pick-and-place action three times" in result[1] |
| | assert "blue cube" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_swingxtimes_once(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict(num_repeats=1, target_color_name="green")) |
| | result = _call("SwingXtimes", s) |
| | assert "put it down on the left-side target" in result[0] |
| | assert "repeating" not in result[0] |
| | assert "left-side target" in result[1] |
| | assert "repeating" not in result[1] |
| |
|
| |
|
| | def test_swingxtimes_multiple(): |
| | """Branch behavior test case.""" |
| | s = _make_self(unwrapped_attrs=dict(num_repeats=5, target_color_name="red")) |
| | result = _call("SwingXtimes", s) |
| | assert "repeating this back and forth motion five times" in result[0] |
| | assert "right-to-left swing motion five times" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_videounmask_pick_one(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict( |
| | color_names=["red", "blue", "green"], |
| | configs={"easy": {"pick": 1}}, |
| | ), |
| | difficulty="easy", |
| | ) |
| | result = _call("VideoUnmask", s) |
| | assert "red cube" in result[0] |
| | assert "another container" not in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "red cube" in g |
| | assert "another container" not in g |
| |
|
| |
|
| | def test_videounmask_pick_two(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict( |
| | color_names=["red", "blue", "green"], |
| | configs={"hard": {"pick": 2}}, |
| | ), |
| | difficulty="hard", |
| | ) |
| | result = _call("VideoUnmask", s) |
| | assert "red cube" in result[0] |
| | assert "another container hiding the blue cube" in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "red cube" in g |
| | assert "another container hiding the blue cube" in g |
| |
|
| |
|
| | |
| |
|
| | def test_videounmaskswap_pick_one(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict(color_names=["red", "blue", "green"]), |
| | pick_times=1, |
| | ) |
| | result = _call("VideoUnmaskSwap", s) |
| | assert "red cube" in result[0] |
| | assert "another container" not in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "red cube" in g |
| | assert "another container" not in g |
| |
|
| |
|
| | def test_videounmaskswap_pick_two(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict(color_names=["red", "blue", "green"]), |
| | pick_times=2, |
| | ) |
| | result = _call("VideoUnmaskSwap", s) |
| | assert "red cube" in result[0] |
| | assert "another container hiding the blue cube" in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "red cube" in g |
| | assert "another container hiding the blue cube" in g |
| |
|
| |
|
| | |
| |
|
| | def test_buttonunmask_pick_one(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict( |
| | color_names=["green", "red", "blue"], |
| | configs={"easy": {"pick": 1}}, |
| | ), |
| | difficulty="easy", |
| | ) |
| | result = _call("ButtonUnmask", s) |
| | assert "press the button" in result[0] |
| | assert "green cube" in result[0] |
| | assert "another container" not in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "press the button" in g |
| | assert "green cube" in g |
| | assert "another container" not in g |
| |
|
| |
|
| | def test_buttonunmask_pick_two(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict( |
| | color_names=["green", "red", "blue"], |
| | configs={"hard": {"pick": 2}}, |
| | ), |
| | difficulty="hard", |
| | ) |
| | result = _call("ButtonUnmask", s) |
| | assert "press the button" in result[0] |
| | assert "another container hiding the red cube" in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "press the button" in g |
| | assert "another container hiding the red cube" in g |
| |
|
| |
|
| | |
| |
|
| | def test_buttonunmaskswap_pick_one(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict(color_names=["blue", "green", "red"]), |
| | pick_times=1, |
| | ) |
| | result = _call("ButtonUnmaskSwap", s) |
| | assert "press both buttons" in result[0] |
| | assert "blue cube" in result[0] |
| | assert "another container" not in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "press both buttons" in g |
| | assert "blue cube" in g |
| | assert "another container" not in g |
| |
|
| |
|
| | def test_buttonunmaskswap_pick_two(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | unwrapped_attrs=dict(color_names=["blue", "green", "red"]), |
| | pick_times=2, |
| | ) |
| | result = _call("ButtonUnmaskSwap", s) |
| | assert "press both buttons" in result[0] |
| | assert "another container hiding the green cube" in result[0] |
| | g = result[1] if len(result) > 1 else result[0] |
| | assert "press both buttons" in g |
| | assert "another container hiding the green cube" in g |
| |
|
| |
|
| | |
| |
|
| | def test_videoplacebutton(): |
| | """Branch behavior test case.""" |
| | s = _make_self( |
| | target_color_name="red", |
| | target_target_language="after", |
| | ) |
| | result = _call("VideoPlaceButton", s) |
| | assert "red cube" in result[0] |
| | assert "right after the button was pressed" in result[0] |
| | assert "red cube" in result[1] |
| | assert "where it was placed immediately after the button was pressed" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_videoplaceorder(): |
| | """Case: place at the N-th target in order.Inputs: target_color_name=blue, which_in_subset=3.""" |
| | s = _make_self( |
| | target_color_name="blue", |
| | which_in_subset=3, |
| | ) |
| | result = _call("VideoPlaceOrder", s) |
| | assert "blue cube" in result[0] |
| | assert "third target" in result[0] |
| | assert "blue cube" in result[1] |
| | assert "third target" in result[1] |
| | assert "where it was placed" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_pickhighlight(): |
| | """Branch behavior test case.""" |
| | s = _make_self() |
| | result = _call("PickHighlight", s) |
| | assert "press the button" in result[0] |
| | assert "highlighteted" in result[0] |
| | assert "highlighted cubes" in result[1] |
| | assert "press the button again to stop" in result[1] |
| |
|
| |
|
| | |
| | |
| |
|
| | def test_videorepick_once(): |
| | """Branch behavior test case.""" |
| | s = _make_self(num_repeats=1) |
| | result = _call("VideoRepick", s) |
| | assert "pick up the same block" in result[0] |
| | assert "repeatedly" not in result[0] |
| | assert "pick up the same cube" in result[1] |
| | assert "repeatedly" not in result[1] |
| |
|
| |
|
| | def test_videorepick_multiple(): |
| | """Branch behavior test case.""" |
| | s = _make_self(num_repeats=4) |
| | result = _call("VideoRepick", s) |
| | assert "repeatedly pick up and put down" in result[0] |
| | assert "four times" in result[0] |
| | assert "same cube" in result[1] |
| | assert "four times" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_stopcube(): |
| | """Case: press button to stop at the N-th arrival.Inputs: stop_time=2.""" |
| | s = _make_self(unwrapped_attrs=dict(stop_time=2)) |
| | result = _call("StopCube", s) |
| | assert "second time" in result[0] |
| | assert "second visit" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_insertpeg(): |
| | """Case: insert the same peg end into the same side.Inputs: none.""" |
| | s = _make_self() |
| | result = _call("InsertPeg", s) |
| | assert "grasp the same end" in result[0] |
| | assert "grasp the same peg at the same end" in result[1] |
| | assert "as in the video" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_movecube(): |
| | """Case: move the cube to target in the same way as before.Inputs: none.""" |
| | s = _make_self() |
| | result = _call("MoveCube", s) |
| | assert "move the cube to the target" in result[0] |
| | assert "shown in the video" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_patternlock(): |
| | """Case: retrace the same pattern with the stick.Inputs: none.""" |
| | s = _make_self() |
| | result = _call("PatternLock", s) |
| | assert "retrace the same pattern" in result[0] |
| | assert "retrace the same pattern shown in the video" in result[1] |
| |
|
| |
|
| | |
| |
|
| | def test_routestick(): |
| | """Case: use the stick to follow the same path around the rods.Inputs: none.""" |
| | s = _make_self() |
| | result = _call("RouteStick", s) |
| | assert "navigate around the sticks" in result[0] |
| | assert "following the same path shown in the video" in result[1] |
| |
|