import unittest from pathlib import Path import tempfile from agent_harness.repair_experiment import ( RepairExperimentError, extract_unified_diff, oracle_hunk_ranges, validate_patch_scope, run_test_command, ) class RepairExperimentTests(unittest.TestCase): def test_oracle_hunk_ranges_read_only_old_file_locations(self) -> None: patch = ( "diff --git a/x.go b/x.go\n--- a/x.go\n+++ b/x.go\n" "@@ -55,6 +55,20 @@ type X struct {\n context\n" ) self.assertEqual(oracle_hunk_ranges(patch, "x.go"), ((55, 6),)) def test_extracts_fenced_diff_without_rewriting_it(self) -> None: response = { "choices": [ { "message": { "content": "```diff\ndiff --git a/x.go b/x.go\n--- a/x.go\n+++ b/x.go\n@@ -1 +1 @@\n-a\n+b\n```" } } ] } patch = extract_unified_diff(response) self.assertTrue(patch.startswith("diff --git a/x.go b/x.go")) self.assertTrue(patch.endswith("+b\n")) def test_rejects_modification_outside_evidence(self) -> None: patch = "diff --git a/x.go b/x.go\n--- a/x.go\n+++ b/x.go\n@@ -1 +1 @@\n-a\n+b\n" with self.assertRaises(RepairExperimentError): validate_patch_scope(patch, ["y.go"]) def test_accepts_modification_inside_evidence(self) -> None: patch = "diff --git a/x.go b/x.go\n--- a/x.go\n+++ b/x.go\n@@ -1 +1 @@\n-a\n+b\n" self.assertEqual(validate_patch_scope(patch, ["x.go"]), ("x.go",)) def test_python_pytest_command_uses_frozen_interpreter(self) -> None: with tempfile.TemporaryDirectory() as temporary: tree = Path(temporary) (tree / "test_smoke.py").write_text("def test_ok():\n assert True\n") result = run_test_command(tree, "python -m pytest -q test_smoke.py") self.assertEqual(result["returncode"], 0, result["stderr"])