75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
|
import json
|
||
|
from pathlib import Path
|
||
|
from typing import Any
|
||
|
|
||
|
import pytest
|
||
|
|
||
|
from lerobot.common.utils.io_utils import deserialize_json_into_object
|
||
|
|
||
|
|
||
|
@pytest.fixture
|
||
|
def tmp_json_file(tmp_path: Path):
|
||
|
"""Writes `data` to a temporary JSON file and returns the file's path."""
|
||
|
|
||
|
def _write(data: Any) -> Path:
|
||
|
file_path = tmp_path / "data.json"
|
||
|
with file_path.open("w", encoding="utf-8") as f:
|
||
|
json.dump(data, f)
|
||
|
return file_path
|
||
|
|
||
|
return _write
|
||
|
|
||
|
|
||
|
def test_simple_dict(tmp_json_file):
|
||
|
data = {"name": "Alice", "age": 30}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"name": "", "age": 0}
|
||
|
assert deserialize_json_into_object(json_path, obj) == data
|
||
|
|
||
|
|
||
|
def test_nested_structure(tmp_json_file):
|
||
|
data = {"items": [1, 2, 3], "info": {"active": True}}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"items": [0, 0, 0], "info": {"active": False}}
|
||
|
assert deserialize_json_into_object(json_path, obj) == data
|
||
|
|
||
|
|
||
|
def test_tuple_conversion(tmp_json_file):
|
||
|
data = {"coords": [10.5, 20.5]}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"coords": (0.0, 0.0)}
|
||
|
result = deserialize_json_into_object(json_path, obj)
|
||
|
assert result["coords"] == (10.5, 20.5)
|
||
|
|
||
|
|
||
|
def test_type_mismatch_raises(tmp_json_file):
|
||
|
data = {"numbers": {"bad": "structure"}}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"numbers": [0, 0]}
|
||
|
with pytest.raises(TypeError):
|
||
|
deserialize_json_into_object(json_path, obj)
|
||
|
|
||
|
|
||
|
def test_missing_key_raises(tmp_json_file):
|
||
|
data = {"one": 1}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"one": 0, "two": 0}
|
||
|
with pytest.raises(ValueError):
|
||
|
deserialize_json_into_object(json_path, obj)
|
||
|
|
||
|
|
||
|
def test_extra_key_raises(tmp_json_file):
|
||
|
data = {"one": 1, "two": 2}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"one": 0}
|
||
|
with pytest.raises(ValueError):
|
||
|
deserialize_json_into_object(json_path, obj)
|
||
|
|
||
|
|
||
|
def test_list_length_mismatch_raises(tmp_json_file):
|
||
|
data = {"nums": [1, 2, 3]}
|
||
|
json_path = tmp_json_file(data)
|
||
|
obj = {"nums": [0, 0]}
|
||
|
with pytest.raises(ValueError):
|
||
|
deserialize_json_into_object(json_path, obj)
|