using System; using System.Collections.Generic; using Paca.Core; using Xunit; namespace Paca.Tests.Core; public class HlsManifestValidatorGateTests { [Fact] public void Gate441_HlsManifestValidator_DetectsMasterPlaylist_AndVariants() { var manifest = @"#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720 720p.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080 1080p.m3u8"; var result = HlsManifestValidator.Analyze(manifest); Assert.True(result.IsMasterPlaylist); Assert.Equal(2, result.Variants.Count); Assert.Equal(5000000, result.Variants[0].Bandwidth); // highest first Assert.Equal("1080p.m3u8", result.Variants[0].Uri); Assert.Equal("1920x1080", result.Variants[0].Resolution); } [Fact] public void Gate442_HlsManifestValidator_ParsesMediaPlaylist_Accurately() { var manifest = @"#EXTM3U #EXT-X-TARGETDURATION:10 #EXTINF:10.0, seg1.ts #EXTINF:10.0, seg2.ts #EXTINF:5.5, seg3.ts #EXT-X-ENDLIST"; var result = HlsManifestValidator.Analyze(manifest); Assert.False(result.IsMasterPlaylist); Assert.True(result.IsVod); Assert.False(result.IsLive); Assert.Equal(3, result.SegmentCount); Assert.Equal(25.5, result.TotalDurationSec, 1); } [Fact] public void Gate443_HlsManifestValidator_DetectsDiscontinuities_AndLiveStream() { var manifest = @"#EXTM3U #EXT-X-TARGETDURATION:6 #EXTINF:6.0, live1.ts #EXT-X-DISCONTINUITY #EXTINF:6.0, live2.ts"; var result = HlsManifestValidator.Analyze(manifest); Assert.True(result.IsLive); Assert.False(result.IsVod); Assert.Equal(1, result.DiscontinuityCount); Assert.Equal(2, result.SegmentCount); } [Fact] public void Gate444_HlsManifestValidator_StripsAdDiscontinuityBlocks() { var manifest = @"#EXTM3U #EXTINF:10.0, main1.ts #EXT-X-DISCONTINUITY #EXTINF:15.0, ad1.ts #EXT-X-DISCONTINUITY #EXTINF:10.0, main2.ts #EXT-X-ENDLIST"; // Ad duration 15.0s between discontinuities stripped var cleaned = HlsManifestValidator.StripAdBlocks(manifest, maxAdDurationSec: 30.0); Assert.Contains("main1.ts", cleaned); Assert.Contains("main2.ts", cleaned); Assert.DoesNotContain("ad1.ts", cleaned); } }