Import AITURK IDE 1.0.0-beta.1 from Hermes 63279301; preserve MIT license
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
"""A zero-filled ``pid``/``window_id`` must not be read as exact targeting.
|
||||
|
||||
Several providers emit every declared schema property on every tool call,
|
||||
filling unused optional integers with ``0``. ``capture()`` entered its
|
||||
exact-target branch for any non-``None`` id, so those calls dropped the
|
||||
caller's ``app=``, coerced both ids to ``None`` via ``_positive_int``, and
|
||||
failed with a message pointing at pid/window_id rather than the real problem.
|
||||
For that class of model ``capture(app=...)`` never worked at all.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, List
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
|
||||
|
||||
def _backend_with_windows(windows: List[Dict[str, Any]]):
|
||||
from tools.computer_use.cua_backend import CuaDriverBackend
|
||||
|
||||
backend = CuaDriverBackend()
|
||||
backend._session = MagicMock()
|
||||
backend._session.call_tool.return_value = {
|
||||
"data": "",
|
||||
"images": [],
|
||||
"structuredContent": {"windows": windows},
|
||||
"isError": False,
|
||||
}
|
||||
return backend
|
||||
|
||||
|
||||
_WINDOWS = [
|
||||
{"app_name": "Fuwari", "pid": 100, "window_id": 1,
|
||||
"is_on_screen": True, "title": "menu bar", "z_index": 0},
|
||||
{"app_name": "Comet", "pid": 200, "window_id": 2,
|
||||
"is_on_screen": True, "title": "Comet Browser", "z_index": 1},
|
||||
]
|
||||
|
||||
|
||||
def test_app_scoped_capture_survives_placeholder_ids():
|
||||
"""The bug: app= was discarded and the capture failed outright."""
|
||||
backend = _backend_with_windows(_WINDOWS)
|
||||
|
||||
cap = backend.capture(mode="som", app="Comet", pid=0, window_id=0)
|
||||
|
||||
assert cap.app == "Comet", (
|
||||
f"app= was dropped for a zero-filled call; got app={cap.app!r} "
|
||||
f"detail={cap.window_title!r}"
|
||||
)
|
||||
|
||||
|
||||
def test_frontmost_capture_survives_placeholder_ids():
|
||||
"""Frontmost capture is the same failure with no app= to drop."""
|
||||
backend = _backend_with_windows(_WINDOWS)
|
||||
|
||||
cap = backend.capture(mode="som", pid=0, window_id=0)
|
||||
|
||||
# Frontmost is the highest z_index window.
|
||||
assert cap.app == "Comet", f"frontmost capture failed; detail={cap.window_title!r}"
|
||||
|
||||
|
||||
def test_real_exact_target_still_wins_over_app():
|
||||
"""Guard: a genuine pid/window pair keeps its exact-targeting behaviour."""
|
||||
backend = _backend_with_windows(_WINDOWS)
|
||||
|
||||
# Ids that match no enumerated window: only the exact branch can produce
|
||||
# this label, so it proves discovery was bypassed rather than consulted.
|
||||
cap = backend.capture(mode="som", app="Ghost", pid=999, window_id=99)
|
||||
|
||||
assert cap.app == "Ghost", f"exact targeting was bypassed; detail={cap.window_title!r}"
|
||||
|
||||
|
||||
def test_partial_target_still_reports_the_missing_half():
|
||||
"""Guard: one real id and one placeholder is a caller error, not discovery."""
|
||||
backend = _backend_with_windows(_WINDOWS)
|
||||
|
||||
cap = backend.capture(mode="som", app="Comet", pid=200, window_id=0)
|
||||
|
||||
assert "requires both pid and window_id" in cap.window_title
|
||||
|
||||
|
||||
def test_malformed_ids_are_not_treated_as_placeholders():
|
||||
"""Guard: garbage must still reach the validation error, not be ignored."""
|
||||
backend = _backend_with_windows(_WINDOWS)
|
||||
|
||||
cap = backend.capture(mode="som", app="Comet", pid="abc", window_id="def")
|
||||
|
||||
assert "positive integer" in cap.window_title
|
||||
|
||||
|
||||
def test_placeholder_predicate():
|
||||
from tools.computer_use.cua_backend import _is_placeholder_id
|
||||
|
||||
assert _is_placeholder_id(0) is True
|
||||
assert _is_placeholder_id("0") is True
|
||||
assert _is_placeholder_id(-1) is True
|
||||
assert _is_placeholder_id(200) is False
|
||||
assert _is_placeholder_id("200") is False
|
||||
# Garbage is not a placeholder: it must keep reaching the existing error.
|
||||
assert _is_placeholder_id("abc") is False
|
||||
assert _is_placeholder_id(None) is False
|
||||
assert _is_placeholder_id(1.5) is False
|
||||
# bools are ints in Python; False must not read as a placeholder id.
|
||||
assert _is_placeholder_id(False) is False
|
||||
assert _is_placeholder_id(True) is False
|
||||
Reference in New Issue
Block a user