Per CR on r86169, start adding unit tests for metadata extraction.
authorBrian Wolff <bawolff@users.mediawiki.org>
Thu, 23 Jun 2011 23:25:49 +0000 (23:25 +0000)
committerBrian Wolff <bawolff@users.mediawiki.org>
Thu, 23 Jun 2011 23:25:49 +0000 (23:25 +0000)
This is just some initial tests that really only cover png's. I plan
to add more soon.

Also well I'm here, fix the svn prop on broken_exif_date.jpg from r90421.

tests/phpunit/includes/media/1bit-png.png [new file with mode: 0644]
tests/phpunit/includes/media/Animated_PNG_example_bouncing_beach_ball.png [new file with mode: 0644]
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/media/PNGMetadataExtractorTest.php [new file with mode: 0644]
tests/phpunit/includes/media/Png-native-test.png [new file with mode: 0644]
tests/phpunit/includes/media/README
tests/phpunit/includes/media/Xmp-exif-multilingual_test.jpg [new file with mode: 0644]
tests/phpunit/includes/media/greyscale-na-png.png [new file with mode: 0644]
tests/phpunit/includes/media/greyscale-png.png [new file with mode: 0644]
tests/phpunit/includes/media/rgb-na-png.png [new file with mode: 0644]
tests/phpunit/includes/media/rgb-png.png [new file with mode: 0644]

diff --git a/tests/phpunit/includes/media/1bit-png.png b/tests/phpunit/includes/media/1bit-png.png
new file mode 100644 (file)
index 0000000..254e403
Binary files /dev/null and b/tests/phpunit/includes/media/1bit-png.png differ
diff --git a/tests/phpunit/includes/media/Animated_PNG_example_bouncing_beach_ball.png b/tests/phpunit/includes/media/Animated_PNG_example_bouncing_beach_ball.png
new file mode 100644 (file)
index 0000000..c2f45d9
Binary files /dev/null and b/tests/phpunit/includes/media/Animated_PNG_example_bouncing_beach_ball.png differ
diff --git a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
new file mode 100644 (file)
index 0000000..7059545
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+class BitmapMetadataHandlerTest extends MediaWikiTestCase {
+       /**
+        * Test if having conflicting metadata values from different
+        * types of metadata, that the right one takes precedence.
+        *
+        * Basically the file has IPTC and XMP metadata, the
+        * IPTC should override the XMP, except for the multilingual
+        * translation (to en) where XMP should win.
+        */
+       public function testMultilingualCascade() {
+               
+               $meta = BitmapMetadataHandler::Jpeg( dirname( __FILE__ ) .
+                       '/Xmp-exif-multilingual_test.jpg' );
+
+               $expected = array(
+                       'x-default' => 'right(iptc)',
+                       'en'        => 'right translation',
+                       '_type'     => 'lang'
+               );
+               
+               $this->assertArrayHasKey( 'ImageDescription', $meta,
+                       'Did not extract any ImageDescription info?!' );
+
+               $this->assertEquals( $expected, $meta['ImageDescription'] );
+       }
+}
diff --git a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php b/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
new file mode 100644 (file)
index 0000000..025127e
--- /dev/null
@@ -0,0 +1,138 @@
+<?php
+class PNGMetadataExtractorTest extends MediaWikiTestCase {
+       /**
+        * Tests zTXt tag (compressed textual metadata) 
+        */
+       function testPNGNativetzTXt() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+               $expected = "foo bar baz foo foo foo foof foo foo foo foo";
+               $this->assertArrayHasKey( 'text', $meta );
+               $meta = $meta['text'];
+               $this->assertArrayHasKey( 'Make', $meta );
+               $this->assertArrayHasKey( 'x-default', $meta['Make'] );
+
+               $this->assertEquals( $expected, $meta['Make']['x-default'] );
+       }
+
+       /**
+        * Test tEXt tag (Uncompressed textual metadata)
+        */
+       function testPNGNativetEXt() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+               $expected = "Some long image desc";
+               $this->assertArrayHasKey( 'text', $meta );
+               $meta = $meta['text'];
+               $this->assertArrayHasKey( 'ImageDescription', $meta );
+               $this->assertArrayHasKey( 'x-default', $meta['ImageDescription'] );
+               $this->assertArrayHasKey( '_type', $meta['ImageDescription'] );
+
+               $this->assertEquals( $expected, $meta['ImageDescription']['x-default'] );
+       }
+
+       /**
+        * tEXt tags must be encoded iso-8859-1 (vs iTXt which are utf-8)
+        * Make sure non-ascii characters get converted properly
+        */
+       function testPNGNativettEXtNonASCII() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+
+               // Note the Copyright symbol here is a utf-8 one
+               // (aka \xC2\xA9) where in the file its iso-8859-1
+               // encoded as just \xA9.
+               $expected = "© 2010 Bawolff";
+
+
+               $this->assertArrayHasKey( 'text', $meta );
+               $meta = $meta['text'];
+               $this->assertArrayHasKey( 'Copyright', $meta );
+               $this->assertArrayHasKey( 'x-default', $meta['Copyright'] );
+
+               $this->assertEquals( $expected, $meta['Copyright']['x-default'] );
+       }
+
+       /**
+        * Test extraction of pHYs tags, which can tell what the
+        * actual resolution of the image is (aka in dots per meter).
+       function testPNGpHYsTag () {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+
+               $this->assertArrayHasKey( 'text', $meta );
+               $meta = $meta['text'];
+
+               $this->assertEquals( '2835/100', $meta['XResolution'] );
+               $this->assertEquals( '2835/100', $meta['YResolution'] );
+               $this->assertEquals( 3, $meta['ResolutionUnit'] ); // 3 = cm
+       }
+
+       /**
+        * Given a normal static PNG, check the animation metadata returned.
+        */
+       function testStaticPNGAnimationMetadata() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+
+               $this->assertEquals( 0, $meta['frameCount'] );
+               $this->assertEquals( 1, $meta['loopCount'] );
+               $this->assertEquals( 0, $meta['duration'] );
+       }
+
+       /**
+        * Given an animated APNG image file
+        * check it gets animated metadata right.
+        */
+       function testAPNGAnimationMetadata() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Animated_PNG_example_bouncing_beach_ball.png' );
+
+               $this->assertEquals( 20, $meta['frameCount'] );
+               // Note loop count of 0 = infinity
+               $this->assertEquals( 0, $meta['loopCount'] );
+               $this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
+       }
+
+       function testPNGBitDepth8() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+
+               $this->assertEquals( 8, $meta['bitDepth'] );
+       }
+       function testPNGBitDepth1() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/1bit-png.png' );
+               $this->assertEquals( 1, $meta['bitDepth'] );
+       }
+
+
+       function testPNGindexColour() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/Png-native-test.png' );
+
+               $this->assertEquals( 'index-coloured', $meta['colorType'] );
+       }
+       function testPNGrgbColour() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/rgb-png.png' );
+               $this->assertEquals( 'truecolour-alpha', $meta['colorType'] );
+       }
+       function testPNGrgbNoAlphaColour() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/rgb-na-png.png' );
+               $this->assertEquals( 'truecolour', $meta['colorType'] );
+       }
+       function testPNGgreyscaleColour() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/greyscale-png.png' );
+               $this->assertEquals( 'greyscale-alpha', $meta['colorType'] );
+       }
+       function testPNGgreyscaleNoAlphaColour() {
+               $meta = PNGMetadataExtractor::getMetadata( dirname( __FILE__ ) .
+                       '/greyscale-na-png.png' );
+               $this->assertEquals( 'greyscale', $meta['colorType'] );
+       }
+
+
+}
diff --git a/tests/phpunit/includes/media/Png-native-test.png b/tests/phpunit/includes/media/Png-native-test.png
new file mode 100644 (file)
index 0000000..a0b81ca
Binary files /dev/null and b/tests/phpunit/includes/media/Png-native-test.png differ
index cbed0ac..91e3c4f 100644 (file)
@@ -14,3 +14,15 @@ http://commons.wikimedia.org/wiki/File:US_states_by_total_state_tax_revenue.svg
 CC-BY 3.0
 TastyCakes on English Wikipedia
 
+
+greyscale-na-png.png, rgb-png.png, Xmp-exif-multilingual_test.jpg
+greyscale-png.png, 1bit-png.png, Png-native-test.png, rgb-na-png.png
+Are all by Bawolff. I don't think they contain enough originality to
+claim copyright, but on the off chance they do, feel free to use them
+however you feel fit, without restriction.
+
+Animated_PNG_example_bouncing_beach_ball.png
+http://commons.wikimedia.org/wiki/File:Animated_PNG_example_bouncing_beach_ball.png (originally http://www.treebuilder.de/default.asp?file=89031.xml )
+Public Domain
+Holger Will
+
diff --git a/tests/phpunit/includes/media/Xmp-exif-multilingual_test.jpg b/tests/phpunit/includes/media/Xmp-exif-multilingual_test.jpg
new file mode 100644 (file)
index 0000000..f7b2302
Binary files /dev/null and b/tests/phpunit/includes/media/Xmp-exif-multilingual_test.jpg differ
diff --git a/tests/phpunit/includes/media/greyscale-na-png.png b/tests/phpunit/includes/media/greyscale-na-png.png
new file mode 100644 (file)
index 0000000..4a4b745
Binary files /dev/null and b/tests/phpunit/includes/media/greyscale-na-png.png differ
diff --git a/tests/phpunit/includes/media/greyscale-png.png b/tests/phpunit/includes/media/greyscale-png.png
new file mode 100644 (file)
index 0000000..340a67b
Binary files /dev/null and b/tests/phpunit/includes/media/greyscale-png.png differ
diff --git a/tests/phpunit/includes/media/rgb-na-png.png b/tests/phpunit/includes/media/rgb-na-png.png
new file mode 100644 (file)
index 0000000..2f2a5ca
Binary files /dev/null and b/tests/phpunit/includes/media/rgb-na-png.png differ
diff --git a/tests/phpunit/includes/media/rgb-png.png b/tests/phpunit/includes/media/rgb-png.png
new file mode 100644 (file)
index 0000000..6f40cc9
Binary files /dev/null and b/tests/phpunit/includes/media/rgb-png.png differ