""" Overlay Window Tests Tests for the main overlay window functionality including: - Window positioning and sizing - Tab navigation - Plugin display - Theme switching - Responsive behavior """ from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import Qt class OverlayWindowTests: """Test suite for overlay window.""" name = "Overlay Window" icon = "🪟" description = "Tests main overlay window functionality, tabs, navigation, and plugin display" def __init__(self): self.tests = { 'window_initialization': self.test_window_initialization, 'tab_navigation': self.test_tab_navigation, 'responsive_sidebar': self.test_responsive_sidebar, 'theme_toggle': self.test_theme_toggle, 'keyboard_shortcuts': self.test_keyboard_shortcuts, 'plugin_display': self.test_plugin_display, 'window_positioning': self.test_window_positioning, 'tray_icon': self.test_tray_icon, 'animation_smoothness': self.test_animation_smoothness, 'content_switching': self.test_content_switching, } def test_window_initialization(self) -> dict: """Test that overlay window initializes correctly.""" issues = [] try: from core.overlay_window import OverlayWindow from core.eu_styles import EUTheme # Check default theme if EUTheme.get_theme() not in ['dark', 'light']: issues.append("Default theme not set correctly") # Check minimum size constraints if OverlayWindow.__init__.__code__.co_filename: # Window should have minimum size set pass except ImportError as e: return { 'passed': False, 'message': f"Cannot import OverlayWindow: {e}", 'severity': 'error' } except Exception as e: return { 'passed': False, 'message': f"Unexpected error: {e}", 'severity': 'error' } if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'warning' } return { 'passed': True, 'message': "Overlay window initializes correctly", 'severity': 'info' } def test_tab_navigation(self) -> dict: """Test tab navigation functionality.""" issues = [] recommendations = [] # Check if tabs exist try: from core.overlay_window import OverlayWindow # Check that tab switching methods exist if not hasattr(OverlayWindow, '_switch_tab'): issues.append("Missing _switch_tab method") # Check that tab buttons are initialized if not hasattr(OverlayWindow, '_create_content_area_with_tabs'): issues.append("Missing tab content area creation") # Check expected tabs expected_tabs = ['plugins', 'widgets', 'settings'] except Exception as e: return { 'passed': False, 'message': f"Error checking tab navigation: {e}", 'severity': 'error' } if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'error', 'recommendation': "Ensure all tab navigation methods are implemented" } return { 'passed': True, 'message': "Tab navigation structure is correct", 'severity': 'info' } def test_responsive_sidebar(self) -> dict: """Test responsive sidebar behavior.""" try: from core.overlay_window import OverlayWindow from core.eu_styles import ResponsiveHelper # Check that resize event is handled if not hasattr(OverlayWindow, 'resizeEvent'): return { 'passed': False, 'message': "resizeEvent not implemented for responsive behavior", 'severity': 'warning', 'recommendation': "Implement resizeEvent to handle responsive sidebar" } # Check breakpoints if not hasattr(ResponsiveHelper, 'BREAKPOINTS'): return { 'passed': False, 'message': "Responsive breakpoints not defined", 'severity': 'error' } return { 'passed': True, 'message': f"Responsive breakpoints defined: {ResponsiveHelper.BREAKPOINTS}", 'severity': 'info' } except Exception as e: return { 'passed': False, 'message': f"Error checking responsive behavior: {e}", 'severity': 'error' } def test_theme_toggle(self) -> dict: """Test theme toggle functionality.""" try: from core.eu_styles import EUTheme, get_all_colors, EU_DARK_COLORS, EU_LIGHT_COLORS issues = [] # Check theme switching original_theme = EUTheme.get_theme() # Test dark theme EUTheme.set_theme('dark') dark_colors = get_all_colors() if dark_colors != EU_DARK_COLORS: issues.append("Dark theme colors don't match expected") # Test light theme EUTheme.set_theme('light') light_colors = get_all_colors() if light_colors != EU_LIGHT_COLORS: issues.append("Light theme colors don't match expected") # Restore original EUTheme.set_theme(original_theme) # Check theme toggle method exists in overlay from core.overlay_window import OverlayWindow if not hasattr(OverlayWindow, '_toggle_theme'): issues.append("_toggle_theme method missing from OverlayWindow") if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'warning' } return { 'passed': True, 'message': "Theme toggle functionality working", 'severity': 'info' } except Exception as e: return { 'passed': False, 'message': f"Error testing theme toggle: {e}", 'severity': 'error' } def test_keyboard_shortcuts(self) -> dict: """Test keyboard shortcut functionality.""" try: from core.overlay_window import OverlayWindow from core.hotkey_manager import HotkeyManager issues = [] recommendations = [] # Check that shortcuts are set up if not hasattr(OverlayWindow, '_setup_shortcuts'): issues.append("_setup_shortcuts method missing") # Check for expected shortcuts expected_shortcuts = ['Esc', 'Ctrl+T', 'Ctrl+1'] # Check hotkey manager try: hm = HotkeyManager() if not hasattr(hm, 'get_all_hotkeys'): issues.append("HotkeyManager missing get_all_hotkeys method") except Exception as e: recommendations.append(f"HotkeyManager not fully functional: {e}") if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'error', 'recommendation': "; ".join(recommendations) if recommendations else None } return { 'passed': True, 'message': f"Keyboard shortcuts configured", 'severity': 'info' } except Exception as e: return { 'passed': False, 'message': f"Error checking keyboard shortcuts: {e}", 'severity': 'error' } def test_plugin_display(self) -> dict: """Test plugin display in overlay.""" try: from core.overlay_window import OverlayWindow issues = [] # Check plugin loading if not hasattr(OverlayWindow, '_load_plugins'): issues.append("_load_plugins method missing") if not hasattr(OverlayWindow, 'plugin_stack'): issues.append("plugin_stack not defined (will be created at runtime)") # Check sidebar buttons if not hasattr(OverlayWindow, 'sidebar_buttons'): issues.append("sidebar_buttons not initialized") if issues: return { 'passed': len(issues) == 1 and 'runtime' in issues[0].lower(), 'message': "; ".join(issues), 'severity': 'warning' if len(issues) == 1 else 'error' } return { 'passed': True, 'message': "Plugin display structure correct", 'severity': 'info' } except Exception as e: return { 'passed': False, 'message': f"Error checking plugin display: {e}", 'severity': 'error' } def test_window_positioning(self) -> dict: """Test window positioning and persistence.""" try: from core.overlay_window import OverlayWindow issues = [] recommendations = [] # Check center window method if not hasattr(OverlayWindow, '_center_window'): issues.append("_center_window method missing") # Check for position persistence (would need settings) recommendations.append("Consider implementing window position persistence") # Check always on top # This is set in _setup_window via Qt.WindowStaysOnTopHint if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'warning' } return { 'passed': True, 'message': "Window positioning features present", 'severity': 'info', 'recommendation': recommendations[0] if recommendations else None } except Exception as e: return { 'passed': False, 'message': f"Error checking window positioning: {e}", 'severity': 'error' } def test_tray_icon(self) -> dict: """Test system tray icon functionality.""" try: from core.overlay_window import OverlayWindow issues = [] # Check tray setup if not hasattr(OverlayWindow, '_setup_tray'): issues.append("_setup_tray method missing") # Check tray icon attribute if not hasattr(OverlayWindow, 'tray_icon'): issues.append("tray_icon attribute not defined") # Check tray activation if not hasattr(OverlayWindow, '_tray_activated'): issues.append("_tray_activated method missing") if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'warning' } return { 'passed': True, 'message': "System tray functionality present", 'severity': 'info' } except Exception as e: return { 'passed': False, 'message': f"Error checking tray icon: {e}", 'severity': 'error' } def test_animation_smoothness(self) -> dict: """Test animation smoothness.""" try: from core.overlay_window import OverlayWindow from core.eu_styles import AnimationHelper issues = [] recommendations = [] # Check animation setup if not hasattr(OverlayWindow, '_setup_animations'): issues.append("_setup_animations method missing") # Check animation helper if not hasattr(AnimationHelper, 'fade_in'): issues.append("AnimationHelper.fade_in not available") # Check animation durations (should be reasonable) recommendations.append("Animation duration should be 150-300ms for optimal UX") if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'warning' } return { 'passed': True, 'message': "Animation system present", 'severity': 'info', 'recommendation': recommendations[0] if recommendations else None } except Exception as e: return { 'passed': False, 'message': f"Error checking animations: {e}", 'severity': 'error' } def test_content_switching(self) -> dict: """Test content switching between tabs/plugins.""" try: from core.overlay_window import OverlayWindow issues = [] # Check content area creation if not hasattr(OverlayWindow, '_create_content_area_with_tabs'): issues.append("Tab content area creation missing") # Check tab switching if not hasattr(OverlayWindow, '_switch_tab'): issues.append("Tab switching method missing") # Check plugin switching if not hasattr(OverlayWindow, '_on_plugin_selected'): issues.append("Plugin selection handler missing") if issues: return { 'passed': False, 'message': "; ".join(issues), 'severity': 'error' } return { 'passed': True, 'message': "Content switching mechanisms present", 'severity': 'info' } except Exception as e: return { 'passed': False, 'message': f"Error checking content switching: {e}", 'severity': 'error' }