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 { new(10.0, 15.0, "Hello world") }; var secondaryCues = new List { 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 { new(10.0, 15.0, "Hello world") }; var secondaryCues = new List { 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 { 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); } }