ImageGenerationTests.cs 4.0 KB

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