| """ |
| test_TaskGoalIsList.py |
| |
| Directly create a real Gymnasium environment (wrapped in DemonstrationWrapper), |
| call env.reset(), and verify that info["task_goal"] is a list and not empty. |
| |
| Covers all 16 envs. |
| |
| Run: |
| uv run python -m pytest tests/lightweight/test_TaskGoalI_isList.py -v -s |
| """ |
|
|
| import gymnasium as gym |
| import pytest |
| from typing import Literal |
|
|
| from robomme.env_record_wrapper.DemonstrationWrapper import DemonstrationWrapper |
| from robomme.env_record_wrapper.EndeffectorDemonstrationWrapper import EndeffectorDemonstrationWrapper |
| from robomme.env_record_wrapper.MultiStepDemonstrationWrapper import MultiStepDemonstrationWrapper |
| from robomme.env_record_wrapper.OraclePlannerDemonstrationWrapper import OraclePlannerDemonstrationWrapper |
|
|
| pytestmark = [pytest.mark.slow, pytest.mark.gpu] |
|
|
| |
| ALL_ENV_IDS = [ |
| "BinFill", |
| "PickXtimes", |
| "SwingXtimes", |
| "StopCube", |
| "VideoUnmask", |
| "VideoUnmaskSwap", |
| "ButtonUnmask", |
| "ButtonUnmaskSwap", |
| "PickHighlight", |
| "VideoRepick", |
| "VideoPlaceButton", |
| "VideoPlaceOrder", |
| "MoveCube", |
| "InsertPeg", |
| "PatternLock", |
| "RouteStick", |
| ] |
|
|
| |
| ACTION_SPACES = ["joint_angle", "ee_pose", "waypoint", "multi_choice"] |
|
|
|
|
| def _make_env(env_id: str, action_space: str): |
| """Create and return a real environment wrapped with the corresponding Wrapper.""" |
| env = gym.make( |
| env_id, |
| obs_mode="rgb+depth+segmentation", |
| control_mode="pd_joint_pos", |
| render_mode="rgb_array", |
| reward_mode="dense", |
| ) |
| |
| env = DemonstrationWrapper( |
| env, |
| max_steps_without_demonstration=10002, |
| gui_render=False, |
| include_maniskill_obs=True, |
| include_front_depth=True, |
| include_wrist_depth=True, |
| include_front_camera_extrinsic=True, |
| include_wrist_camera_extrinsic=True, |
| include_available_multi_choices=True, |
| include_front_camera_intrinsic=True, |
| include_wrist_camera_intrinsic=True, |
| ) |
|
|
| |
| if action_space == "joint_angle": |
| pass |
| elif action_space == "ee_pose": |
| env = EndeffectorDemonstrationWrapper(env, action_repr="rpy") |
| elif action_space == "waypoint": |
| env = MultiStepDemonstrationWrapper(env, gui_render=False, vis=False) |
| elif action_space == "multi_choice": |
| env = OraclePlannerDemonstrationWrapper(env, env_id=env_id, gui_render=False) |
| else: |
| raise ValueError(f"Unsupported action_space: {action_space}") |
|
|
| return env |
|
|
|
|
| @pytest.mark.parametrize( |
| "env_id, action_space", |
| [(env, action) for env in ALL_ENV_IDS for action in ACTION_SPACES], |
| ) |
| def test_task_goal_is_list(env_id: str, action_space: str): |
| """ |
| Test four action_spaces consecutively for each env_id: |
| 1. Create real environment (including corresponding Wrapper) |
| 2. Call reset() |
| 3. Assert info["task_goal"] is list and not empty |
| """ |
| print(f"\nTesting [{env_id}] with action_space={action_space!r}") |
| env = _make_env(env_id, action_space) |
| try: |
| _, info = env.reset() |
| finally: |
| env.close() |
|
|
| task_goal = info["task_goal"] |
| print(f"[{env_id} | {action_space}] task_goal = {task_goal!r}") |
|
|
| assert isinstance(task_goal, list), ( |
| f"[{env_id} | {action_space}] info['task_goal'] should be list, actually {type(task_goal).__name__!r}: {task_goal!r}" |
| ) |
| assert len(task_goal) >= 1, ( |
| f"[{env_id} | {action_space}] info['task_goal'] should not be empty list" |
| ) |
| for i, item in enumerate(task_goal): |
| assert isinstance(item, str), ( |
| f"[{env_id} | {action_space}] task_goal[{i}] should be str, actually {type(item).__name__!r}: {item!r}" |
| ) |
|
|