// // Copyright (c) James Jackson-South and contributors. // Licensed under the Apache License, Version 2.0. // namespace ImageSharp.Tests.TestUtilities { using System; using System.Collections.Concurrent; using System.Reflection; /// /// Provides instances for parametric unit tests. /// /// The pixel format of the image public abstract class TestImageProvider : ITestImageFactory where TColor : struct, IPackedPixel, IEquatable { /// /// Returns an instance to the test case with the necessary traits. /// public abstract Image GetImage(); public virtual string SourceFileOrDescription => ""; /// /// Utility instance to provide informations about the test image & manage input/output /// public ImagingTestCaseUtility Utility { get; private set; } protected virtual TestImageProvider InitUtility(MethodInfo testMethod) { this.Utility = new ImagingTestCaseUtility() { SourceFileOrDescription = this.SourceFileOrDescription, PixelTypeName = typeof(TColor).Name }; if (testMethod != null) { this.Utility.Init(testMethod); } return this; } private class BlankProvider : TestImageProvider { protected int Width { get; } protected int Height { get; } public BlankProvider(int width, int height) { this.Width = width; this.Height = height; } public override string SourceFileOrDescription => $"Blank{this.Width}x{this.Height}"; public override Image GetImage() => new Image(this.Width, this.Height); } public static TestImageProvider Blank(int width, int height, MethodInfo testMethod = null) => new BlankProvider(width, height).InitUtility(testMethod); private class LambdaProvider : TestImageProvider { private readonly Func> creator; public LambdaProvider(Func> creator) { this.creator = creator; } public override Image GetImage() => this.creator(); } public static TestImageProvider Lambda( Func> func, MethodInfo testMethod = null) => new LambdaProvider(func).InitUtility(testMethod); private class FileProvider : TestImageProvider { private static ConcurrentDictionary> cache = new ConcurrentDictionary>(); private string filePath; public FileProvider(string filePath) { this.filePath = filePath; } public override string SourceFileOrDescription => this.filePath; public override Image GetImage() { var cachedImage = cache.GetOrAdd( this.filePath, fn => { var testFile = TestFile.CreateWithoutImage(this.filePath); return new Image(testFile.Bytes); }); return new Image(cachedImage); } } public static TestImageProvider File(string filePath, MethodInfo testMethod = null) { return new FileProvider(filePath).InitUtility(testMethod); } private class SolidProvider : BlankProvider { private readonly byte r; private readonly byte g; private readonly byte b; private readonly byte a; public override Image GetImage() { var image = base.GetImage(); TColor color = default(TColor); color.PackFromBytes(this.r, this.g, this.b, this.a); return image.Fill(color); } public SolidProvider(int width, int height, byte r, byte g, byte b, byte a) : base(width, height) { this.r = r; this.g = g; this.b = b; this.a = a; } } public static TestImageProvider Solid( int width, int height, byte r, byte g, byte b, byte a = 255, MethodInfo testMethod = null) { return new SolidProvider(width, height, r, g, b, a).InitUtility(testMethod); } } /// /// Marker /// public interface ITestImageFactory { } }