File size: 4,547 Bytes
d61821a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from __future__ import annotations

from pathlib import Path
import subprocess
import tempfile
import unittest

from agent_harness.live_agent_experiment import (
    AgentWorkspace,
    swe_agent_style_tool_definitions,
    tool_definitions,
)
from agent_harness.specs import load_harnesses, load_tasks


ROOT = Path(__file__).resolve().parents[1]


class LiveAgentExperimentTests(unittest.TestCase):
    def test_workspace_applies_edit_and_reconstructs_base_relative_diff(self) -> None:
        task = load_tasks(ROOT)["TASK_CR_001"]
        with tempfile.TemporaryDirectory() as temporary:
            tree = Path(temporary) / "tree"
            tree.mkdir()
            source = tree / "source.go"
            source.write_text("package demo\n\nfunc value() int { return 1 }\n", encoding="utf-8")
            workspace = AgentWorkspace(tree, ("source.go",), task, max_test_runs=2)
            result = workspace.apply_patch(
                "--- a/source.go\n"
                "+++ b/source.go\n"
                "@@ -1,3 +1,3 @@\n"
                " package demo\n"
                " \n"
                "-func value() int { return 1 }\n"
                "+func value() int { return 2 }\n"
            )
            self.assertTrue(result["accepted"])
            final = workspace.final_patch()
            self.assertIn("--- a/source.go", final)
            self.assertIn("+func value() int { return 2 }", final)
            check = subprocess.run(
                ["git", "apply", "--check", "-"],
                cwd=tree,
                input=final,
                text=True,
                capture_output=True,
                check=False,
            )
            # It should no longer apply to the edited tree, demonstrating that
            # the reconstructed patch is relative to the frozen base.
            self.assertNotEqual(check.returncode, 0)

    def test_workspace_rejects_test_edits(self) -> None:
        task = load_tasks(ROOT)["TASK_CR_001"]
        with tempfile.TemporaryDirectory() as temporary:
            tree = Path(temporary)
            (tree / "source_test.go").write_text("package demo\n", encoding="utf-8")
            workspace = AgentWorkspace(tree, ("source_test.go",), task, max_test_runs=2)
            with self.assertRaises(ValueError):
                workspace.apply_patch(
                    "--- a/source_test.go\n+++ b/source_test.go\n@@ -1 +1 @@\n-package demo\n+package changed\n"
                )

    def test_tools_separate_unified_specialized_and_control_interfaces(self) -> None:
        harnesses = load_harnesses(ROOT)
        task = load_tasks(ROOT)["TASK_CR_001"]
        names = lambda harness_id: {
            item["function"]["name"] for item in tool_definitions(harnesses[harness_id], task)
        }
        self.assertIn("search_code", names("H007"))
        self.assertNotIn("search_dense", names("H007"))
        self.assertIn("search_dense", names("H011"))
        self.assertIn("search_graph", names("H011"))
        self.assertFalse(any(item.startswith("search_") for item in names("H016")))
        self.assertFalse(any(item.startswith("search_") for item in names("H018")))

    def test_swe_agent_style_interface_is_exact_search_only(self) -> None:
        task = load_tasks(ROOT)["TASK_CR_001"]
        names = {
            item["function"]["name"] for item in swe_agent_style_tool_definitions(task)
        }
        self.assertIn("find_files", names)
        self.assertIn("search_text", names)
        self.assertNotIn("search_dense", names)
        self.assertNotIn("search_graph", names)

    def test_python_workspace_rejects_test_edits(self) -> None:
        task = load_tasks(ROOT)["TASK_S2_R003_003"]
        with tempfile.TemporaryDirectory() as temporary:
            tree = Path(temporary)
            test_path = tree / "tests" / "unit" / "test_example.py"
            test_path.parent.mkdir(parents=True)
            test_path.write_text("def test_example():\n    assert True\n")
            workspace = AgentWorkspace(
                tree, ("tests/unit/test_example.py",), task, max_test_runs=2
            )
            with self.assertRaises(ValueError):
                workspace.apply_patch(
                    "--- a/tests/unit/test_example.py\n"
                    "+++ b/tests/unit/test_example.py\n"
                    "@@ -1,2 +1,2 @@\n"
                    " def test_example():\n"
                    "-    assert True\n"
                    "+    assert False\n"
                )


if __name__ == "__main__":
    unittest.main()