ImageGenerationTests.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using FluentAssertions;
  5. using NUnit.Framework;
  6. using QuestPDF.Fluent;
  7. using QuestPDF.Helpers;
  8. using QuestPDF.Infrastructure;
  9. using SkiaSharp;
  10. namespace QuestPDF.UnitTests
  11. {
  12. public class GenerateImageTests
  13. {
  14. [Test]
  15. [TestCaseSource(nameof(GeneratedImageResolutionCorrespondsToTargetDpi_TestCases))]
  16. public void GeneratedImageResolutionCorrespondsToTargetDpi(GeneratedImageResolutionCorrespondsToTargetDpi_TestCaseItem testCase)
  17. {
  18. // act
  19. var images = Document
  20. .Create(document => document.Page(page =>
  21. {
  22. page.Size(testCase.PageSize);
  23. page.Content().Text("Test");
  24. }))
  25. .GenerateImages(new ImageGenerationSettings { RasterDpi = testCase.TargetDpi });
  26. // assert
  27. images.Should().HaveCount(1);
  28. var imageData = images.First();
  29. imageData.Should().NotBeNull();
  30. using var image = SKImage.FromEncodedData(imageData);
  31. image.Should().NotBeNull();
  32. image.Width.Should().Be(testCase.ExpectedImageSize.Width);
  33. image.Height.Should().Be(testCase.ExpectedImageSize.Height);
  34. }
  35. public record GeneratedImageResolutionCorrespondsToTargetDpi_TestCaseItem(PageSize PageSize, int TargetDpi, ImageSize ExpectedImageSize);
  36. public static GeneratedImageResolutionCorrespondsToTargetDpi_TestCaseItem[] GeneratedImageResolutionCorrespondsToTargetDpi_TestCases =
  37. {
  38. new(new PageSize(150, 250), 72, new ImageSize(150, 250)),
  39. new(new PageSize(200, 300), 144, new ImageSize(400, 600)),
  40. new(new PageSize(250, 350), 360, new ImageSize(1250, 1750)),
  41. };
  42. [Test]
  43. public void GeneratedImageSizeCorrespondsToImageQuality()
  44. {
  45. // arrange
  46. var document = Document.Create(document => document.Page(page =>
  47. {
  48. page.Content().Image("Resources/photo.jpg");
  49. }));
  50. // act
  51. var imageSizeWithLowQuality = CheckImageSize(ImageCompressionQuality.Low);
  52. var imageSizeWithMediumQuality = CheckImageSize(ImageCompressionQuality.Medium);
  53. var imageSizeWithHighQuality = CheckImageSize(ImageCompressionQuality.High);
  54. // assert
  55. imageSizeWithLowQuality.Should().BeLessThan(imageSizeWithMediumQuality);
  56. imageSizeWithMediumQuality.Should().BeLessThan(imageSizeWithHighQuality);
  57. int CheckImageSize(ImageCompressionQuality quality)
  58. {
  59. var images = document.GenerateImages(new ImageGenerationSettings() { ImageFormat = ImageFormat.Jpeg, ImageCompressionQuality = quality });
  60. images.Should().HaveCount(1);
  61. var image = images.First();
  62. image.Should().NotBeNull();
  63. return image.Length;
  64. }
  65. }
  66. [TestCase(ImageFormat.Png)]
  67. [TestCase(ImageFormat.Jpeg)]
  68. [TestCase(ImageFormat.Webp)]
  69. public void ImageFormatIsRespected(ImageFormat imageFormat)
  70. {
  71. var images = Document
  72. .Create(document =>
  73. {
  74. document.Page(page =>
  75. {
  76. page.Content().Padding(25).AspectRatio(2).Background(Colors.Red.Medium);
  77. });
  78. })
  79. .GenerateImages(new ImageGenerationSettings() { ImageFormat = imageFormat });
  80. images.Should().HaveCount(1);
  81. var imageData = images.First();
  82. imageData.Should().NotBeNull();
  83. using var imageStream = new MemoryStream(imageData);
  84. using var imageCodec = SKCodec.Create(imageStream);
  85. imageCodec.EncodedFormat.ToString().Should().Be(imageFormat.ToString());
  86. }
  87. }
  88. }