using System.IO; using Paca.Core; using Paca.Core.Platform; using Paca.Tests.Infrastructure; using Xunit; namespace Paca.Tests.App; public class MediaToolsMenuWiringGateTests { private static string AppProjectDir => Directory.Exists(Path.Combine(SourceTree.Root, "src", "Paca.App")) ? Path.Combine(SourceTree.Root, "src", "Paca.App") : Path.Combine(SourceTree.Root, "Paca.App"); [Fact] public void Gate_Core_Six_MediaEngines_Build_Filters_Accurately() { // 1. AudioVocalStemExtractor var karaokeFilter = AudioVocalStemExtractor.BuildFfmpegStemFilter(AudioStemMode.VocalRemovalKaraoke); Assert.Contains("pan=stereo", karaokeFilter); // 2. VideoAspectAutoCropper var cropFilter = VideoAspectAutoCropper.BuildReframingFilterArgs(ReframingMode.CenterCrop, 1080, 1920); Assert.Contains("crop=", cropFilter); Assert.Contains("1080:1920", cropFilter); // 3. SubtitleBurnInEngine var burnInCmd = SubtitleBurnInEngine.BuildBurnInCommandLine("in.mp4", "sub.srt", "out.mp4"); Assert.Contains("subtitles=", burnInCmd); // 4. VideoTonemapEnhancer var toneFilter = VideoTonemapEnhancer.BuildHdrToSdrFilter(TonemapAlgorithm.Mobius); Assert.Contains("tonemap=", toneFilter); // 5. VideoSpriteSheetGenerator var spriteConfig = new SpriteSheetConfig(5, 5, 160, 90, 5); var spriteCmd = VideoSpriteSheetGenerator.BuildFfmpegSpriteCommandLine("in.mp4", "sprite.jpg", spriteConfig); Assert.Contains("tile=5x5", spriteCmd); // 6. VideoIntroOutroTrimmer var window = VideoIntroOutroTrimmer.CalculateTrimWindow(60.0, 5.0, 10.0); var trimArgs = VideoIntroOutroTrimmer.BuildLosslessTrimCommandLine("in.mp4", "out.mp4", window.StartSec, window.DurationSec); Assert.Contains("-ss 5.00", trimArgs); Assert.Contains("-t 45.00", trimArgs); } [Fact] public void Gate_MainWindow_Xaml_And_Usecases_Contain_MediaToolsWiring() { var xamlPath = Path.Combine(AppProjectDir, "MainWindow.xaml"); var usecasesPath = Path.Combine(AppProjectDir, "MainWindow.Usecases.cs"); Assert.True(File.Exists(xamlPath), $"MainWindow.xaml not found at {xamlPath}"); Assert.True(File.Exists(usecasesPath), $"MainWindow.Usecases.cs not found at {usecasesPath}"); var xaml = File.ReadAllText(xamlPath); var usecases = File.ReadAllText(usecasesPath); // XAML에 6대 미디어 도구 컨텍스트 메뉴 또는 헤더 항목 존재 검증 Assert.True(xaml.Contains("MediaTools") || xaml.Contains("미디어 도구") || xaml.Contains("MediaToolsMenu"), "MainWindow.xaml must declare Media Tools context menu or action entry"); // Usecases에 미디어 도구 핸들러 배선 검증 Assert.True(usecases.Contains("ExecuteMediaTool") || usecases.Contains("AudioVocalStemExtractor") || usecases.Contains("HandleMediaToolAction"), "MainWindow.Usecases.cs must implement media tools handler"); } }