using System; using System.IO; using Paca.Mobile.Core; using Paca.Tests.Infrastructure; using Xunit; namespace Paca.Tests.Mobile; /// /// 모바일 환골탈태 스위스 미니멀리즘 초고밀도 디자인 시스템 감사 게이트 (Gate 184 ~ Gate 190) /// public class MobileSwissMinimalExcellenceGateTests { private static string MobileProjectDir => Directory.Exists(Path.Combine(SourceTree.Root, "src", "Paca.Mobile")) ? Path.Combine(SourceTree.Root, "src", "Paca.Mobile") : Path.Combine(SourceTree.Root, "Paca.Mobile"); [Fact] public void Gate184_TabbedRootPage_Modern_FiveTabs_ThumbZone_Audit() { var rootCs = File.ReadAllText(Path.Combine(MobileProjectDir, "TabbedRootPage.cs")); // 1. 필수 5대 핵심 탭 등록 확인 Assert.Contains("Children.Add(queuePage)", rootCs); Assert.Contains("Children.Add(new DiscoverPage())", rootCs); Assert.Contains("Children.Add(new BrowserPage())", rootCs); Assert.Contains("Children.Add(new FavoritesPage())", rootCs); Assert.Contains("Children.Add(new SyncSettingsPage())", rootCs); // 2. 화면을 찌그러뜨리던 8개 탭 과밀 플랫 나열(LibraryPage, DownloadsPage, ConnectPage의 Children.Add) 박멸 확인 Assert.DoesNotContain("Children.Add(new LibraryPage())", rootCs); Assert.DoesNotContain("Children.Add(new DownloadsPage())", rootCs); Assert.DoesNotContain("Children.Add(new ConnectPage())", rootCs); } [Fact] public void Gate185_QueuePage_DoubleBezel_And_CompactIslandButtons_Audit() { var pagesCs = File.ReadAllText(Path.Combine(MobileProjectDir, "Pages.cs")); // 1. QueuePage 카드에서 레거시 Frame 박멸 및 최신 Border + RoundRectangle 적용 Assert.Contains("CompactQueueCard = new Border", pagesCs); Assert.Contains("RoundRectangle", pagesCs); // 2. 카드 내 액션 버튼(pause, resume, cancel) 48dp 비대 버튼 박멸 및 32dp 컴팩트 아일랜드 버튼 적용 Assert.Contains("HeightRequest = 32", pagesCs); Assert.Contains("WidthRequest = 32", pagesCs); Assert.DoesNotContain("HeightRequest = 48, CornerRadius = 8, BackgroundColor = Color.FromArgb(\"#161828\")", pagesCs); } [Fact] public void Gate186_Mobile_ZeroEmoji_StrictLucideGlyph_Audit() { var pagesCs = File.ReadAllText(Path.Combine(MobileProjectDir, "Pages.cs")); // 1. 하드코딩된 '⚡' 이모지 완전 박멸 확인 Assert.DoesNotContain("\"⚡\"", pagesCs); // 2. MobileIconSystem.Zap 및 Lucide 폰트 패밀리 적용 확인 Assert.Contains("MobileIconSystem.Zap", pagesCs); } [Fact] public void Gate187_DiscoverPage_CompactRailChips_Audit() { var pagesCs = File.ReadAllText(Path.Combine(MobileProjectDir, "Pages.cs")); // 1. 28dp 수평 알약 칩 및 34dp 슬림 서치바 적용 확인 Assert.Contains("HeightRequest = 28", pagesCs); Assert.Contains("CornerRadius = 14", pagesCs); Assert.Contains("_searchEntry", pagesCs); } [Fact] public void Gate188_SyncSettingsPage_ModularDoubleBezelCards_Audit() { var syncCs = File.ReadAllText(Path.Combine(MobileProjectDir, "SyncSettingsPage.cs")); // 1. Double-Bezel 셸/코어 서피스 토큰 사용 확인 Assert.Contains("SurfaceShell", syncCs); Assert.Contains("SurfaceCore", syncCs); } [Fact] public void Gate189_DownloadsPage_CompactToolbar_And_SegmentPills_Audit() { var dlCs = File.ReadAllText(Path.Combine(MobileProjectDir, "DownloadsPage.cs")); // 1. 단일 레일 알약 스크롤 뷰 및 28dp 필터 버튼 Assert.Contains("SingleRailPillsScrollView", dlCs); Assert.Contains("HeightRequest = 28", dlCs); Assert.Contains("HeightRequest = 34", dlCs); } [Fact] public void Gate190_MobileThemeSystem_CompactTokens_Audit() { // 1. 초고밀도 컴팩트 디자인 토큰 규격 확인 Assert.Equal(32.0, MobileThemeSystem.CompactButtonSizeDp); Assert.Equal(28.0, MobileThemeSystem.CompactPillHeightDp); Assert.Equal(34.0, MobileThemeSystem.CompactItemHeightDp); Assert.Equal(56.0, MobileThemeSystem.CompactRowHeightDp); Assert.Equal("#10111A", MobileThemeSystem.SurfaceShell); Assert.Equal("#151624", MobileThemeSystem.SurfaceCore); Assert.Equal("#23253A", MobileThemeSystem.BorderHairline); } }