""" Unit Tests - Window Manager =========================== Tests for EU window detection, focus tracking, and overlay positioning. """ import pytest import sys from unittest.mock import Mock, patch, MagicMock class TestWindowManager: """Test Window Manager functionality.""" def test_window_manager_singleton(self): """Test WindowManager is a singleton.""" from core.window_manager import WindowManager, get_window_manager wm1 = get_window_manager() wm2 = get_window_manager() assert wm1 is wm2 def test_window_manager_initialization(self): """Test window manager initialization.""" from core.window_manager import WindowManager wm = WindowManager() assert wm._initialized is True assert hasattr(wm, '_window_handle') assert hasattr(wm, '_window_info') def test_window_manager_availability_linux(self): """Test window manager availability on Linux.""" from core.window_manager import WindowManager with patch.object(sys, 'platform', 'linux'): wm = WindowManager() assert wm.is_available() is False @pytest.mark.skipif(sys.platform != 'win32', reason="Windows only") def test_find_eu_window_not_running(self): """Test finding EU window when not running.""" from core.window_manager import get_window_manager wm = get_window_manager() # This will fail to find EU on systems without the game window = wm.find_eu_window() # Should return None or WindowInfo assert window is None or hasattr(window, 'title') def test_window_info_dataclass(self): """Test WindowInfo dataclass.""" from core.window_manager import WindowInfo info = WindowInfo( handle=12345, title="Test Window", pid=67890, rect=(0, 0, 800, 600), width=800, height=600, is_visible=True, is_focused=False ) assert info.handle == 12345 assert info.title == "Test Window" assert info.width == 800 assert info.height == 600 def test_process_info_dataclass(self): """Test ProcessInfo dataclass.""" from core.window_manager import ProcessInfo info = ProcessInfo( pid=12345, name="entropia.exe", executable_path="C:/Games/entropia.exe", memory_usage=1024000, cpu_percent=5.5 ) assert info.pid == 12345 assert info.name == "entropia.exe" class TestOverlayWindow: """Test Overlay Window functionality.""" def test_overlay_window_initialization(self, mock_plugin_manager): """Test overlay window initialization.""" pytest.importorskip("PyQt6") from PyQt6.QtWidgets import QApplication # Need a QApplication for QWidget app = QApplication.instance() or QApplication([]) from core.overlay_window import OverlayWindow with patch.object(OverlayWindow, '_setup_window'): with patch.object(OverlayWindow, '_setup_ui'): with patch.object(OverlayWindow, '_setup_tray'): with patch.object(OverlayWindow, '_setup_shortcuts'): with patch.object(OverlayWindow, '_setup_animations'): window = OverlayWindow(mock_plugin_manager) assert window.plugin_manager == mock_plugin_manager assert window.is_visible is False def test_overlay_window_properties(self, mock_plugin_manager): """Test overlay window properties.""" pytest.importorskip("PyQt6") from PyQt6.QtWidgets import QApplication app = QApplication.instance() or QApplication([]) from core.overlay_window import OverlayWindow with patch.object(OverlayWindow, '_setup_window'): with patch.object(OverlayWindow, '_setup_ui'): with patch.object(OverlayWindow, '_setup_tray'): with patch.object(OverlayWindow, '_setup_shortcuts'): with patch.object(OverlayWindow, '_setup_animations'): window = OverlayWindow(mock_plugin_manager) # Test signals exist assert hasattr(window, 'visibility_changed') assert hasattr(window, 'theme_changed') class TestActivityBar: """Test Activity Bar functionality.""" def test_activity_bar_config_defaults(self): """Test activity bar default configuration.""" from core.activity_bar import ActivityBarConfig config = ActivityBarConfig() assert config.enabled is True assert config.position == "bottom" assert config.icon_size == 32 assert config.auto_hide is True assert config.auto_hide_delay == 3000 assert config.pinned_plugins == [] def test_activity_bar_config_serialization(self): """Test activity bar config serialization.""" from core.activity_bar import ActivityBarConfig config = ActivityBarConfig( enabled=False, position="top", icon_size=48, pinned_plugins=["plugin1", "plugin2"] ) data = config.to_dict() assert data["enabled"] is False assert data["position"] == "top" assert data["icon_size"] == 48 assert data["pinned_plugins"] == ["plugin1", "plugin2"] def test_activity_bar_config_deserialization(self): """Test activity bar config deserialization.""" from core.activity_bar import ActivityBarConfig data = { "enabled": False, "position": "top", "icon_size": 40, "auto_hide": False, "auto_hide_delay": 5000, "pinned_plugins": ["plugin1"] } config = ActivityBarConfig.from_dict(data) assert config.enabled is False assert config.position == "top" assert config.icon_size == 40 assert config.auto_hide is False assert config.pinned_plugins == ["plugin1"] class TestDashboard: """Test Dashboard functionality.""" def test_dashboard_widget_base(self): """Test dashboard widget base class.""" pytest.importorskip("PyQt6") from PyQt6.QtWidgets import QApplication app = QApplication.instance() or QApplication([]) from core.dashboard import DashboardWidget widget = DashboardWidget() assert widget.name == "Widget" assert widget.description == "Base widget" assert widget.size == (1, 1) def test_dashboard_widget_signals(self): """Test dashboard widget signals.""" pytest.importorskip("PyQt6") from PyQt6.QtWidgets import QApplication app = QApplication.instance() or QApplication([]) from core.dashboard import Dashboard with patch.object(Dashboard, '_setup_ui'): with patch.object(Dashboard, '_add_default_widgets'): dashboard = Dashboard() assert hasattr(dashboard, 'widget_added') assert hasattr(dashboard, 'widget_removed') class TestMultiMonitorSupport: """Test multi-monitor support.""" def test_screen_detection(self): """Test screen detection.""" pytest.importorskip("PyQt6") from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import QRect app = QApplication.instance() or QApplication([]) screens = app.screens() # Should have at least one screen assert len(screens) >= 1 for screen in screens: assert screen.geometry().width() > 0 assert screen.geometry().height() > 0