using System; using Paca.Core; using Xunit; namespace Paca.Tests.Core; public class MediaBitrateEstimatorGateTests { [Fact] public void Gate425_MediaBitrateEstimator_CalculatesTargetBitrates_Accurately() { // 100s, 25MB target, 128k audio, 3% container overhead long targetBytes = 25L * 1024 * 1024; var result = MediaBitrateEstimator.CalculateBitrate(100.0, targetBytes, audioBitrateKbps: 128, overheadPercent: 3.0); Assert.True(result.IsPossible); Assert.InRange(result.VideoBitrateKbps, 1850, 1950); Assert.Equal(128, result.AudioBitrateKbps); } [Fact] public void Gate426_MediaBitrateEstimator_HandlesImpossibleConstraint_Gracefully() { // 1000s, 1MB target (impossible with 128k audio) long targetBytes = 1L * 1024 * 1024; var result = MediaBitrateEstimator.CalculateBitrate(1000.0, targetBytes, audioBitrateKbps: 128); Assert.False(result.IsPossible); Assert.True(result.VideoBitrateKbps <= 64); // Fallback minimum } [Fact] public void Gate427_MediaBitrateEstimator_ProvidesPlatformPresets() { Assert.Equal(25L * 1024 * 1024, MediaBitrateEstimator.GetPlatformLimitBytes(TargetPlatformLimit.DiscordFree)); Assert.Equal(16L * 1024 * 1024, MediaBitrateEstimator.GetPlatformLimitBytes(TargetPlatformLimit.WhatsAppVideo)); Assert.Equal(20L * 1024 * 1024, MediaBitrateEstimator.GetPlatformLimitBytes(TargetPlatformLimit.EmailAttachment)); } [Fact] public void Gate428_MediaBitrateEstimator_BuildsTwoPassFfmpegCommands() { var plan = new BitrateEstimationResult(true, 1800, 128, 25L * 1024 * 1024); var (pass1, pass2) = MediaBitrateEstimator.BuildTwoPassCommands("in.mp4", "out.mp4", plan); Assert.Contains("-b:v 1800k", pass1); Assert.Contains("-pass 1", pass1); Assert.Contains("-an", pass1); Assert.Contains("-b:v 1800k", pass2); Assert.Contains("-pass 2", pass2); Assert.Contains("-b:a 128k", pass2); Assert.Contains("\"out.mp4\"", pass2); } }