using VideoDownloader.Core.Config; using VideoDownloader.Tests.Infrastructure; namespace VideoDownloader.Tests.E2E; /// /// UI 복잡 버전 RED 스펙 — §J 상태 표시·알림·피드백 유즈케이스(docs/UI_USECASES.md §J, UC-N01~N20). /// RED 단계: 전부 실패하는 것이 정상이다. /// public class UiUsecaseStatusRedTests { [Fact] public void UC_N01_상태바에_전체_다운로드_진행률이_표시된다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("AggregateProgress"), "UC-N01", "상태바 통합 진행률(AggregateProgress) 요소가 필요하다"); [Fact] public void UC_N02_토스트_호스트가_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ToastHost"), "UC-N02", "알림 토스트 컨테이너(ToastHost)가 필요하다"); [Fact] public void UC_N03_토스트_표시_시간을_설정한다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "ToastDurationMs"), "UC-N03", "AppConfig.ToastDurationMs 속성이 필요하다"); [Fact] public void UC_N04_치명_오류_배너가_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ErrorBanner"), "UC-N04", "상단 고정 오류 배너(ErrorBanner)가 필요하다"); [Fact] public void UC_N05_오류_상세를_펼쳐_볼_수_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ErrorDetailExpander"), "UC-N05", "오류 상세 펼침(ErrorDetailExpander) 요소가 필요하다"); [Fact] public void UC_N06_클립보드_URL_감지_제안이_뜬다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ClipboardHint"), "UC-N06", "클립보드 URL 감지 배지(ClipboardHint)가 필요하다"); [Fact] public void UC_N07_원격_서버_상태가_상시_표시된다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ServerStatusIcon"), "UC-N07", "서버 상태 아이콘(ServerStatusIcon)이 필요하다"); [Fact] public void UC_N08_툴바에서_QR_페어링을_바로_연다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("PairingBtn"), "UC-N08", "툴바 페어링 버튼(PairingBtn)이 필요하다"); [Fact] public void UC_N09_업데이트_가능_배지가_뜬다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("UpdateBadge"), "UC-N09", "새 버전 알림 배지(UpdateBadge)가 필요하다"); [Fact] public void UC_N10_차단_도메인별_통계가_보인다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("ShieldDomainStats"), "UC-N10", "도메인별 차단 통계(ShieldDomainStats)가 필요하다"); [Fact] public void UC_N11_네트워크_끊김이_표시된다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("NetworkChange"), "UC-N11", "NetworkChange 오프라인 감지 처리가 필요하다"); [Fact] public void UC_N12_절전_모드_진입_시_일시정지_옵션이_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "PauseOnPowerSaver"), "UC-N12", "AppConfig.PauseOnPowerSaver 속성이 필요하다"); [Fact] public void UC_N13_상태바_텍스트를_클릭해_복사한다() => SourceTree.Usecase( SourceTree.MainWindowCs.Contains("CopyStatus_Click"), "UC-N13", "상태 복사(CopyStatus_Click) 처리기가 필요하다"); [Fact] public void UC_N14_알림_센터가_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("NotificationCenter"), "UC-N14", "지나간 알림 목록(NotificationCenter)이 필요하다"); [Fact] public void UC_N15_방해_금지_모드를_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "DoNotDisturb"), "UC-N15", "AppConfig.DoNotDisturb 속성이 필요하다"); [Fact] public void UC_N16_온보딩_안내가_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("Onboarding") || SourceTree.MainWindowCs.Contains("Onboarding"), "UC-N16", "첫 실행 온보딩(Onboarding) 요소가 필요하다"); [Fact] public void UC_N17_빈_상태_공용_스타일이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "EmptyStateStyle"), "UC-N17", "빈 상태 공용 스타일(EmptyStateStyle) 토큰이 필요하다"); [Fact] public void UC_N18_크래시_리포트_대화상자가_있다() => SourceTree.Usecase( SourceTree.FindType("CrashReportDialog") is not null, "UC-N18", "충돌 리포트 대화상자(CrashReportDialog)가 필요하다"); [Fact] public void UC_N19_다운로드_버튼에_진행_개수_배지가_뜬다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("DownloadsBtnBadge"), "UC-N19", "툴바 다운로드 버튼 배지(DownloadsBtnBadge)가 필요하다"); [Fact] public void UC_N20_상태바_우측_보조_정보_영역이_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("StatusRight"), "UC-N20", "상태바 우측 정보 영역(StatusRight)이 필요하다"); }