| 1 | using Xunit; |
| 2 | |
| 3 | namespace 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> |
| 9 | public 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 | |