from agent import render def test_render_event_thought_and_revision(): normal = render.render_event({"kind": "thought", "text": "hmm", "revision": False, "step": 1}) assert "🧠" in normal and "hmm" in normal rev = render.render_event({"kind": "thought", "text": "rethink", "revision": True, "step": 2}) assert "↻" in rev and "revision" in rev def test_render_event_tool_call_observation_final(): tc = render.render_event({"kind": "tool_call", "tool": "calculator", "args": {"expression": "2+2"}, "step": 1}) assert "🔧" in tc and "calculator" in tc and "2+2" in tc weak = render.render_event({"kind": "observation", "tool": "wikipedia_search", "text": "may refer to", "weak": True, "step": 1}) assert "📄" in weak and "weak" in weak fin = render.render_event({"kind": "final", "text": "42", "step": 3}) assert "42" in fin def test_render_stats(): assert render.render_stats(steps=3, tool_calls=2, seconds=4.25) == "3 steps · 2 tool calls · 4.2s" def test_check_run_allowed(): ok, msg = render.check_run_allowed(0, cap=5) assert ok and msg == "" blocked, msg2 = render.check_run_allowed(5, cap=5) assert not blocked and "limit" in msg2.lower() def test_render_timeline_escapes_html(): html = render.render_timeline([{"kind": "observation", "tool": "web_get", "text": "", "weak": False, "step": 1}]) assert "