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