using System; using System.IO; using Paca.Browser.Diagnostics; using Paca.Browser.Media; using Xunit; namespace Paca.Tests.App; public class DesktopMediaSpeedAndDiagnosticsGateTests { private readonly string _mainWindowCsPath; private readonly string _mainWindowXamlPath; public DesktopMediaSpeedAndDiagnosticsGateTests() { var baseDir = AppContext.BaseDirectory; var solutionDir = Path.GetFullPath(Path.Combine(baseDir, "..", "..", "..", "..", "..")); _mainWindowCsPath = Path.Combine(solutionDir, "src", "Paca.App", "MainWindow.xaml.cs"); _mainWindowXamlPath = Path.Combine(solutionDir, "src", "Paca.App", "MainWindow.xaml"); } [Fact] public void Gate_MediaSpeedController_StepUpAndDown_ClampsWithinRange() { var controller = new MediaSpeedController(); Assert.Equal(1.0, controller.CurrentSpeed); controller.StepUp(); Assert.Equal(1.1, controller.CurrentSpeed); controller.StepDown(); Assert.Equal(1.0, controller.CurrentSpeed); // Clamp to Max controller.SetSpeed(5.0); Assert.Equal(MediaSpeedController.MaxSpeed, controller.CurrentSpeed); // Clamp to Min controller.SetSpeed(0.1); Assert.Equal(MediaSpeedController.MinSpeed, controller.CurrentSpeed); // Script generation var script = controller.GeneratePlaybackScript(); Assert.Contains("media.playbackRate", script); Assert.Contains("preservesPitch", script); } [Fact] public void Gate_VideoFrameCaptureCoordinator_GeneratesCaptureScriptAndSnapshots() { var coordinator = new VideoFrameCaptureCoordinator(); // 1. Suggested filename var fileName = coordinator.GenerateSuggestedFileName("Test Video: Title/Sample", 45.5); Assert.StartsWith("PACA_Frame_Test Video_ Title_Sample_45.5s", fileName); Assert.EndsWith(".png", fileName); // 2. Aspect ratio Assert.Equal("16:9", VideoFrameCaptureCoordinator.CalculateAspectRatio(1920, 1080)); Assert.Equal("16:10", VideoFrameCaptureCoordinator.CalculateAspectRatio(1920, 1200)); Assert.Equal("4:3", VideoFrameCaptureCoordinator.CalculateAspectRatio(1024, 768)); // 3. Snapshot PNG encoding var rawRgba = new byte[4 * 4 * 4]; // 4x4 RGBA Array.Fill(rawRgba, (byte)255); var meta = new VideoFrameMetadata("vid1", "Test", 4, 4, 1.0, 10.0, 30.0, DateTime.UtcNow); var snapshot = coordinator.CreateSnapshot(meta, rawRgba, 4, 4); Assert.NotNull(snapshot); Assert.True(snapshot.ImageData.Length > 8); // Verify PNG magic bytes: 0x89, 'P', 'N', 'G', 0x0D, 0x0A, 0x1A, 0x0A byte[] expectedMagic = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; for (int i = 0; i < expectedMagic.Length; i++) { Assert.Equal(expectedMagic[i], snapshot.ImageData[i]); } } [Fact] public void Gate_AdvancedProcessTaskInspector_ParsesProcessesAndCalculatesSummaries() { var inspector = new AdvancedProcessTaskInspector(); // 1. Categorization Assert.Equal(BrowserProcessCategory.Browser, inspector.CategorizeProcess("Paca", null)); Assert.Equal(BrowserProcessCategory.Gpu, inspector.CategorizeProcess("Paca", "--type=gpu-process")); Assert.Equal(BrowserProcessCategory.Renderer, inspector.CategorizeProcess("Paca", "--type=renderer")); Assert.Equal(BrowserProcessCategory.Utility, inspector.CategorizeProcess("Paca", "--type=utility")); Assert.Equal(BrowserProcessCategory.Audio, inspector.CategorizeProcess("Paca", "utility-sub-type=audio")); // 2. Register processes and aggregate inspector.RegisterProcess(new ProcessTaskSnapshot(1001, "Paca", BrowserProcessCategory.Browser, "Main", "", 150_000_000, 2.5)); inspector.RegisterProcess(new ProcessTaskSnapshot(1002, "Paca", BrowserProcessCategory.Renderer, "Tab 1", "--type=renderer", 250_000_000, 5.0)); Assert.Equal(400_000_000, inspector.GetTotalWorkingSetBytes()); Assert.Equal(7.5, inspector.GetTotalCpuPercent()); var summaries = inspector.GetCategorySummaries(); Assert.Contains(summaries, s => s.Category == BrowserProcessCategory.Renderer && s.ProcessCount == 1); } [Fact] public void Gate_DesktopApp_MainWindow_HasMediaSpeedAndFrameCaptureWiring() { Assert.True(File.Exists(_mainWindowCsPath), "MainWindow.xaml.cs exists"); var cs = File.ReadAllText(_mainWindowCsPath); // Core fields and properties Assert.Contains("MediaSpeedController", cs); Assert.Contains("VideoFrameCaptureCoordinator", cs); Assert.Contains("AdvancedProcessTaskInspector", cs); // Shortcut & Action methods Assert.Contains("AdjustMediaSpeed", cs); Assert.Contains("CaptureCurrentVideoFrame", cs); Assert.Contains("UpdateTaskManagerPanelSummary", cs); // Key bindings for '[' and ']' Assert.Contains("Key.OemOpenBrackets", cs); Assert.Contains("Key.OemCloseBrackets", cs); } }