Files
agentic-mobile-control/tests/test_agents_observer.py
2026-07-06 23:23:44 +08:00

86 lines
2.4 KiB
Python

from __future__ import annotations
from collections import deque
from agents.observer import Observer
from core.models import Bounds, Scene, SceneElement
from semantic.models import SemanticScene, SemanticWidget
from world.models import WorldState
def _make_scene() -> Scene:
return Scene(
width=1080,
height=1920,
elements=[
SceneElement(id="btn1", type="button", bounds=Bounds(10, 20, 100, 50), text="Send"),
SceneElement(id="txt1", type="text", bounds=Bounds(0, 0, 500, 30), text="Hello"),
],
)
def _make_semantic_scene() -> SemanticScene:
return SemanticScene(
page="chat",
intents=["send_message"],
widgets=[SemanticWidget(element_id="btn1", purpose="send button")],
)
def _make_world() -> WorldState:
state = WorldState(
current_app="com.example.messenger",
current_page="conversation",
variables={"draft": "hello"},
)
return state
def test_observe_with_semantic_and_world() -> None:
obs = Observer().observe(
scene=_make_scene(),
semantic_scene=_make_semantic_scene(),
world=_make_world(),
)
assert obs.semantic_page == "chat"
assert obs.semantic_intents == ["send_message"]
assert obs.world_app == "com.example.messenger"
assert obs.world_page == "conversation"
assert obs.world_variables == {"draft": "hello"}
assert obs.raw_scene is not None
def test_observe_without_semantic_or_world() -> None:
obs = Observer().observe(scene=_make_scene())
assert obs.semantic_page is None
assert obs.semantic_intents == []
assert obs.world_app is None
assert obs.world_page is None
assert obs.world_variables == {}
assert obs.scene_summary is not None
assert obs.raw_scene is not None
def test_observe_with_semantic_only() -> None:
obs = Observer().observe(
scene=_make_scene(),
semantic_scene=_make_semantic_scene(),
)
assert obs.semantic_page == "chat"
assert obs.world_app is None
def test_observe_with_world_only() -> None:
obs = Observer().observe(
scene=_make_scene(),
world=_make_world(),
)
assert obs.semantic_page is None
assert obs.world_app == "com.example.messenger"
def test_observe_scene_summary_includes_elements() -> None:
obs = Observer().observe(scene=_make_scene())
assert "1080x1920" in obs.scene_summary
assert "Send" in obs.scene_summary