"""Regression tests for training/config.py's tiny YAML parser. Early pipeline startup crashed because the parser did not strip inline ``# comment`` suffixes from values — a two-line comment on the same line as ``group_size: 4`` was read verbatim as the value and int() threw. These tests make sure that class of bug can't regress. """ from __future__ import annotations import tempfile from pathlib import Path from training.config import TrainingConfig, load_simple_yaml def test_strips_inline_comment_before_parsing(): """The parser must strip `` # …`` suffixes from values so int/float conversions don't see comment text.""" with tempfile.NamedTemporaryFile("w", suffix=".yaml", delete=False) as f: f.write("group_size: 4 # A comment explaining this\n") f.write("learning_rate: 4.0e-5 # trailing comment\n") path = Path(f.name) cfg_map = load_simple_yaml(path) assert cfg_map["group_size"] == "4" assert cfg_map["learning_rate"] == "4.0e-5" def test_preserves_hash_when_no_space_before(): """If a value has a ``#`` with no preceding space (e.g. URL fragment), it must be preserved. Our rule is: only strip when the ``#`` is whitespace-separated from the value.""" with tempfile.NamedTemporaryFile("w", suffix=".yaml", delete=False) as f: f.write('url: https://example.com#anchor\n') path = Path(f.name) cfg_map = load_simple_yaml(path) assert cfg_map["url"] == "https://example.com#anchor" def test_full_config_load_with_inline_comments(): """End-to-end: the shipped config must parse cleanly into a TrainingConfig.""" root = Path(__file__).resolve().parent.parent cfg_map = load_simple_yaml(root / "training" / "config.yaml") cfg = TrainingConfig.from_mapping(cfg_map) assert cfg.group_size >= 2 assert cfg.learning_rate > 0 assert cfg.total_episodes > 0 assert cfg.domain in ("devtools", "meridian", "") or cfg.domain is None def test_section_dict_entries_also_strip_comments(): """Indented section values must also have their comments stripped.""" with tempfile.NamedTemporaryFile("w", suffix=".yaml", delete=False) as f: f.write("section:\n") f.write(" key: value # inline comment in section\n") path = Path(f.name) cfg_map = load_simple_yaml(path) assert cfg_map.get("section", {}).get("key") == "value"