| from __future__ import annotations |
|
|
| import json |
| from pathlib import Path |
|
|
| from urban_act.data import load_episode_records |
|
|
|
|
| def _add_episode(root: Path, episode_id: str) -> None: |
| directory = root / "raw" / "accepted" / episode_id |
| directory.mkdir(parents=True) |
| for name in ("episode.json", "telemetry.jsonl", "front.mp4"): |
| (directory / name).touch() |
|
|
|
|
| def test_manifest_split_is_preserved_and_failure_manifest_is_ignored(tmp_path: Path) -> None: |
| manifests = tmp_path / "manifests" |
| manifests.mkdir() |
| train = { |
| "id": "nominal-turn-left-0000", |
| "kind": "nominal", |
| "split": "train", |
| "taskId": "turn_left_intersection", |
| "instruction": "Turn left at the intersection.", |
| } |
| validation = { |
| "id": "recovery-turn-left-0000", |
| "kind": "recovery", |
| "split": "validation", |
| "taskId": "turn_left_intersection", |
| "instruction": "Take the left turn.", |
| } |
| failure = { |
| "id": "failure-turn-left-0000", |
| "kind": "failure", |
| "split": "analysis", |
| "taskId": "turn_left_intersection", |
| "instruction": "Turn left.", |
| } |
| (manifests / "nominal.jsonl").write_text(json.dumps(train) + "\n") |
| (manifests / "recovery.jsonl").write_text(json.dumps(validation) + "\n") |
| (manifests / "failures.jsonl").write_text(json.dumps(failure) + "\n") |
| _add_episode(tmp_path, train["id"]) |
| _add_episode(tmp_path, validation["id"]) |
|
|
| train_records = load_episode_records(tmp_path, "train") |
| validation_records = load_episode_records(tmp_path, "validation") |
|
|
| assert [record.episode_id for record in train_records] == [train["id"]] |
| assert [record.episode_id for record in validation_records] == [validation["id"]] |
| assert all(record.kind != "failure" for record in train_records + validation_records) |
|
|
|
|