//
// 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;
}
}
}