from __future__ import annotations
from perception.ui_parser import parse_ui_tree
def test_ios_page_source_reports_enabled_only() -> None:
xml = """
"""
elements = parse_ui_tree(xml)
button = next(element for element in elements if element.type == "button")
assert button.enabled is False
# iOS page_source never emits these, so they must stay unknown (None),
# not be defaulted to False.
assert button.clickable is None
assert button.selected is None
assert button.checked is None
assert button.focused is None
def test_android_page_source_reports_full_interaction_state() -> None:
xml = """
"""
elements = parse_ui_tree(xml)
assert len(elements) == 1
checkbox = elements[0]
assert checkbox.enabled is True
assert checkbox.clickable is True
assert checkbox.selected is False
assert checkbox.checked is True
assert checkbox.focused is False
def test_dict_tree_passes_through_native_bool_state() -> None:
tree = {
"type": "button",
"text": "Send",
"x": 0,
"y": 0,
"width": 10,
"height": 10,
"enabled": True,
"clickable": False,
}
elements = parse_ui_tree(tree)
assert len(elements) == 1
assert elements[0].enabled is True
assert elements[0].clickable is False
assert elements[0].selected is None
def test_to_dict_omits_unknown_state_fields_but_keeps_reported_false() -> None:
xml = """
"""
elements = parse_ui_tree(xml)
element = next(item for item in elements if item.type == "button")
data = element.to_dict()
assert data["enabled"] is False
assert "clickable" not in data
assert "selected" not in data
assert "checked" not in data
assert "focused" not in data