84 lines
2.6 KiB
C#
84 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|