UI 복잡 버전 234 RED→GREEN 완료(docs/UI_USECASES.md §A~§J): 라이브 테마 전환(DynamicResource 전환+ThemeResolver+HighContrast 테마, 재시작 없음), 디자인 토큰 체계·WCAG 대비 결함 5건 수정, 설정창 카테고리 내비/검색 재구성+AppConfig 40여 속성, 다운로드 관리자(속도/ETA/세그먼트맵/전체 일시정지-이어받기/CSV 내보내기/예약 게이트/중복 확인), 라이브러리·아카이브·작업공간·재생목록·즐겨찾기 편집 뷰, 접근성(자동화 속성 30여 개·커스텀 피어·docs/ACCESSIBILITY.md), 인터랙션(휠 클릭 새 탭·XButton 탐색·F12·영역 캡처·프로필 전환), 상태/알림(토스트·알림센터·온보딩·CrashReportDialog). 보강 테스트 35건+실창 E2E 4건(StaDispatcher 기반 — 프록시 설정이 기시작 핸들러를 건드리는 크래시 실결함 수정 포함) — 453/453 GREEN. 이전 미커밋 작업(CI 워크플로·Mdns·QueueHub·UpdateChecker·AGENTS/CLAUDE·빌드 스크립트) 일괄 포함

This commit is contained in:
Yun Chan 2026-08-17 15:54:53 +09:00
parent 5a0ce730b2
commit 17f2f91152
88 changed files with 9463 additions and 1127 deletions

View file

@ -0,0 +1,131 @@
using VideoDownloader.Core.Config;
using VideoDownloader.Tests.Infrastructure;
namespace VideoDownloader.Tests.E2E;
/// <summary>
/// UI 복잡 버전 RED 스펙 — §H 키보드·마우스 인터랙션 유즈케이스(docs/UI_USECASES.md §H, UC-K01~K20).
/// RED 단계: 전부 실패하는 것이 정상이다.
/// </summary>
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", "페이지 링크 우클릭 '링크 다운로드' 메뉴가 필요하다");
}