PNGTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. /**
  3. * @group Media
  4. */
  5. class PNGHandlerTest extends MediaWikiMediaTestCase {
  6. /** @var PNGHandler */
  7. protected $handler;
  8. protected function setUp() {
  9. parent::setUp();
  10. $this->handler = new PNGHandler();
  11. }
  12. /**
  13. * @covers PNGHandler::getMetadata
  14. */
  15. public function testInvalidFile() {
  16. $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
  17. $this->assertEquals( PNGHandler::BROKEN_FILE, $res );
  18. }
  19. /**
  20. * @param string $filename Basename of the file to check
  21. * @param bool $expected Expected result.
  22. * @dataProvider provideIsAnimated
  23. * @covers PNGHandler::isAnimatedImage
  24. */
  25. public function testIsAnimanted( $filename, $expected ) {
  26. $file = $this->dataFile( $filename, 'image/png' );
  27. $actual = $this->handler->isAnimatedImage( $file );
  28. $this->assertEquals( $expected, $actual );
  29. }
  30. public static function provideIsAnimated() {
  31. return [
  32. [ 'Animated_PNG_example_bouncing_beach_ball.png', true ],
  33. [ '1bit-png.png', false ],
  34. ];
  35. }
  36. /**
  37. * @param string $filename
  38. * @param int $expected Total image area
  39. * @dataProvider provideGetImageArea
  40. * @covers PNGHandler::getImageArea
  41. */
  42. public function testGetImageArea( $filename, $expected ) {
  43. $file = $this->dataFile( $filename, 'image/png' );
  44. $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
  45. $this->assertEquals( $expected, $actual );
  46. }
  47. public static function provideGetImageArea() {
  48. return [
  49. [ '1bit-png.png', 2500 ],
  50. [ 'greyscale-png.png', 2500 ],
  51. [ 'Png-native-test.png', 126000 ],
  52. [ 'Animated_PNG_example_bouncing_beach_ball.png', 10000 ],
  53. ];
  54. }
  55. /**
  56. * @param string $metadata Serialized metadata
  57. * @param int $expected One of the class constants of PNGHandler
  58. * @dataProvider provideIsMetadataValid
  59. * @covers PNGHandler::isMetadataValid
  60. */
  61. public function testIsMetadataValid( $metadata, $expected ) {
  62. $actual = $this->handler->isMetadataValid( null, $metadata );
  63. $this->assertEquals( $expected, $actual );
  64. }
  65. public static function provideIsMetadataValid() {
  66. // phpcs:disable Generic.Files.LineLength
  67. return [
  68. [ PNGHandler::BROKEN_FILE, PNGHandler::METADATA_GOOD ],
  69. [ '', PNGHandler::METADATA_BAD ],
  70. [ null, PNGHandler::METADATA_BAD ],
  71. [ 'Something invalid!', PNGHandler::METADATA_BAD ],
  72. [
  73. 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}',
  74. PNGHandler::METADATA_GOOD
  75. ],
  76. ];
  77. // phpcs:enable
  78. }
  79. /**
  80. * @param string $filename
  81. * @param string $expected Serialized array
  82. * @dataProvider provideGetMetadata
  83. * @covers PNGHandler::getMetadata
  84. */
  85. public function testGetMetadata( $filename, $expected ) {
  86. $file = $this->dataFile( $filename, 'image/png' );
  87. $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
  88. // $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
  89. $this->assertEquals( ( $expected ), ( $actual ) );
  90. }
  91. public static function provideGetMetadata() {
  92. // phpcs:disable Generic.Files.LineLength
  93. return [
  94. [
  95. 'rgb-na-png.png',
  96. 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}'
  97. ],
  98. [
  99. 'xmp.png',
  100. 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}'
  101. ],
  102. ];
  103. // phpcs:enable
  104. }
  105. /**
  106. * @param string $filename
  107. * @param array $expected Expected standard metadata
  108. * @dataProvider provideGetIndependentMetaArray
  109. * @covers PNGHandler::getCommonMetaArray
  110. */
  111. public function testGetIndependentMetaArray( $filename, $expected ) {
  112. $file = $this->dataFile( $filename, 'image/png' );
  113. $actual = $this->handler->getCommonMetaArray( $file );
  114. $this->assertEquals( $expected, $actual );
  115. }
  116. public static function provideGetIndependentMetaArray() {
  117. return [
  118. [ 'rgb-na-png.png', [] ],
  119. [ 'xmp.png',
  120. [
  121. 'SerialNumber' => '123456789',
  122. ]
  123. ],
  124. ];
  125. }
  126. /**
  127. * @param string $filename
  128. * @param float $expectedLength
  129. * @dataProvider provideGetLength
  130. * @covers PNGHandler::getLength
  131. */
  132. public function testGetLength( $filename, $expectedLength ) {
  133. $file = $this->dataFile( $filename, 'image/png' );
  134. $actualLength = $file->getLength();
  135. $this->assertEquals( $expectedLength, $actualLength, '', 0.00001 );
  136. }
  137. public function provideGetLength() {
  138. return [
  139. [ 'Animated_PNG_example_bouncing_beach_ball.png', 1.5 ],
  140. [ 'Png-native-test.png', 0.0 ],
  141. [ 'greyscale-png.png', 0.0 ],
  142. [ '1bit-png.png', 0.0 ],
  143. ];
  144. }
  145. }