5 * @covers PNGMetadataExtractor
7 class PNGMetadataExtractorTest
extends MediaWikiTestCase
{
9 protected function setUp() {
11 $this->filePath
= __DIR__
. '/../../data/media/';
15 * Tests zTXt tag (compressed textual metadata)
17 public function testPngNativetZtxt() {
18 $this->checkPHPExtension( 'zlib' );
20 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
21 'Png-native-test.png' );
22 $expected = "foo bar baz foo foo foo foof foo foo foo foo";
23 $this->assertArrayHasKey( 'text', $meta );
24 $meta = $meta['text'];
25 $this->assertArrayHasKey( 'Make', $meta );
26 $this->assertArrayHasKey( 'x-default', $meta['Make'] );
28 $this->assertEquals( $expected, $meta['Make']['x-default'] );
32 * Test tEXt tag (Uncompressed textual metadata)
34 public function testPngNativeText() {
35 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
36 'Png-native-test.png' );
37 $expected = "Some long image desc";
38 $this->assertArrayHasKey( 'text', $meta );
39 $meta = $meta['text'];
40 $this->assertArrayHasKey( 'ImageDescription', $meta );
41 $this->assertArrayHasKey( 'x-default', $meta['ImageDescription'] );
42 $this->assertArrayHasKey( '_type', $meta['ImageDescription'] );
44 $this->assertEquals( $expected, $meta['ImageDescription']['x-default'] );
48 * tEXt tags must be encoded iso-8859-1 (vs iTXt which are utf-8)
49 * Make sure non-ascii characters get converted properly
51 public function testPngNativeTextNonAscii() {
52 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
53 'Png-native-test.png' );
55 // Note the Copyright symbol here is a utf-8 one
56 // (aka \xC2\xA9) where in the file its iso-8859-1
57 // encoded as just \xA9.
58 $expected = "© 2010 Bawolff";
60 $this->assertArrayHasKey( 'text', $meta );
61 $meta = $meta['text'];
62 $this->assertArrayHasKey( 'Copyright', $meta );
63 $this->assertArrayHasKey( 'x-default', $meta['Copyright'] );
65 $this->assertEquals( $expected, $meta['Copyright']['x-default'] );
69 * Given a normal static PNG, check the animation metadata returned.
71 public function testStaticPngAnimationMetadata() {
72 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
73 'Png-native-test.png' );
75 $this->assertEquals( 0, $meta['frameCount'] );
76 $this->assertEquals( 1, $meta['loopCount'] );
77 $this->assertEquals( 0, $meta['duration'] );
81 * Given an animated APNG image file
82 * check it gets animated metadata right.
84 public function testApngAnimationMetadata() {
85 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
86 'Animated_PNG_example_bouncing_beach_ball.png' );
88 $this->assertEquals( 20, $meta['frameCount'] );
89 // Note loop count of 0 = infinity
90 $this->assertEquals( 0, $meta['loopCount'] );
91 $this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
94 public function testPngBitDepth8() {
95 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
96 'Png-native-test.png' );
98 $this->assertEquals( 8, $meta['bitDepth'] );
101 public function testPngBitDepth1() {
102 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
104 $this->assertEquals( 1, $meta['bitDepth'] );
107 public function testPngIndexColour() {
108 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
109 'Png-native-test.png' );
111 $this->assertEquals( 'index-coloured', $meta['colorType'] );
114 public function testPngRgbColour() {
115 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
117 $this->assertEquals( 'truecolour-alpha', $meta['colorType'] );
120 public function testPngRgbNoAlphaColour() {
121 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
123 $this->assertEquals( 'truecolour', $meta['colorType'] );
126 public function testPngGreyscaleColour() {
127 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
128 'greyscale-png.png' );
129 $this->assertEquals( 'greyscale-alpha', $meta['colorType'] );
132 public function testPngGreyscaleNoAlphaColour() {
133 $meta = PNGMetadataExtractor
::getMetadata( $this->filePath
.
134 'greyscale-na-png.png' );
135 $this->assertEquals( 'greyscale', $meta['colorType'] );