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,84 @@
using System;
using System.Collections.Generic;
using Paca.Mobile.Core;
using Xunit;
namespace Paca.Tests.Core;
public class DualSubtitleComposerGateTests
{
[Fact]
public void Gate289_DualSubtitleComposer_AlignsOverlappingCues_Simultaneously()
{
var primaryCues = new List<SubtitleCue>
{
new(10.0, 15.0, "Hello world")
};
var secondaryCues = new List<SubtitleCue>
{
new(11.0, 14.0, "안녕하세요")
};
var composer = new DualSubtitleComposer(primaryCues, secondaryCues);
// At 12.0s, both are active
var active = composer.GetActiveDualCue(currentPosSec: 12.0);
Assert.NotNull(active);
Assert.Equal("Hello world", active!.PrimaryText);
Assert.Equal("안녕하세요", active.SecondaryText);
Assert.True(active.HasDual);
}
[Fact]
public void Gate290_DualSubtitleComposer_HandlesMissingSecondary_Gracefully()
{
var primaryCues = new List<SubtitleCue>
{
new(10.0, 15.0, "Hello world")
};
var secondaryCues = new List<SubtitleCue>
{
new(11.0, 14.0, "안녕하세요")
};
var composer = new DualSubtitleComposer(primaryCues, secondaryCues);
// At 10.5s, only primary is active
var active = composer.GetActiveDualCue(currentPosSec: 10.5);
Assert.NotNull(active);
Assert.Equal("Hello world", active!.PrimaryText);
Assert.Null(active.SecondaryText);
Assert.False(active.HasDual);
}
[Fact]
public void Gate291_DualSubtitleComposer_StylesSecondarySubtitle_WithSmallerFontToken()
{
var style = DualSubtitleComposer.DefaultSecondaryStyle;
Assert.True(style.FontScale < 1.0, "Secondary subtitle should be slightly smaller (e.g. 0.8x)");
Assert.False(string.IsNullOrEmpty(style.TextColorHex));
}
[Fact]
public void Gate292_AudioTrackSelector_SelectsPreferredLanguage()
{
var tracks = new List<MobileAudioTrack>
{
new(0, "ja", "Japanese (Original)"),
new(1, "en", "English (Dub)"),
new(2, "ko", "Korean (Dub)")
};
var selected = AudioTrackSelector.PickPreferredTrack(tracks, preferredLangCode: "ko");
Assert.NotNull(selected);
Assert.Equal(2, selected!.Index);
Assert.Equal("ko", selected.LanguageCode);
// Fallback to first if preferred not found
var fallback = AudioTrackSelector.PickPreferredTrack(tracks, preferredLangCode: "fr");
Assert.NotNull(fallback);
Assert.Equal(0, fallback!.Index);
}
}