from types import SimpleNamespace
from unittest.mock import MagicMock
import pytest
from windows_mcp.desktop.views import Size
from windows_mcp.tree.service import Tree
@pytest.fixture
def tree_instance():
mock_desktop = MagicMock()
mock_desktop.get_screen_size.return_value = Size(width=1920, height=1080)
return Tree(mock_desktop)
class TestAppNameCorrection:
def test_progman(self, tree_instance):
assert tree_instance.app_name_correction("Progman") == "Desktop"
def test_shell_traywnd(self, tree_instance):
assert tree_instance.app_name_correction("Shell_TrayWnd") == "Taskbar"
def test_shell_secondary_traywnd(self, tree_instance):
assert tree_instance.app_name_correction("Shell_SecondaryTrayWnd") == "Taskbar"
def test_popup_window_site_bridge(self, tree_instance):
assert (
tree_instance.app_name_correction("Microsoft.UI.Content.PopupWindowSiteBridge")
== "Context Menu"
)
def test_passthrough(self, tree_instance):
assert tree_instance.app_name_correction("Notepad") == "Notepad"
assert tree_instance.app_name_correction("Calculator") == "Calculator"
class TestIouBoundingBox:
def test_full_overlap(self, tree_instance):
window = SimpleNamespace(left=0, top=0, right=500, bottom=500)
element = SimpleNamespace(left=100, top=100, right=200, bottom=200)
result = tree_instance.iou_bounding_box(window, element)
assert result.left == 100
assert result.top == 100
assert result.right == 200
assert result.bottom == 200
assert result.width == 100
assert result.height == 100
def test_partial_overlap(self, tree_instance):
window = SimpleNamespace(left=0, top=0, right=150, bottom=150)
element = SimpleNamespace(left=100, top=100, right=200, bottom=200)
result = tree_instance.iou_bounding_box(window, element)
assert result.left == 100
assert result.top == 100
assert result.right == 150
assert result.bottom == 150
assert result.width == 50
assert result.height == 50
def test_no_overlap(self, tree_instance):
window = SimpleNamespace(left=0, top=0, right=50, bottom=50)
element = SimpleNamespace(left=100, top=100, right=200, bottom=200)
result = tree_instance.iou_bounding_box(window, element)
assert result.width == 0
assert result.height == 0
def test_screen_clamping(self, tree_instance):
# Element extends beyond screen (1920x1080)
window = SimpleNamespace(left=0, top=0, right=2000, bottom=2000)
element = SimpleNamespace(left=1900, top=1060, right=2000, bottom=1200)
result = tree_instance.iou_bounding_box(window, element)
assert result.left == 1900
assert result.top == 1060
assert result.right == 1920
assert result.bottom == 1080
assert result.width == 20
assert result.height == 20