122 lines
5 KiB
C#
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);
|
|
}
|
|
}
|