using System; using Paca.Core; using Xunit; namespace Paca.Tests.Core; public class VideoPosterExtractorGateTests { [Fact] public void Gate381_VideoPosterExtractor_CalculatesOptimalSeekTime() { // For short 5s clip -> 1.0s var shortClip = VideoPosterExtractor.CalculateOptimalSeekTime(5.0); Assert.Equal(1.0, shortClip); // For 60s video -> 10% is 6.0s var midVideo = VideoPosterExtractor.CalculateOptimalSeekTime(60.0); Assert.Equal(6.0, midVideo); // For 2-hour movie (7200s) -> Capped at 10.0s (to avoid spoilers while skipping black intro) var movie = VideoPosterExtractor.CalculateOptimalSeekTime(7200.0); Assert.Equal(10.0, movie); } [Fact] public void Gate382_VideoPosterExtractor_BuildsScalingFilter_PreservingAspect() { var spec = new PosterExtractionSpec( SeekTimeSec: 4.5, Width: 640, Height: 360, Format: PosterFormat.Jpeg, Quality: 85 ); var filter = VideoPosterExtractor.BuildScalingFilter(spec); Assert.Equal("scale=640:360:force_original_aspect_ratio=decrease", filter); } [Fact] public void Gate383_VideoPosterExtractor_BuildsWebpAndJpegQualityFlags() { var webpSpec = new PosterExtractionSpec(3.0, 400, 400, PosterFormat.WebP, Quality: 80); var webpCmd = VideoPosterExtractor.BuildPosterCommandLine("in.mp4", "out.webp", webpSpec); Assert.Contains("-c:v libwebp -quality 80", webpCmd); var jpegSpec = new PosterExtractionSpec(3.0, 400, 400, PosterFormat.Jpeg, Quality: 90); var jpegCmd = VideoPosterExtractor.BuildPosterCommandLine("in.mp4", "out.jpg", jpegSpec); Assert.Contains("-q:v 2", jpegCmd); // High quality jpeg } [Fact] public void Gate384_VideoPosterExtractor_BuildsFullSingleFrameCommandLine() { var spec = new PosterExtractionSpec(5.0, 1280, 720, PosterFormat.Jpeg, 85); var cmd = VideoPosterExtractor.BuildPosterCommandLine("C:\\vid.mp4", "C:\\thumb.jpg", spec); Assert.Contains("-ss 5.00 -i \"C:\\vid.mp4\"", cmd); Assert.Contains("-vframes 1", cmd); Assert.EndsWith("\"C:\\thumb.jpg\" -y", cmd); } }