import json import tempfile import unittest from pathlib import Path from approach.run_vlm import build_parser, run class RunVlmTests(unittest.TestCase): def test_configurable_vlm_runner_writes_selected_records(self): calls = [] def processor(profile, question, image_path, ablation, key_index): calls.append((profile, question, Path(image_path).name, ablation, key_index)) return {"objects": {"button": "round red"}} with tempfile.TemporaryDirectory() as tmpdir: root = Path(tmpdir) questions = root / "questions.jsonl" questions.write_text( "\n".join( [ json.dumps({"question_id": 0, "image": "123_4.jpg", "text": "mine"}), json.dumps({"question_id": 1, "image": "456_7.jpg", "text": "mine"}), ] ) + "\n" ) args = build_parser().parse_args( [ "--questions", str(questions), "--images-dir", str(root / "images"), "--output", str(root / "answers.jsonl"), "--start-index", "0", "--end-index", "1", "--profile", "paper_claude", ] ) report = run(args, processor=processor) output = root / "answers.rows0-1.jsonl" answer = json.loads(output.read_text().strip()) self.assertEqual(report["completed"], 1) self.assertEqual(answer["question_id"], 0) self.assertEqual(answer["model_id"], "anthropic/claude-3.5-sonnet") self.assertEqual(calls[0][:4], ("paper_claude", "mine", "123_4.jpg", False)) def test_default_processor_uses_app_metadata_cache_without_live_fallback(self): from approach.vlm.gpt4v.gpt4v import get_steam_app_data, load_app_metadata_cache with tempfile.TemporaryDirectory() as tmpdir: root = Path(tmpdir) cache_path = root / "metadata.json" cache_path.write_text( json.dumps( { "123": { "app_name": "Test VR", "app_description": "Synthetic cache-only description.", } } ), encoding="utf-8", ) cache = load_app_metadata_cache(cache_path) self.assertEqual( get_steam_app_data("123", "123_4.jpg", cache), ("Test VR", "Synthetic cache-only description."), ) with self.assertRaises(KeyError): get_steam_app_data("456", "456_7.jpg", cache) if __name__ == "__main__": unittest.main()