using System; using System.IO; using System.Text.RegularExpressions; using Paca.App.Services; using Paca.Tests.Infrastructure; using Xunit; namespace Paca.Tests.E2E; /// /// Phase 4 심화 하드닝 게이트 (TDD 선행 RED): /// - Gate 401: MainWindow의 Ctrl+Shift+P 전체 일시정지 단축키(pauseall) 배선 무결성 /// - Gate 402: 미디어 팝업 및 사이트 정보 내 하드코딩 색상(#FF4444, #10B981)의 시맨틱 브러시 일체화 /// - Gate 403: ShortcutManager 기본 단축키 목록과 MainWindow 키 라우터 전수 패리티 검증 /// public class DesktopUiAndShortcutHardeningPhase4Tests { private static readonly string AppDir = Path.Combine(SourceTree.Root, "src", "Paca.App"); // ========================================================================= // Gate 401: MainWindow Ctrl+Shift+P 단축키 배선 검증 // ========================================================================= [Fact] public void Gate401_MainWindow_PauseAll_Shortcut_CtrlShiftP_Audit() { var mwCs = File.ReadAllText(Path.Combine(AppDir, "MainWindow.xaml.cs")); // OnPreviewKeyDown 에서 Ctrl+Shift+P 입력 시 PauseAllDownloads() 호출 보증 var pattern = @"ModifierKeys\.Control\s*\|\s*ModifierKeys\.Shift\)\s*&&\s*e\.Key\s*==\s*Key\.P\b"; Assert.Matches(pattern, mwCs); Assert.Contains("PauseAllDownloads", mwCs); } // ========================================================================= // Gate 402: 하드코딩 색상(#FF4444, #10B981) 시맨틱 브러시 일체화 // ========================================================================= [Fact] public void Gate402_MainWindow_SemanticBrushes_NoHardcodedHex_In_Popups() { var mwXaml = File.ReadAllText(Path.Combine(AppDir, "MainWindow.xaml")); // 1) 라인 2695 미디어 팝업 헤더 텍스트 하드코딩 #FF4444 금지 Assert.DoesNotContain("Foreground=\"#FF4444\"", mwXaml); // 2) 라인 2908 사이트 보안 안전한 연결 텍스트 하드코딩 #10B981 금지 Assert.DoesNotContain("Foreground=\"#10B981\"", mwXaml); // 3) 해당 위치가 시맨틱 브러시(ErrorBrush, SuccessBrush)로 대체되었는지 검증 Assert.Contains("Foreground=\"{DynamicResource ErrorBrush}\"", mwXaml); Assert.Contains("Foreground=\"{DynamicResource SuccessBrush}\"", mwXaml); } // ========================================================================= // Gate 403: ShortcutManager 기본 단축키와 MainWindow 라우터 전수 패리티 // ========================================================================= [Fact] public void Gate403_ShortcutManager_AllDefaultShortcuts_AreHandled_OrMappable() { var mwCs = File.ReadAllText(Path.Combine(AppDir, "MainWindow.xaml.cs")); // ShortcutManager 에 선언된 핵심 기본 단축키 액션들이 MainWindow 에 실제로 배선되어 있는지 검증 var coreActions = new[] { "newtab", "closetab", "reopentab", "find", "address", "downloads", "palette", "devtools", "fullscreen", "refresh", "print", "pauseall" }; foreach (var action in coreActions) { Assert.True(ShortcutManager.Defaults.ContainsKey(action), $"ShortcutManager.Defaults 에 '{action}' 이 선언되어 있어야 합니다."); } // pauseall 이 MainWindow.xaml.cs 에 단축키 키 핸들러로 등록되어 있는지 확인 Assert.Contains("PauseAllDownloads", mwCs); } }