from __future__ import annotations import json import pytest from dovla_cil.generation.maniskill_render import ( _load_records, _rewrite_observation_refs, _validate_state_archive, ) def test_offline_renderer_rewrites_grouped_observation_refs(tmp_path) -> None: shard = tmp_path / "shard_000000.jsonl" records = [ {"record_id": "r0", "group_id": "g0", "observation_ref": None}, {"record_id": "r1", "group_id": "g0", "observation_ref": None}, {"record_id": "r2", "group_id": "g1", "observation_ref": None}, ] shard.write_text( "".join(json.dumps(record) + "\n" for record in records), encoding="utf-8", ) by_group, by_shard = _load_records([shard]) _rewrite_observation_refs( by_shard, { "r0": ("observations.h5#initial_rgb_jpeg/0", "next/0"), "r1": ("observations.h5#initial_rgb_jpeg/0", "next/1"), "r2": ("observations.h5#initial_rgb_jpeg/1", "next/2"), }, ) rewritten = [json.loads(line) for line in shard.read_text().splitlines()] assert list(by_group) == ["g0", "g1"] assert [len(group) for group in by_group.values()] == [2, 1] assert rewritten[0]["observation_ref"] == rewritten[1]["observation_ref"] assert rewritten[2]["observation_ref"].endswith("/1") assert [record["next_observation_ref"] for record in rewritten] == [ "next/0", "next/1", "next/2", ] def test_offline_renderer_requires_versioned_before_after_states() -> None: _validate_state_archive({"version": 2, "initial": {}, "next": {}}) with pytest.raises(ValueError, match="version 2"): _validate_state_archive({"group-id": {"actors": {}}})