59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
"""
|
|
Parity test for `OptimizationProfile`.
|
|
|
|
Python `OptimizationProfile.{LIVE,OBJECT_STORE}` must agree with the
|
|
Rust `OptimizationProfile::{LIVE,OBJECT_STORE}` constants byte-for-byte.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import math
|
|
|
|
import pytest
|
|
from rerun.experimental import OptimizationProfile
|
|
|
|
from rerun_bindings import _optimization_profile_values # noqa: TID251
|
|
|
|
# Mapping: Python field -> Rust dict key. Names diverge intentionally
|
|
# (Rust mirrors `ChunkStoreConfig::chunk_max_*`; Python keeps the existing
|
|
# public `max_*` field set).
|
|
FIELD_MAP = {
|
|
"max_bytes": "chunk_max_bytes",
|
|
"max_rows": "chunk_max_rows",
|
|
"max_rows_if_unsorted": "chunk_max_rows_if_unsorted",
|
|
"extra_passes": "num_extra_passes",
|
|
"gop_batching": "gop_batching",
|
|
"split_size_ratio": "split_size_ratio",
|
|
}
|
|
|
|
|
|
def _python_dict(p: OptimizationProfile) -> dict[str, object]:
|
|
return {rust_key: getattr(p, py_key) for py_key, rust_key in FIELD_MAP.items()}
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"name,profile",
|
|
[
|
|
("LIVE", OptimizationProfile.LIVE),
|
|
("OBJECT_STORE", OptimizationProfile.OBJECT_STORE),
|
|
],
|
|
)
|
|
def test_profile_parity(name: str, profile: OptimizationProfile) -> None:
|
|
rust = _optimization_profile_values(name)
|
|
py = _python_dict(profile)
|
|
|
|
# Bidirectional: a missing field on either side fails first with a clear diff.
|
|
assert set(rust.keys()) == set(py.keys()), f"key set diverged: rust={set(rust.keys())} py={set(py.keys())}"
|
|
|
|
for key in sorted(rust):
|
|
rv, pv = rust[key], py[key]
|
|
if isinstance(rv, float) or isinstance(pv, float):
|
|
assert math.isclose(rv, pv, rel_tol=1e-9), f"{name}.{key}: rust={rv!r} py={pv!r}" # type: ignore[arg-type]
|
|
else:
|
|
assert rv == pv, f"{name}.{key}: rust={rv!r} py={pv!r}"
|
|
|
|
|
|
def test_unknown_profile_name_raises() -> None:
|
|
with pytest.raises(ValueError):
|
|
_optimization_profile_values("BOGUS")
|