mirror of https://github.com/SixLabors/ImageSharp
2 changed files with 169 additions and 164 deletions
@ -0,0 +1,169 @@ |
|||
// Copyright (c) Six Labors and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
|
|||
using System; |
|||
using System.Reflection; |
|||
using Castle.Core.Internal; |
|||
|
|||
using SixLabors.ImageSharp.Formats; |
|||
using SixLabors.ImageSharp.PixelFormats; |
|||
using SixLabors.ImageSharp.Processing; |
|||
|
|||
using Xunit.Abstractions; |
|||
|
|||
namespace SixLabors.ImageSharp.Tests |
|||
{ |
|||
/// <summary>
|
|||
/// Provides <see cref="Image{TPixel}" /> instances for parametric unit tests.
|
|||
/// </summary>
|
|||
/// <typeparam name="TPixel">The pixel format of the image.</typeparam>
|
|||
public abstract partial class TestImageProvider<TPixel> : ITestImageProvider |
|||
where TPixel : struct, IPixel<TPixel> |
|||
{ |
|||
public PixelTypes PixelType { get; private set; } = typeof(TPixel).GetPixelType(); |
|||
|
|||
public virtual string SourceFileOrDescription => string.Empty; |
|||
|
|||
public Configuration Configuration { get; set; } = Configuration.CreateDefaultInstance(); |
|||
|
|||
/// <summary>
|
|||
/// Gets the utility instance to provide information about the test image & manage input/output.
|
|||
/// </summary>
|
|||
public ImagingTestCaseUtility Utility { get; private set; } |
|||
|
|||
public string TypeName { get; private set; } |
|||
|
|||
public string MethodName { get; private set; } |
|||
|
|||
public string OutputSubfolderName { get; private set; } |
|||
|
|||
public static TestImageProvider<TPixel> BasicTestPattern( |
|||
int width, |
|||
int height, |
|||
MethodInfo testMethod = null, |
|||
PixelTypes pixelTypeOverride = PixelTypes.Undefined) |
|||
=> new BasicTestPatternProvider(width, height).Init(testMethod, pixelTypeOverride); |
|||
|
|||
public static TestImageProvider<TPixel> TestPattern( |
|||
int width, |
|||
int height, |
|||
MethodInfo testMethod = null, |
|||
PixelTypes pixelTypeOverride = PixelTypes.Undefined) |
|||
=> new TestPatternProvider(width, height).Init(testMethod, pixelTypeOverride); |
|||
|
|||
public static TestImageProvider<TPixel> Blank( |
|||
int width, |
|||
int height, |
|||
MethodInfo testMethod = null, |
|||
PixelTypes pixelTypeOverride = PixelTypes.Undefined) |
|||
=> new BlankProvider(width, height).Init(testMethod, pixelTypeOverride); |
|||
|
|||
public static TestImageProvider<TPixel> File( |
|||
string filePath, |
|||
MethodInfo testMethod = null, |
|||
PixelTypes pixelTypeOverride = PixelTypes.Undefined) |
|||
{ |
|||
return new FileProvider(filePath).Init(testMethod, pixelTypeOverride); |
|||
} |
|||
|
|||
public static TestImageProvider<TPixel> Lambda( |
|||
Func<Image<TPixel>> factoryFunc, |
|||
MethodInfo testMethod = null, |
|||
PixelTypes pixelTypeOverride = PixelTypes.Undefined) |
|||
=> new LambdaProvider(factoryFunc).Init(testMethod, pixelTypeOverride); |
|||
|
|||
public static TestImageProvider<TPixel> Solid( |
|||
int width, |
|||
int height, |
|||
byte r, |
|||
byte g, |
|||
byte b, |
|||
byte a = 255, |
|||
MethodInfo testMethod = null, |
|||
PixelTypes pixelTypeOverride = PixelTypes.Undefined) |
|||
{ |
|||
return new SolidProvider(width, height, r, g, b, a).Init(testMethod, pixelTypeOverride); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns an <see cref="Image{TPixel}"/> instance to the test case with the necessary traits.
|
|||
/// </summary>
|
|||
/// <returns>A test image.</returns>
|
|||
public abstract Image<TPixel> GetImage(); |
|||
|
|||
public virtual Image<TPixel> GetImage(IImageDecoder decoder) |
|||
{ |
|||
throw new NotSupportedException($"Decoder specific GetImage() is not supported with {this.GetType().Name}!"); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns an <see cref="Image{TPixel}"/> instance to the test case with the necessary traits.
|
|||
/// </summary>
|
|||
/// <returns>A test image.</returns>
|
|||
public Image<TPixel> GetImage(Action<IImageProcessingContext> operationsToApply) |
|||
{ |
|||
Image<TPixel> img = this.GetImage(); |
|||
img.Mutate(operationsToApply); |
|||
return img; |
|||
} |
|||
|
|||
public virtual void Deserialize(IXunitSerializationInfo info) |
|||
{ |
|||
PixelTypes pixelType = info.GetValue<PixelTypes>("PixelType"); |
|||
string typeName = info.GetValue<string>("TypeName"); |
|||
string methodName = info.GetValue<string>("MethodName"); |
|||
string outputSubfolderName = info.GetValue<string>("OutputSubfolderName"); |
|||
|
|||
this.Init(typeName, methodName, outputSubfolderName, pixelType); |
|||
} |
|||
|
|||
public virtual void Serialize(IXunitSerializationInfo info) |
|||
{ |
|||
info.AddValue("PixelType", this.PixelType); |
|||
info.AddValue("TypeName", this.TypeName); |
|||
info.AddValue("MethodName", this.MethodName); |
|||
info.AddValue("OutputSubfolderName", this.OutputSubfolderName); |
|||
} |
|||
|
|||
protected TestImageProvider<TPixel> Init( |
|||
string typeName, |
|||
string methodName, |
|||
string outputSubfolderName, |
|||
PixelTypes pixelTypeOverride) |
|||
{ |
|||
if (pixelTypeOverride != PixelTypes.Undefined) |
|||
{ |
|||
this.PixelType = pixelTypeOverride; |
|||
} |
|||
|
|||
this.TypeName = typeName; |
|||
this.MethodName = methodName; |
|||
this.OutputSubfolderName = outputSubfolderName; |
|||
|
|||
this.Utility = new ImagingTestCaseUtility |
|||
{ |
|||
SourceFileOrDescription = this.SourceFileOrDescription, |
|||
PixelTypeName = this.PixelType.ToString() |
|||
}; |
|||
|
|||
if (methodName != null) |
|||
{ |
|||
this.Utility.Init(typeName, methodName, outputSubfolderName); |
|||
} |
|||
|
|||
return this; |
|||
} |
|||
|
|||
protected TestImageProvider<TPixel> Init(MethodInfo testMethod, PixelTypes pixelTypeOverride) |
|||
{ |
|||
string subfolder = testMethod?.DeclaringType.GetAttribute<GroupOutputAttribute>()?.Subfolder |
|||
?? string.Empty; |
|||
return this.Init(testMethod?.DeclaringType.Name, testMethod?.Name, subfolder, pixelTypeOverride); |
|||
} |
|||
|
|||
public override string ToString() |
|||
{ |
|||
return $"{this.SourceFileOrDescription}[{this.PixelType}]"; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue