using VideoDownloader.Core.Config; using VideoDownloader.Tests.Infrastructure; namespace VideoDownloader.Tests.E2E; /// /// UI 복잡 버전 RED 스펙 — §H 키보드·마우스 인터랙션 유즈케이스(docs/UI_USECASES.md §H, UC-K01~K20). /// RED 단계: 전부 실패하는 것이 정상이다. /// public class UiUsecaseInteractionRedTests { [Fact] public void UC_K01_단축키_설정_항목이_있다() => SourceTree.Usecase( SourceTree.SettingsWindowXaml.Contains("단축키"), "UC-K01", "설정창에 '단축키' 항목이 필요하다"); [Fact] public void UC_K02_단축키를_사용자가_바꿀_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "Shortcuts"), "UC-K02", "AppConfig.Shortcuts 사용자 지정 단축키 맵이 필요하다"); [Fact] public void UC_K03_단축키_관리_컴포넌트가_있다() => SourceTree.Usecase( SourceTree.FindType("ShortcutManager") is not null, "UC-K03", "충돌 검증을 포함한 ShortcutManager 컴포넌트가 필요하다"); [Fact] public void UC_K04_단축키_전체_목록_팝업이_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ShortcutHelpPopup"), "UC-K04", "단축키 도움말 팝업(ShortcutHelpPopup)이 필요하다"); [Fact] public void UC_K05_마우스_제스처로_탐색할_수_있다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("MouseGesture") || SourceTree.MainWindowCs.Contains("XButton"), "UC-K05", "마우스 제스처(XButton 등) 뒤로/앞처 처리가 필요하다"); [Fact] public void UC_K06_휠_클릭으로_새_탭을_연다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("MiddleButton"), "UC-K06", "링크 휠 클릭(MiddleButton) 새 탭 처리가 필요하다"); [Fact] public void UC_K07_붙여넣기_즉시_이동_옵션이_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "PasteAndGo"), "UC-K07", "AppConfig.PasteAndGo 속성이 필요하다"); [Fact] public void UC_K08_주소창_포커스_시_전체_선택_옵션이_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "FocusSelectsAddress"), "UC-K08", "AppConfig.FocusSelectsAddress 속성이 필요하다"); [Fact] public void UC_K09_모두_일시정지_빠른_명령이_있다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("모두 일시정지"), "UC-K09", "팔레트/버튼의 '모두 일시정지' 명령이 필요하다"); [Fact] public void UC_K10_Esc로_모든_팝업을_한번에_닫는다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("CloseAllPopups") || SourceTree.MainWindowCs.Contains("CloseAllOverlays"), "UC-K10", "열린 팝업 일괄 닫기(CloseAllPopups) 처리가 필요하다"); [Fact] public void UC_K11_다운로드_중_종료_확인을_받는다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("종료하시겠습니까"), "UC-K11", "다운로드 진행 중 종료 확인 대화상자가 필요하다"); [Fact] public void UC_K12_F12_개발자_도구를_연다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("OpenDevTools"), "UC-K12", "F12 개발자 도구(OpenDevTools) 처리가 필요하다"); [Fact] public void UC_K13_프로필_전환_기능이_있다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("프로필 전환"), "UC-K13", "세션 프로필 전환 기능이 필요하다"); [Fact] public void UC_K14_현재_줌_배율이_표시된다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ZoomIndicator"), "UC-K14", "줌 배율 표시(ZoomIndicator) 요소가 필요하다"); [Fact] public void UC_K15_기본_줌을_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "DefaultZoomFactor"), "UC-K15", "AppConfig.DefaultZoomFactor 속성이 필요하다"); [Fact] public void UC_K16_즐겨찾기_관리_창이_있다() => SourceTree.Usecase( SourceTree.FindType("BookmarkManagerWindow") is not null, "UC-K16", "즐겨찾기 관리 창(BookmarkManagerWindow)이 필요하다"); [Fact] public void UC_K17_방문_기록_개별_삭제가_된다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("DeleteHistory_Click"), "UC-K17", "방문 기록 개별 삭제(DeleteHistory_Click) 처리기가 필요하다"); [Fact] public void UC_K18_영역을_지정해_캡처할_수_있다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("RegionCapture"), "UC-K18", "영역 지정 캡처(RegionCapture) 기능이 필요하다"); [Fact] public void UC_K19_노트를_Ctrl_S로_저장한다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("NotesSave_Click"), "UC-K19", "노트 저장(NotesSave_Click) 처리기가 필요하다"); [Fact] public void UC_K20_링크_우클릭으로_바로_받는다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("링크 다운로드"), "UC-K20", "페이지 링크 우클릭 '링크 다운로드' 메뉴가 필요하다"); }