using System; using Paca.Mobile.Core; using Xunit; namespace Paca.Tests.Core; public class StreamHighlightClipperGateTests { [Fact] public void Gate281_StreamHighlightClipper_BuildsLosslessCutArgs() { var args = StreamHighlightClipper.BuildFfmpegArgs("input.mp4", "output_clip.mp4", startSec: 10.5, durationSec: 30.0, ClipOutputFormat.Mp4Lossless); Assert.Contains("-ss 10.5", args); Assert.Contains("-t 30", args); Assert.Contains("-c copy", args); } [Fact] public void Gate282_StreamHighlightClipper_BuildsHighQualityGifArgs() { var args = StreamHighlightClipper.BuildFfmpegArgs("input.mp4", "output.gif", startSec: 5.0, durationSec: 8.0, ClipOutputFormat.AnimatedGif); Assert.Contains("-ss 5", args); Assert.Contains("-t 8", args); Assert.Contains("palettegen", args); Assert.Contains("paletteuse", args); } [Fact] public void Gate283_StreamHighlightClipper_ValidatesClipBounds() { // Negative start clamped to 0 var args = StreamHighlightClipper.BuildFfmpegArgs("input.mp4", "out.mp4", startSec: -5.0, durationSec: 10.0, ClipOutputFormat.Mp4Lossless); Assert.Contains("-ss 0", args); // Zero or negative duration throws Assert.Throws(() => StreamHighlightClipper.BuildFfmpegArgs("input.mp4", "out.mp4", startSec: 10, durationSec: 0, ClipOutputFormat.Mp4Lossless)); } [Fact] public void Gate284_StreamHighlightClipper_CalculatesOutputName() { var outMp4 = StreamHighlightClipper.GenerateOutputFileName("MyStream.mp4", startSec: 45.0, durationSec: 15.0, ClipOutputFormat.Mp4Lossless); Assert.Equal("MyStream_clip_45s_15s.mp4", outMp4); var outGif = StreamHighlightClipper.GenerateOutputFileName("MyStream.mp4", startSec: 120.0, durationSec: 5.0, ClipOutputFormat.AnimatedGif); Assert.Equal("MyStream_clip_120s_5s.gif", outGif); } }