import json import pytest from cism.cli import main from cism.engine import Engine from test_engine import make_engine def test_inspect(monkeypatch, capsys): engine, _ = make_engine() monkeypatch.setattr(Engine, "from_pretrained", lambda *args, **kwargs: engine) assert main(["inspect", "fake-model"]) == 0 assert json.loads(capsys.readouterr().out)["model"] == "fake-model" def test_generate(monkeypatch, capsys): engine, _ = make_engine() monkeypatch.setattr(Engine, "from_pretrained", lambda *args, **kwargs: engine) assert main(["generate", "fake-model", "--max-tokens", "2"]) == 0 assert capsys.readouterr().out == "<3><4>\n" def test_cache_report(monkeypatch, capsys): engine, native = make_engine() monkeypatch.setattr(Engine, "from_pretrained", lambda *args, **kwargs: engine) assert main(["cache-report", "fake-model", "--decode-tokens", "2", "--scrub-mb", "1"]) == 0 report = json.loads(capsys.readouterr().out) assert report["decode_bottleneck"] assert report["residency"] assert report["warm_scan_gbps"] > 0 and report["cold_scan_gbps"] > 0 assert native.scans >= 25 def test_invalid_bench(capsys): with pytest.raises(SystemExit) as error: main(["bench", "fake-model", "--runs", "0"]) assert error.value.code == 2 def test_import_error_is_actionable(monkeypatch, capsys): def fail(*args, **kwargs): raise ValueError("Unsupported architecture") monkeypatch.setattr(Engine, "from_pretrained", fail) assert main(["inspect", "fake-model"]) == 1 assert "Unsupported architecture" in capsys.readouterr().err