using System; using System.Collections.Generic; using Paca.Core; using Xunit; namespace Paca.Tests.Core; public class AudioAlbumTrackSplitterGateTests { [Fact] public void Gate409_AudioAlbumTrackSplitter_BuildsSilenceDetectArgs_Properly() { var args = AudioAlbumTrackSplitter.BuildSilenceDetectArgs("album.mp3", noiseDb: -35.0, durationSec: 2.0); Assert.Contains("-i \"album.mp3\"", args); Assert.Contains("silencedetect=noise=-35dB:d=2.0", args); Assert.Contains("-f null -", args); } [Fact] public void Gate410_AudioAlbumTrackSplitter_ParsesSilenceSegments_IntoTracks_WithMinDurationFilter() { var log = "[silence_detect @ 0x1234] silence_start: 177.5\n[silence_detect @ 0x1234] silence_end: 180.0 | silence_duration: 2.5\n[silence_detect @ 0x1234] silence_start: 357.0\n[silence_detect @ 0x1234] silence_end: 360.0 | silence_duration: 3.0"; var tracks = AudioAlbumTrackSplitter.ParseSilenceToTracks(log, totalDurationSec: 600.0, minTrackDurationSec: 30.0); Assert.Equal(3, tracks.Count); Assert.Equal(1, tracks[0].Index); Assert.Equal(0.0, tracks[0].StartSec, 1); Assert.Equal(177.5, tracks[0].EndSec, 1); Assert.Equal(2, tracks[1].Index); Assert.Equal(180.0, tracks[1].StartSec, 1); Assert.Equal(357.0, tracks[1].EndSec, 1); Assert.Equal(3, tracks[2].Index); Assert.Equal(360.0, tracks[2].StartSec, 1); Assert.Equal(600.0, tracks[2].EndSec, 1); } [Fact] public void Gate411_AudioAlbumTrackSplitter_BuildsLosslessSplitCommand_PerTrack() { var track = new AlbumTrackSegment(1, 0.0, 177.5, "Track 01"); var cmd = AudioAlbumTrackSplitter.BuildSplitCommand("album.mp3", track, "out_01.mp3"); Assert.Contains("-ss 0.000", cmd); Assert.Contains("-to 177.500", cmd); Assert.Contains("-i \"album.mp3\"", cmd); Assert.Contains("-c copy", cmd); Assert.Contains("\"out_01.mp3\"", cmd); } [Fact] public void Gate412_AudioAlbumTrackSplitter_GeneratesM3uPlaylist_Accurately() { var tracks = new List { new(1, 0.0, 180.0, "Intro Jam"), new(2, 180.0, 420.0, "Main Song") }; var m3u = AudioAlbumTrackSplitter.GenerateM3uPlaylist("My Album", tracks, "track_{0:D2}.mp3"); Assert.StartsWith("#EXTM3U", m3u.TrimStart()); Assert.Contains("#EXTINF:180,My Album - Intro Jam", m3u); Assert.Contains("track_01.mp3", m3u); Assert.Contains("#EXTINF:240,My Album - Main Song", m3u); Assert.Contains("track_02.mp3", m3u); } }