Files
Common-VS2019/SacsCoreUnitTests/Standard/Base/Utils/ImageUtils_Tester.cs
T

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