from __future__ import annotations from dovla_cil.sim.base import ActionChunk, SimState from dovla_cil.sim.registry import get_simulator_backend from dovla_cil.sim.toy_backend import ToyBackend from dovla_cil.tasks.library import ToyTaskLibrary from dovla_cil.tasks.predicates import evaluate_task_success def test_toy_backend_can_reset_task() -> None: task = ToyTaskLibrary().get_by_id("toy_put_red_mug_in_blue_bowl") sim = ToyBackend() sim.seed(123) state = sim.reset_task(task) observation = sim.render_observation() assert isinstance(state, SimState) assert state.task_id == task.task_id assert "red_mug" in observation["objects"] assert observation["robot"]["gripper"] == "open" def test_serialize_restore_gives_identical_symbolic_state() -> None: task = ToyTaskLibrary().get_by_id("toy_put_red_mug_in_blue_bowl") sim = ToyBackend() sim.seed(123) sim.reset_task(task) state_blob = sim.serialize_state() expected = sim.get_symbolic_state() sim.execute_action_chunk(ActionChunk.single("push", object="red_mug", dx=0.2, dy=0.0)) sim.restore_state(state_blob) assert sim.get_symbolic_state() == expected def test_same_action_from_same_restored_state_is_deterministic() -> None: task = ToyTaskLibrary().get_by_id("toy_push_cube_to_target_zone") sim = ToyBackend() sim.seed(17) sim.reset_task(task) state_blob = sim.serialize_state() action = ActionChunk.single("push", object="cube", dx=0.1, dy=0.2) first = sim.execute_action_chunk(action) sim.restore_state(state_blob) second = sim.execute_action_chunk(action) assert first.after_state == second.after_state assert first.observation == second.observation assert first.contacts == second.contacts assert first.reward == second.reward def test_predicate_success_after_toy_actions() -> None: task = ToyTaskLibrary().get_by_id("toy_put_red_mug_in_blue_bowl") sim = ToyBackend() sim.seed(4) sim.reset_task(task) result = sim.execute_action_chunk( ActionChunk( [ {"command": "move_to", "object": "red_mug"}, {"command": "grasp", "object": "red_mug"}, { "command": "place_at", "object": "red_mug", "container": "blue_bowl", "relation": "inside", }, ] ) ) assert evaluate_task_success(task, sim.get_symbolic_state()) assert result.info["success"] is True assert result.reward == 1.0 def test_registry_toy_backend_works() -> None: assert isinstance(get_simulator_backend("toy"), ToyBackend)