using System; using Paca.Core; using Xunit; namespace Paca.Tests.Core; public class SubtitleBurnInEngineGateTests { [Fact] public void Gate357_SubtitleBurnInEngine_BuildsForceStyleString_Correctly() { var style = new SubtitleBurnInStyle { FontName = "Arial", FontSize = 24, PrimaryColor = "&H00FFFFFF", OutlineColor = "&H00000000", OutlineWidth = 2, MarginV = 40, Alignment = 2 // Bottom center }; var forceStyle = SubtitleBurnInEngine.BuildForceStyleString(style); Assert.Contains("FontName=Arial", forceStyle); Assert.Contains("FontSize=24", forceStyle); Assert.Contains("PrimaryColour=&H00FFFFFF", forceStyle); Assert.Contains("Outline=2", forceStyle); Assert.Contains("MarginV=40", forceStyle); Assert.Contains("Alignment=2", forceStyle); } [Fact] public void Gate358_SubtitleBurnInEngine_EscapesWindowsPath_ForFfmpegFilter() { var winPath = "C:\\subtitles\\video_track.srt"; var escaped = SubtitleBurnInEngine.EscapeSubtitlePathForFfmpeg(winPath); // In ffmpeg filtergraph, colon must be escaped as '\:' and backslashes replaced with forward slashes Assert.Equal("C\\:/subtitles/video_track.srt", escaped); } [Fact] public void Gate359_SubtitleBurnInEngine_ProvidesDefaultReadableStyle() { var def = SubtitleBurnInStyle.Default; Assert.Equal(22, def.FontSize); Assert.Equal(2, def.Alignment); // Bottom center Assert.True(def.OutlineWidth >= 2); } [Fact] public void Gate360_SubtitleBurnInEngine_BuildsFullCommandLine_WithAudioCopy() { var cmd = SubtitleBurnInEngine.BuildBurnInCommandLine( inputVideoPath: "C:\\videos\\clip.mp4", subtitlePath: "C:\\videos\\clip.srt", outputVideoPath: "C:\\videos\\clip_subbed.mp4" ); Assert.Contains("-i \"C:\\videos\\clip.mp4\"", cmd); Assert.Contains("-vf \"subtitles='C\\:/videos/clip.srt'", cmd); Assert.Contains("force_style=", cmd); Assert.Contains("-c:v libx264 -crf 20 -c:a copy", cmd); Assert.EndsWith("\"C:\\videos\\clip_subbed.mp4\" -y", cmd); } }