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,144 @@
using VideoDownloader.App;
using VideoDownloader.Core.Config;
using VideoDownloader.Tests.Infrastructure;
namespace VideoDownloader.Tests.E2E;
/// <summary>
/// UI 복잡 버전 RED 스펙 — §B 타이포그래피·폰트 유즈케이스(docs/UI_USECASES.md §B, UC-F01~F22).
/// RED 단계: 전부 실패하는 것이 정상이다.
/// </summary>
public class UiUsecaseTypographyRedTests
{
[Fact]
public void UC_F01_UI_기본_폰트를_설정으로_고를_수_있다()
=> SourceTree.Usecase(
SourceTree.PropertyExists(typeof(AppConfig), "UiFontFamily"),
"UC-F01", "AppConfig.UiFontFamily 속성이 필요하다");
[Fact]
public void UC_F02_UI_폰트_크기를_설정으로_바꿀_수_있다()
=> SourceTree.Usecase(
SourceTree.PropertyExists(typeof(AppConfig), "UiFontSize"),
"UC-F02", "AppConfig.UiFontSize 속성이 필요하다");
[Fact]
public void UC_F03_한국어_폴백_폰트를_직접_지정할_수_있다()
=> SourceTree.Usecase(
SourceTree.PropertyExists(typeof(AppConfig), "UiFontKoreanFallback"),
"UC-F03", "AppConfig.UiFontKoreanFallback 속성이 필요하다");
[Fact]
public void UC_F04_기본_폰트_크기_토큰이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.Base"),
"UC-F04", "Shared.xaml 에 FontSize.Base 토큰이 필요하다");
[Fact]
public void UC_F05_작은_폰트_크기_토큰이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.Small"),
"UC-F05", "FontSize.Small 토큰이 필요하다");
[Fact]
public void UC_F06_큰_폰트_크기_토큰이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.Large"),
"UC-F06", "FontSize.Large 토큰이 필요하다");
[Fact]
public void UC_F07_초대형_폰트_크기_토큰이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "FontSize.XLarge"),
"UC-F07", "FontSize.XLarge 토큰이 필요하다");
[Fact]
public void UC_F08_제목_H1_스타일이_공용으로_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "Type.H1"),
"UC-F08", "Type.H1 스타일 토큰이 필요하다");
[Fact]
public void UC_F09_본문_스타일이_공용으로_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "Type.Body"),
"UC-F09", "Type.Body 스타일 토큰이 필요하다");
[Fact]
public void UC_F10_캡션_스타일이_공용으로_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "Type.Caption"),
"UC-F10", "Type.Caption 스타일 토큰이 필요하다");
[Fact]
public void UC_F11_등폭_숫자_스타일이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "Type.Mono"),
"UC-F11", "진행률·속도 숫자용 Type.Mono 스타일이 필요하다");
[Fact]
public void UC_F12_한국어_가독성_프리셋_폰트가_후보에_포함된다()
=> SourceTree.Usecase(
SourceTree.SharedXaml.Contains("Pretendard"),
"UC-F12", "UiFont 폰트 후보에 Pretendard 가 포함되어야 한다");
[Fact]
public void UC_F13_설정창에_글꼴_섹션이_있다()
=> SourceTree.Usecase(
SourceTree.SettingsWindowXaml.Contains("글꼴"),
"UC-F13", "설정창에 '글꼴' 섹션이 필요하다");
[Fact]
public void UC_F14_글꼴_미리보기_컨트롤이_있다()
=> SourceTree.Usecase(
SourceTree.SettingsWindowXaml.Contains("Name=\"FontPreviewText\""),
"UC-F14", "설정창에 FontPreviewText 미리보기 컨트롤이 필요하다");
[Fact]
public void UC_F15_폰트_크기_프리셋_콤보박스가_있다()
=> SourceTree.Usecase(
SourceTree.SettingsWindowXaml.Contains("Name=\"FontSizeBox\""),
"UC-F15", "설정창에 FontSizeBox 콤보박스가 필요하다");
[Fact]
public void UC_F16_폰트_설정을_즉시_적용하는_API가_있다()
=> SourceTree.Usecase(
SourceTree.MethodExists(typeof(VideoDownloader.App.App), "ApplyFontSettings"),
"UC-F16", "App.ApplyFontSettings 로 폰트 설정이 재시작 없이 반영되어야 한다");
[Fact]
public void UC_F17_리더_모드에_폰트가_하드코딩되지_않는다()
=> SourceTree.Usecase(
!SourceTree.ReaderModeCs.Contains("Malgun Gothic"),
"UC-F17", "리더 모드 HTML 이 폰트를 하드코딩 대신 앱 설정에서 주입받아야 한다");
[Fact]
public void UC_F18_새_탭_다이얼에_폰트가_하드코딩되지_않는다()
=> SourceTree.Usecase(
!SourceTree.MainWindowCs.Contains("Malgun Gothic"),
"UC-F18", "새 탭 다이얼 인라인 CSS 의 폰트 폴백이 앱 공용 설정으로 통일되어야 한다");
[Fact]
public void UC_F19_탭_제목_공용_스타일이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "TabTitleStyle"),
"UC-F19", "탭 제목(말줄임 등)의 공용 스타일 TabTitleStyle 이 필요하다");
[Fact]
public void UC_F20_상태바_텍스트_공용_스타일이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "StatusTextStyle"),
"UC-F20", "상태바 텍스트 공용 스타일 StatusTextStyle 이 필요하다");
[Fact]
public void UC_F21_아이콘_크기_토큰이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "IconSize.Small"),
"UC-F21", "아이콘 크기 토큰 IconSize.Small 이 필요하다");
[Fact]
public void UC_F22_줄간격_토큰이_정의된다()
=> SourceTree.Usecase(
SourceTree.HasKey(SourceTree.SharedXaml, "Type.LineHeight"),
"UC-F22", "본문 줄간격 토큰 Type.LineHeight 가 필요하다");
}