releases/tests/Paca.Tests/App/DesktopMediaSpeedAndDiagnosticsGateTests.cs

122 lines
5 KiB
C#

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);
}
}