RoboMME / tests /lightweight /test_TaskGoalI_isList.py
HongzeFu's picture
HF Space: code-only (no binary assets)
06c11b0
"""
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 16 env_ids ─────────────────────────────────────────────────────────────
ALL_ENV_IDS = [
"BinFill",
"PickXtimes",
"SwingXtimes",
"StopCube",
"VideoUnmask",
"VideoUnmaskSwap",
"ButtonUnmask",
"ButtonUnmaskSwap",
"PickHighlight",
"VideoRepick",
"VideoPlaceButton",
"VideoPlaceOrder",
"MoveCube",
"InsertPeg",
"PatternLock",
"RouteStick",
]
# ── Four ActionSpaceTypes ──────────────────────────────────────────────────────
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",
)
# Base Wrapper
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,
)
# Apply additional Wrapper depending on action_space
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}"
)