"""The shelf-space report: fit math, coverage buckets, honest unknowns.""" from __future__ import annotations import json import pytest import typer from bggpipe.config import Config from bggpipe.dims import fits_kallax, run_dims_report def test_fits_kallax_tries_every_orientation(): assert fits_kallax(11.6, 11.6, 2.8) # ordinary big-box # too tall to stand, but slides in lying down: depth axis takes 15.0 assert fits_kallax(15.0, 12.0, 3.0) # two axes over the opening: no orientation works assert not fits_kallax(16.2, 16.2, 4.0) # fits the opening but too deep to close the wall behind it assert not fits_kallax(12.0, 12.0, 15.5) # exact boundary counts as fitting assert fits_kallax(13.2, 13.2, 15.4) def test_report_buckets_misfits_and_unknowns(tmp_path, capsys): cfg = Config(data_dir=tmp_path / "data") cfg.data_dir.mkdir(parents=True) cfg.games_path.write_text( json.dumps( { "1": { "name": "Fits Fine", "dims": { "width_in": 11.6, "length_in": 11.6, "depth_in": 2.8, "weight_lb": 4, "source": "version", }, }, "2": { "name": "Monster Box", "dims": { "width_in": 16.2, "length_in": 16.2, "depth_in": 4.0, "weight_lb": 7, "source": "unanimous", }, }, "3": { "name": "Argued About", "dims": { "width_in": None, "length_in": None, "depth_in": None, "weight_lb": None, "source": "conflicting", }, }, "4": {"name": "Never Measured"}, # pre-dims entry: absent } ) ) summary = run_dims_report(cfg) assert summary["by_source"] == { "version": 1, "unanimous": 1, "conflicting": 1, "absent": 1, } assert summary["misfits"] == ["Monster Box"] # can't verify is NOT the same as fits: both unknowns are named assert summary["unknown"] == ["Argued About", "Never Measured"] out = capsys.readouterr().out assert "do NOT fit" in out and "Monster Box" in out assert "can't be verified" in out and "Never Measured" in out def test_report_without_games_json_exits_with_guidance(tmp_path): cfg = Config(data_dir=tmp_path / "data") with pytest.raises(typer.Exit): run_dims_report(cfg)