import json import sys import tempfile import unittest from itertools import chain, repeat from pathlib import Path from unittest import mock sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from evaluation import context_eval_baselines from evaluation.tools import to_pred class ToPredTests(unittest.TestCase): def test_task_is_required(self): parser = to_pred.build_parser() with self.assertRaises(SystemExit): parser.parse_args(["--input", "pred.json", "--output", "out.json"]) def test_convert_old_predictions_to_semantics_fields(self): with tempfile.TemporaryDirectory() as tmpdir: tmp = Path(tmpdir) pred_path = tmp / "pred.json" question_path = tmp / "questions.jsonl" output_path = tmp / "out.json" pred_path.write_text( json.dumps( { "q1": { "oovd_result": { "button": [ { "bbox_pixels": [1, 2, 3, 4], "probability": 0.7, } ] } } } ) ) question_path.write_text( json.dumps({"question_id": "q1", "image": "1026760_11.jpg"}) + "\n" ) to_pred.main( [ "--task", "semantics", "--input", str(pred_path), "--questions", str(question_path), "--output", str(output_path), ] ) converted = json.loads(output_path.read_text()) self.assertEqual( converted, [ { "image_id": 1026760011, "category_id": "button", "bbox": [1, 2, 3, 4], "score": 0.7, } ], ) def test_all_outputs_do_not_overwrite(self): with tempfile.TemporaryDirectory() as tmpdir: tmp = Path(tmpdir) pred_path = tmp / "pred.json" output_path = tmp / "converted.json" pred_path.write_text( json.dumps( [ { "image_id": 1, "category_id": "trigger", "bbox": [1, 2, 3, 4], "score": 0.5, } ] ) ) to_pred.main( [ "--task", "all", "--input", str(pred_path), "--output", str(output_path), ] ) self.assertFalse(output_path.exists()) for task in to_pred.TASKS: self.assertTrue((tmp / f"converted_{task}.json").exists()) interactable = json.loads((tmp / "converted_interactable.json").read_text()) interaction = json.loads((tmp / "converted_interaction.json").read_text()) semantics = json.loads((tmp / "converted_semantics.json").read_text()) self.assertEqual(interactable[0]["category_id"], 1) self.assertEqual(interaction[0]["category_id"], "trigger") self.assertEqual(semantics[0]["category_id"], "trigger") class ContextEvalBaselineTests(unittest.TestCase): def test_validate_unique_methods_rejects_duplicates(self): with self.assertRaises(ValueError): context_eval_baselines.validate_unique_methods(["Seed-E2E", "Seed-E2E"]) def test_main_uses_subprocess_check_true(self): args = context_eval_baselines.build_parser().parse_args([]) methods = ["CenterNet2"] with mock.patch.object( context_eval_baselines, "METHODS", methods ), mock.patch.object( context_eval_baselines, "LLM_METHODS", [] ), mock.patch.object( context_eval_baselines.os.path, "exists", side_effect=chain([True, False], repeat(False)), ), mock.patch.object( context_eval_baselines.subprocess, "run" ) as run: context_eval_baselines.main(args) self.assertTrue(run.called) self.assertTrue(run.call_args.kwargs["check"]) self.assertIsInstance(run.call_args.args[0], list) if __name__ == "__main__": unittest.main()