114 lines
4.4 KiB
C#
114 lines
4.4 KiB
C#
using NUnit.Framework;
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
using SixLabors.ImageSharp;
|
|
using SixLabors.ImageSharp.Formats;
|
|
using SixLabors.ImageSharp.Formats.Jpeg;
|
|
using SixLabors.ImageSharp.Formats.Png;
|
|
using SixLabors.ImageSharp.PixelFormats;
|
|
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace Sacs.UnitTests.Net.Standard.Base.Utils
|
|
{
|
|
[TestFixture]
|
|
public class ImageUtils_Tester
|
|
{
|
|
// --- Image Recognition ---
|
|
|
|
[Test]
|
|
public void VerifyImageData_RecognisesPngAndJpegDimensions()
|
|
{
|
|
byte[] pngData = CreateImageData(7, 5, new PngEncoder());
|
|
byte[] jpegData = CreateImageData(9, 4, new JpegEncoder());
|
|
|
|
ImageUtils.ImageConfig pngConfig = ImageUtils.VerifyImageData(pngData);
|
|
ImageUtils.ImageConfig jpegConfig = ImageUtils.VerifyImageData(jpegData);
|
|
|
|
Assert.That(pngConfig.ValidImage, Is.True);
|
|
Assert.That(pngConfig.ImageFormatName, Is.EqualTo("PNG"));
|
|
Assert.That(pngConfig.DefaultMimeType, Is.EqualTo("image/png"));
|
|
Assert.That(pngConfig.Width, Is.EqualTo(7));
|
|
Assert.That(pngConfig.Height, Is.EqualTo(5));
|
|
Assert.That(jpegConfig.ValidImage, Is.True);
|
|
Assert.That(jpegConfig.ImageFormatName, Is.EqualTo("JPEG"));
|
|
Assert.That(jpegConfig.DefaultMimeType, Is.EqualTo("image/jpeg"));
|
|
Assert.That(jpegConfig.Width, Is.EqualTo(9));
|
|
Assert.That(jpegConfig.Height, Is.EqualTo(4));
|
|
}
|
|
|
|
[Test]
|
|
public void VerifyImageData_RejectsInvalidAndTruncatedData()
|
|
{
|
|
byte[] pngData = CreateImageData(3, 2, new PngEncoder());
|
|
byte[] truncatedData = new byte[Math.Min(12, pngData.Length)];
|
|
Array.Copy(pngData, truncatedData, truncatedData.Length);
|
|
|
|
Assert.That(ImageUtils.VerifyImageData(Array.Empty<byte>()).ValidImage, Is.False);
|
|
Assert.That(ImageUtils.VerifyImageData(Encoding.UTF8.GetBytes("not an image")).ValidImage, Is.False);
|
|
Assert.That(ImageUtils.VerifyImageData(truncatedData).ValidImage, Is.False);
|
|
}
|
|
|
|
[Test]
|
|
public void IsSvg_RecognisesSvgAndRejectsFalsePositives()
|
|
{
|
|
byte[] svgData = Encoding.UTF8.GetBytes("<SVG xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 10 10\"></SVG>");
|
|
byte[] missingNamespace = Encoding.UTF8.GetBytes("<svg viewBox=\"0 0 10 10\"></svg>");
|
|
|
|
Assert.That(ImageUtils.IsSvg(svgData), Is.True);
|
|
Assert.That(ImageUtils.IsSvg(missingNamespace), Is.False);
|
|
Assert.That(ImageUtils.IsSvg(Encoding.UTF8.GetBytes("svg xmlns=\"http://www.w3.org/2000/svg\"")), Is.False);
|
|
Assert.That(ImageUtils.IsSvg(null), Is.False);
|
|
}
|
|
|
|
// --- Encoding and Resizing ---
|
|
|
|
[Test]
|
|
public void LoadAndEncodeImage_PreservesFormatAndDimensions()
|
|
{
|
|
byte[] originalData = CreateImageData(8, 6, new PngEncoder());
|
|
|
|
using Image image = ImageUtils.LoadImage(originalData, out IImageFormat format);
|
|
byte[] encodedData = image.GetImageData(format);
|
|
ImageUtils.ImageConfig encodedConfig = ImageUtils.VerifyImageData(encodedData);
|
|
|
|
Assert.That(format.Name, Is.EqualTo("PNG"));
|
|
Assert.That(encodedConfig.ValidImage, Is.True);
|
|
Assert.That(encodedConfig.Width, Is.EqualTo(8));
|
|
Assert.That(encodedConfig.Height, Is.EqualTo(6));
|
|
}
|
|
|
|
[Test]
|
|
public void ConstrainImage_ResizesLandscapeAndPortraitWithoutUpscaling()
|
|
{
|
|
ImageUtils.ImageConfig landscape = ImageUtils.VerifyImageData(CreateImageData(20, 10, new PngEncoder()));
|
|
ImageUtils.ImageConfig portrait = ImageUtils.VerifyImageData(CreateImageData(10, 20, new PngEncoder()));
|
|
ImageUtils.ImageConfig withinLimits = ImageUtils.VerifyImageData(CreateImageData(4, 3, new PngEncoder()));
|
|
byte[] originalData = withinLimits.ImageData;
|
|
|
|
Assert.That(ImageUtils.ConstrainImage(landscape, 8, 8), Is.True);
|
|
Assert.That(landscape.Width, Is.EqualTo(8));
|
|
Assert.That(landscape.Height, Is.EqualTo(4));
|
|
Assert.That(ImageUtils.ConstrainImage(portrait, 8, 8), Is.True);
|
|
Assert.That(portrait.Width, Is.EqualTo(4));
|
|
Assert.That(portrait.Height, Is.EqualTo(8));
|
|
Assert.That(ImageUtils.ConstrainImage(withinLimits, 8, 8), Is.True);
|
|
Assert.That(withinLimits.ImageData, Is.SameAs(originalData));
|
|
Assert.That(ImageUtils.ConstrainImage(landscape, 0, 8), Is.False);
|
|
Assert.That(ImageUtils.ConstrainImage(portrait, 8, 0), Is.False);
|
|
}
|
|
|
|
// --- Utilities ---
|
|
|
|
private static byte[] CreateImageData(int width, int height, IImageEncoder encoder)
|
|
{
|
|
using Image<Rgba32> image = new Image<Rgba32>(width, height, new Rgba32(32, 96, 160, 255));
|
|
using MemoryStream stream = new MemoryStream();
|
|
image.Save(stream, encoder);
|
|
return stream.ToArray();
|
|
}
|
|
|
|
// --- The End ---
|
|
}
|
|
}
|