basic qt widgets support
This commit is contained in:
126
tests/test_widgets.py
Normal file
126
tests/test_widgets.py
Normal file
@@ -0,0 +1,126 @@
|
||||
"""Tests for Qt Widget introspection tools (listWidgets, selectWidget, etc.)."""
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
class TestWidgetTools:
|
||||
"""Verify listWidgets, selectWidget, getWidgetProperties, getWidgetAttributes."""
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_tools_listed(self, bridge):
|
||||
tools = bridge.list_tools()
|
||||
names = [t["name"] for t in tools]
|
||||
for expected in ["listWidgets", "selectWidget",
|
||||
"getWidgetProperties", "getWidgetAttributes"]:
|
||||
assert expected in names, f"Missing tool: {expected}"
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_list_widgets(self, connected_bridge):
|
||||
widgets = connected_bridge.call_tool("listWidgets")
|
||||
assert isinstance(widgets, list), f"Expected list, got: {type(widgets)}"
|
||||
assert len(widgets) >= 1, "No widgets found"
|
||||
|
||||
# Should have a top-level window
|
||||
types = [w.get("type", "") for w in widgets]
|
||||
assert any("QWidget" in t for t in types), \
|
||||
f"No QWidget-type root found: {types}"
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_select_widget(self, connected_bridge):
|
||||
widgets = connected_bridge.call_tool("listWidgets")
|
||||
assert isinstance(widgets, list) and len(widgets) > 0
|
||||
|
||||
# Find the first Button-like widget
|
||||
def find_buttons(items_list):
|
||||
buttons = []
|
||||
for item in items_list:
|
||||
if "Button" in (item.get("type", "")) or "PushButton" in (item.get("type", "")):
|
||||
buttons.append(item.get("name", ""))
|
||||
buttons.extend(find_buttons(item.get("children", [])))
|
||||
return buttons
|
||||
|
||||
buttons = find_buttons(widgets)
|
||||
if buttons:
|
||||
addr = buttons[0]
|
||||
else:
|
||||
addr = widgets[0].get("name", "")
|
||||
|
||||
result = connected_bridge.call_tool("selectWidget", {"address": addr})
|
||||
assert isinstance(result, dict), f"selectWidget failed: {result}"
|
||||
assert result.get("propertyCount", 0) > 0, \
|
||||
f"No properties for widget {addr}: {result}"
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_get_widget_properties(self, connected_bridge):
|
||||
widgets = connected_bridge.call_tool("listWidgets")
|
||||
assert isinstance(widgets, list) and len(widgets) > 0
|
||||
|
||||
addr = widgets[0].get("name", "")
|
||||
if not addr:
|
||||
pytest.skip("No widget address found")
|
||||
|
||||
props = connected_bridge.call_tool("getWidgetProperties", {"address": addr})
|
||||
assert isinstance(props, dict), f"getWidgetProperties failed: {props}"
|
||||
assert "properties" in props, f"No 'properties' key: {list(props.keys())}"
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_widget_has_geometry(self, connected_bridge):
|
||||
"""Verify a widget has geometry properties (x, y, width, height)."""
|
||||
widgets = connected_bridge.call_tool("listWidgets")
|
||||
assert isinstance(widgets, list) and len(widgets) > 0
|
||||
|
||||
addr = widgets[0].get("name", "")
|
||||
if not addr:
|
||||
pytest.skip("No widget address found")
|
||||
|
||||
props = connected_bridge.call_tool("getWidgetProperties", {"address": addr})
|
||||
simple = props.get("properties", {})
|
||||
for key in ("x", "y", "width", "height"):
|
||||
assert key in simple, f"Widget missing '{key}' property"
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_widget_attributes(self, connected_bridge):
|
||||
"""Verify getWidgetAttributes returns attribute flags for a widget."""
|
||||
widgets = connected_bridge.call_tool("listWidgets")
|
||||
assert isinstance(widgets, list) and len(widgets) > 0
|
||||
|
||||
# Find the checkBox widget (has various attributes)
|
||||
def find_named(items_list):
|
||||
for item in items_list:
|
||||
name = item.get("name", "")
|
||||
if "check" in name.lower() or "CheckBox" in (item.get("type", "")):
|
||||
return name
|
||||
found = find_named(item.get("children", []))
|
||||
if found:
|
||||
return found
|
||||
return None
|
||||
|
||||
addr = find_named(widgets)
|
||||
if not addr:
|
||||
addr = widgets[0].get("name", "")
|
||||
|
||||
attrs = connected_bridge.call_tool("getWidgetAttributes", {"address": addr})
|
||||
assert isinstance(attrs, dict), f"getWidgetAttributes failed: {attrs}"
|
||||
assert "attributes" in attrs, f"No 'attributes' key: {list(attrs.keys())}"
|
||||
assert attrs.get("count", 0) > 0, "No widget attributes returned"
|
||||
# Should at least have some standard attributes
|
||||
attr_names = list(attrs.get("attributes", {}).keys())
|
||||
assert len(attr_names) > 0, "Empty attributes list"
|
||||
|
||||
@pytest.mark.probe
|
||||
def test_widget_enabled_attribute(self, connected_bridge):
|
||||
"""Verify attributes contain 'enabled' field."""
|
||||
widgets = connected_bridge.call_tool("listWidgets")
|
||||
assert isinstance(widgets, list) and len(widgets) > 0
|
||||
|
||||
addr = widgets[0].get("name", "")
|
||||
if not addr:
|
||||
pytest.skip("No widget address found")
|
||||
|
||||
attrs = connected_bridge.call_tool("getWidgetAttributes", {"address": addr})
|
||||
attributes = attrs.get("attributes", {})
|
||||
# Check at least one attribute has enabled/value keys
|
||||
for attr_name, attr_data in attributes.items():
|
||||
if isinstance(attr_data, dict) and "enabled" in attr_data:
|
||||
return # Found one
|
||||
pytest.skip("No attributes with 'enabled' field found")
|
||||
Reference in New Issue
Block a user