Forge
csharp4405de34
1using Xunit;
2
3namespace CascadeIDE.Tests.VisualVerification;
4
5/// <summary>
6/// Сравнение PNG с эталоном в <c>TestData/Visual/*.approved.png</c>.
7/// Обновление эталона: установить переменную окружения <c>CASCADE_IDE_UPDATE_VISUAL_BASELINES=1</c> и прогнать тест (запишет файл в исходники проекта тестов).
8/// </summary>
9public static class ApprovedPngAssert
10{
11 public const string UpdateBaselinesEnvironmentVariable = "CASCADE_IDE_UPDATE_VISUAL_BASELINES";
12
13 public static void EqualToApproved(byte[] actualPng, string approvedRelativeFileName)
14 {
15 ArgumentNullException.ThrowIfNull(actualPng);
16 ArgumentException.ThrowIfNullOrEmpty(approvedRelativeFileName);
17
18 var outputPath = Path.Combine(VisualBaselinePaths.OutputVisualDirectory, approvedRelativeFileName);
19 var updateRequested = string.Equals(
20 Environment.GetEnvironmentVariable(UpdateBaselinesEnvironmentVariable),
21 "1",
22 StringComparison.Ordinal);
23
24 if (updateRequested)
25 {
26 var sourceDir = VisualBaselinePaths.SourceVisualDirectory;
27 Directory.CreateDirectory(sourceDir);
28 var sourcePath = Path.Combine(sourceDir, approvedRelativeFileName);
29 File.WriteAllBytes(sourcePath, actualPng);
30
31 Directory.CreateDirectory(VisualBaselinePaths.OutputVisualDirectory);
32 File.WriteAllBytes(outputPath, actualPng);
33 return;
34 }
35
36 Assert.True(File.Exists(outputPath), $"Отсутствует эталон (скопируйте из репозитория): {outputPath}");
37
38 var expected = File.ReadAllBytes(outputPath);
39 if (expected.AsSpan().SequenceEqual(actualPng))
40 return;
41
42 Assert.Fail(
43 $"PNG не совпал с эталоном: {approvedRelativeFileName}. " +
44 $"Чтобы перезаписать эталон осознанно, задай {UpdateBaselinesEnvironmentVariable}=1 и перезапусти тест.");
45 }
46}
47
View only · write via MCP/CIDE