using System; using System.IO; using System.Threading; using System.Windows; using Paca.App.Core; using Paca.App.Services; using Paca.Tests.Infrastructure; using Xunit; namespace Paca.Tests.App; public class AppDebugScreenshotServiceTests { [Fact] public void AppDebugScreenshotService_GetDefaultScreenshotPath_ReturnsValidPngPath() { var path = AppDebugScreenshotService.GetDefaultScreenshotPath(); Assert.False(string.IsNullOrWhiteSpace(path)); Assert.EndsWith(".png", path, StringComparison.OrdinalIgnoreCase); Assert.Contains(AppPaths.DataDir, path, StringComparison.OrdinalIgnoreCase); } [Fact] public void AppDebugScreenshotService_CaptureWindow_STA_GeneratesValidPngFile() { using var sta = StaDispatcher.Start(); WpfTestApp.Ensure(sta.Dispatcher); var tempOut = Path.Combine(Path.GetTempPath(), $"paca_test_shot_{Guid.NewGuid():N}.png"); try { var result = sta.Invoke(() => { var window = new Window { Width = 300, Height = 200, Title = "TestCaptureWindow" }; window.Show(); var ok = AppDebugScreenshotService.CaptureWindow(window, tempOut); window.Close(); return ok; }); Assert.True(result, "CaptureWindow should return true for a valid window."); Assert.True(File.Exists(tempOut), "Screenshot file must exist."); var fi = new FileInfo(tempOut); Assert.True(fi.Length > 0, "Screenshot file must not be empty."); // PNG magic byte verification: 0x89, 'P', 'N', 'G' var header = new byte[8]; using (var fs = File.OpenRead(tempOut)) { fs.Read(header, 0, 8); } Assert.Equal(0x89, header[0]); Assert.Equal((byte)'P', header[1]); Assert.Equal((byte)'N', header[2]); Assert.Equal((byte)'G', header[3]); } finally { if (File.Exists(tempOut)) { try { File.Delete(tempOut); } catch { } } } } [Fact] public void AppDebugScreenshotService_ProcessTriggerContent_ParsesTargetPath() { var customPath = @"C:\dummy\target.png"; var resolved = AppDebugScreenshotService.ResolveTriggerPath(customPath); Assert.Equal(customPath, resolved); var emptyResolved = AppDebugScreenshotService.ResolveTriggerPath(""); Assert.Equal(AppDebugScreenshotService.GetDefaultScreenshotPath(), emptyResolved); } }