feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -0,0 +1,107 @@
using System;
using System.IO;
using Paca.Mobile.Core;
using Paca.Tests.Infrastructure;
using Xunit;
namespace Paca.Tests.Mobile;
/// <summary>
/// 모바일 환골탈태 스위스 미니멀리즘 초고밀도 디자인 시스템 감사 게이트 (Gate 184 ~ Gate 190)
/// </summary>
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);
}
}