using VideoDownloader.App; using VideoDownloader.Core.Config; using VideoDownloader.Tests.Infrastructure; namespace VideoDownloader.Tests.E2E; /// /// UI 복잡 버전 RED 스펙 — §C 레이아웃·밀도·창 상태 유즈케이스(docs/UI_USECASES.md §C, UC-L01~L26). /// RED 단계: 전부 실패하는 것이 정상이다. /// public class UiUsecaseLayoutRedTests { [Fact] public void UC_L01_UI_밀도_설정이_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "UiDensity"), "UC-L01", "컴팩트/보통/여유 밀도를 고르는 AppConfig.UiDensity 가 필요하다"); [Fact] public void UC_L02_설정창에서_밀도를_바꿀_수_있다() => SourceTree.Usecase( SourceTree.SettingsWindowXaml.Contains("밀도"), "UC-L02", "설정창에 '밀도' 항목이 노출되어야 한다"); [Fact] public void UC_L03_작은_간격_토큰이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "Spacing.S"), "UC-L03", "간격 토큰 Spacing.S 가 필요하다"); [Fact] public void UC_L04_중간_간격_토큰이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "Spacing.M"), "UC-L04", "간격 토큰 Spacing.M 이 필요하다"); [Fact] public void UC_L05_큰_간격_토큰이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "Spacing.L"), "UC-L05", "간격 토큰 Spacing.L 이 필요하다"); [Fact] public void UC_L06_카드_모서리_둥글기_토큰이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "CornerRadius.Card"), "UC-L06", "카드 둥근 모서리 토큰 CornerRadius.Card 가 필요하다"); [Fact] public void UC_L07_컴팩트_모드_상태가_저장된다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "CompactMode"), "UC-L07", "AppConfig.CompactMode 로 재시작 후에도 컴팩트 상태가 유지되어야 한다"); [Fact] public void UC_L08_툴바에_컴팩트_토글_버튼이_있다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("Name=\"CompactModeBtn\""), "UC-L08", "툴바의 CompactModeBtn 로 컴팩트 모드를 빠르게 켜고 끌 수 있어야 한다"); [Fact] public void UC_L09_세로_탭_기본_여부를_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "VerticalTabsDefault"), "UC-L09", "AppConfig.VerticalTabsDefault 속성이 필요하다"); [Fact] public void UC_L10_분할_화면_비율이_저장된다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "SplitViewRatio"), "UC-L10", "분할 화면 비율(AppConfig.SplitViewRatio)이 저장·복원되어야 한다"); [Fact] public void UC_L11_창_위치_크기가_저장된다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "WindowBounds"), "UC-L11", "AppConfig.WindowBounds 로 창 위치·크기가 복원되어야 한다"); [Fact] public void UC_L12_최대화_상태가_저장된다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "WindowMaximized"), "UC-L12", "AppConfig.WindowMaximized 로 최대화 여부가 복원되어야 한다"); [Fact] public void UC_L13_루트_요소가_레이아웃_반올림을_켠다() => SourceTree.Usecase( SourceTree.MainWindowXaml.Contains("UseLayoutRounding"), "UC-L13", "MainWindow 가 UseLayoutRounding 으로 고DPI 흐림을 방지해야 한다"); [Fact] public void UC_L14_공용_스타일이_픽셀_정렬을_켠다() => SourceTree.Usecase( SourceTree.SharedXaml.Contains("SnapsToDevicePixels"), "UC-L14", "Shared.xaml 스타일이 SnapsToDevicePixels 로 선명도를 보장해야 한다"); [Fact] public void UC_L15_상태바_자동_숨김을_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "StatusBarAutoHide"), "UC-L15", "AppConfig.StatusBarAutoHide 속성이 필요하다"); [Fact] public void UC_L16_툴바_버튼_노출을_직접_고른다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "ToolbarButtons"), "UC-L16", "AppConfig.ToolbarButtons 로 버튼 표시 여부를 지정할 수 있어야 한다"); [Fact] public void UC_L17_북마크바_표시_여부가_저장된다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "BookmarkBarVisible"), "UC-L17", "AppConfig.BookmarkBarVisible 속성이 필요하다"); [Fact] public void UC_L18_탭_스트립_위치를_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "TabStripPosition"), "UC-L18", "AppConfig.TabStripPosition 로 탭 스트립 위치를 고를 수 있어야 한다"); [Fact] public void UC_L19_패널_폭을_더블클릭으로_초기화한다() => SourceTree.Usecase( SourceTree.MethodExists(typeof(MainWindow), "ResetPanelWidth"), "UC-L19", "MainWindow.ResetPanelWidth 로 패널 폭을 기본값으로 되돌릴 수 있어야 한다"); [Fact] public void UC_L20_패널_최소_폭을_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "RightPanelMinWidth"), "UC-L20", "AppConfig.RightPanelMinWidth 속성이 필요하다"); [Fact] public void UC_L21_애니메이션_축소_설정이_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "ReduceMotion"), "UC-L21", "AppConfig.ReduceMotion 로 애니메이션을 줄일 수 있어야 한다"); [Fact] public void UC_L22_빠른_애니메이션_지속시간_토큰이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "Duration.Fast"), "UC-L22", "지속 시간 토큰 Duration.Fast 가 필요하다"); [Fact] public void UC_L23_일반_애니메이션_지속시간_토큰이_정의된다() => SourceTree.Usecase( SourceTree.HasKey(SourceTree.SharedXaml, "Duration.Normal"), "UC-L23", "지속 시간 토큰 Duration.Normal 이 필요하다"); [Fact] public void UC_L24_컴팩트_엣지_호버_반응_속도를_설정한다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "EdgeRevealDelayMs"), "UC-L24", "AppConfig.EdgeRevealDelayMs 속성이 필요하다"); [Fact] public void UC_L25_UI_전체_배율을_설정할_수_있다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "UiScale"), "UC-L25", "AppConfig.UiScale 로 UI 전체 배율을 조절할 수 있어야 한다"); [Fact] public void UC_L26_전체화면_여부가_저장된다() => SourceTree.Usecase( SourceTree.PropertyExists(typeof(AppConfig), "FullScreen"), "UC-L26", "AppConfig.FullScreen 속성이 필요하다"); }