// // Copyright (c) James Jackson-South and contributors. // Licensed under the Apache License, Version 2.0. // namespace ImageSharp.Tests { using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using ImageSharp.PixelFormats; using ImageSharp.Tests.TestUtilities.Integration; public static class TestImageExtensions { /// /// Saves the image only when not running in the CI server. /// /// The pixel format /// The image /// The image provider /// The settings /// The extension public static Image DebugSave(this Image image, ITestImageProvider provider, object settings = null, string extension = "png") where TPixel : struct, IPixel { if (bool.TryParse(Environment.GetEnvironmentVariable("CI"), out bool isCi) && isCi) { return image; } // We are running locally then we want to save it out string tag = null; string s = settings as string; if (s != null) { tag = s; } else if (settings != null) { Type type = settings.GetType(); TypeInfo info = type.GetTypeInfo(); if (info.IsPrimitive || info.IsEnum || type == typeof(decimal)) { tag = settings.ToString(); } else { IEnumerable properties = settings.GetType().GetRuntimeProperties(); tag = string.Join("_", properties.ToDictionary(x => x.Name, x => x.GetValue(settings)).Select(x => $"{x.Key}-{x.Value}")); } } provider.Utility.SaveTestOutputFile(image, extension, tag: tag); return image; } public static Image CompareToReferenceOutput( this Image image, ITestImageProvider provider, object settings = null, string extension = "png", float imageTheshold = ImageComparer.DefaultImageThreshold, byte segmentThreshold = ImageComparer.DefaultSegmentThreshold, int scalingFactor = ImageComparer.DefaultScalingFactor) where TPixel : struct, IPixel { // We are running locally then we want to save it out string tag = null; string s = settings as string; if (s != null) { tag = s; } else if (settings != null) { Type type = settings.GetType(); TypeInfo info = type.GetTypeInfo(); if (info.IsPrimitive || info.IsEnum || type == typeof(decimal)) { tag = settings.ToString(); } else { IEnumerable properties = settings.GetType().GetRuntimeProperties(); tag = string.Join("_", properties.ToDictionary(x => x.Name, x => x.GetValue(settings)).Select(x => $"{x.Key}-{x.Value}")); } } string referenceOutputFile = provider.Utility.GetReferenceOutputFileName(extension, tag); if (!(bool.TryParse(Environment.GetEnvironmentVariable("CI"), out bool isCi) && isCi)) { provider.Utility.SaveTestOutputFile(image, extension, tag: tag); } if (!File.Exists(referenceOutputFile)) { throw new Exception("Reference output file missing: " + referenceOutputFile); } using (Image referenceImage = Image.Load(referenceOutputFile, ReferenceDecoder.Instance)) { ImageComparer.VerifySimilarity(referenceImage, image, imageTheshold, segmentThreshold, scalingFactor); } return image; } } }