// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; using System.IO; using System.Linq; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.PixelFormats; using Moq; using Xunit; namespace SixLabors.ImageSharp.Tests { /// /// Tests the class. /// public class ImageSaveTests : IDisposable { private readonly Image Image; private readonly Mock fileSystem; private readonly Mock encoder; private readonly Mock encoderNotInFormat; private Mock localMimeTypeDetector; private Mock localImageFormat; public ImageSaveTests() { this.localImageFormat = new Mock(); this.localImageFormat.Setup(x => x.FileExtensions).Returns(new[] { "png" }); this.localMimeTypeDetector = new Mock(); this.localMimeTypeDetector.Setup(x => x.HeaderSize).Returns(1); this.localMimeTypeDetector.Setup(x => x.DetectFormat(It.IsAny>())).Returns(localImageFormat.Object); this.encoder = new Mock(); this.encoderNotInFormat = new Mock(); this.fileSystem = new Mock(); var config = new Configuration() { FileSystem = this.fileSystem.Object }; config.AddImageFormatDetector(this.localMimeTypeDetector.Object); config.SetEncoder(localImageFormat.Object, this.encoder.Object); this.Image = new Image(config, 1, 1); } [Fact] public void SavePixelData_Rgba32() { using (var img = new Image(2, 2)) { img[0, 0] = Rgba32.White; img[1, 0] = Rgba32.Black; img[0, 1] = Rgba32.Red; img[1, 1] = Rgba32.Blue; var buffer = new byte[2 * 2 * 4]; // width * height * bytes per pixel img.SavePixelData(buffer); Assert.Equal(255, buffer[0]); // 0, 0, R Assert.Equal(255, buffer[1]); // 0, 0, G Assert.Equal(255, buffer[2]); // 0, 0, B Assert.Equal(255, buffer[3]); // 0, 0, A Assert.Equal(0, buffer[4]); // 1, 0, R Assert.Equal(0, buffer[5]); // 1, 0, G Assert.Equal(0, buffer[6]); // 1, 0, B Assert.Equal(255, buffer[7]); // 1, 0, A Assert.Equal(255, buffer[8]); // 0, 1, R Assert.Equal(0, buffer[9]); // 0, 1, G Assert.Equal(0, buffer[10]); // 0, 1, B Assert.Equal(255, buffer[11]); // 0, 1, A Assert.Equal(0, buffer[12]); // 1, 1, R Assert.Equal(0, buffer[13]); // 1, 1, G Assert.Equal(255, buffer[14]); // 1, 1, B Assert.Equal(255, buffer[15]); // 1, 1, A } } [Fact] public void SavePixelData_Bgr24() { using (var img = new Image(2, 2)) { img[0, 0] = NamedColors.White; img[1, 0] = NamedColors.Black; img[0, 1] = NamedColors.Red; img[1, 1] = NamedColors.Blue; var buffer = new byte[2 * 2 * 3]; // width * height * bytes per pixel img.SavePixelData(buffer); Assert.Equal(255, buffer[0]); // 0, 0, B Assert.Equal(255, buffer[1]); // 0, 0, G Assert.Equal(255, buffer[2]); // 0, 0, R Assert.Equal(0, buffer[3]); // 1, 0, B Assert.Equal(0, buffer[4]); // 1, 0, G Assert.Equal(0, buffer[5]); // 1, 0, R Assert.Equal(0, buffer[6]); // 0, 1, B Assert.Equal(0, buffer[7]); // 0, 1, G Assert.Equal(255, buffer[8]); // 0, 1, R Assert.Equal(255, buffer[9]); // 1, 1, B Assert.Equal(0, buffer[10]); // 1, 1, G Assert.Equal(0, buffer[11]); // 1, 1, R } } [Fact] public void SavePixelData_Rgba32_Buffer_must_be_bigger() { using (var img = new Image(2, 2)) { img[0, 0] = Rgba32.White; img[1, 0] = Rgba32.Black; img[0, 1] = Rgba32.Red; img[1, 1] = Rgba32.Blue; var buffer = new byte[2 * 2]; // width * height * bytes per pixel Assert.Throws(() => { img.SavePixelData(buffer); }); } } [Fact] public void SavePath() { Stream stream = new MemoryStream(); this.fileSystem.Setup(x => x.Create("path.png")).Returns(stream); this.Image.Save("path.png"); this.encoder.Verify(x => x.Encode(this.Image, stream)); } [Fact] public void SavePathWithEncoder() { Stream stream = new MemoryStream(); this.fileSystem.Setup(x => x.Create("path.jpg")).Returns(stream); this.Image.Save("path.jpg", this.encoderNotInFormat.Object); this.encoderNotInFormat.Verify(x => x.Encode(this.Image, stream)); } [Fact] public void ToBase64String() { var str = this.Image.ToBase64String(localImageFormat.Object); this.encoder.Verify(x => x.Encode(this.Image, It.IsAny())); } [Fact] public void SaveStreamWithMime() { Stream stream = new MemoryStream(); this.Image.Save(stream, localImageFormat.Object); this.encoder.Verify(x => x.Encode(this.Image, stream)); } [Fact] public void SaveStreamWithEncoder() { Stream stream = new MemoryStream(); this.Image.Save(stream, this.encoderNotInFormat.Object); this.encoderNotInFormat.Verify(x => x.Encode(this.Image, stream)); } public void Dispose() { this.Image.Dispose(); } } }