FormatMetadata::fetchExtendedMetadata: Ignore multiple EXIF/XMP values
[lhc/web/wiklou.git] / tests / phpunit / includes / media / FormatMetadataTest.php
1 <?php
2
3 /**
4 * @group Media
5 */
6 class FormatMetadataTest extends MediaWikiMediaTestCase {
7
8 protected function setUp() {
9 parent::setUp();
10
11 $this->checkPHPExtension( 'exif' );
12 $this->setMwGlobals( 'wgShowEXIF', true );
13 }
14
15 /**
16 * @covers File::formatMetadata
17 */
18 public function testInvalidDate() {
19 $file = $this->dataFile( 'broken_exif_date.jpg', 'image/jpeg' );
20
21 // Throws an error if bug hit
22 $meta = $file->formatMetadata();
23 $this->assertNotEquals( false, $meta, 'Valid metadata extracted' );
24
25 // Find date exif entry
26 $this->assertArrayHasKey( 'visible', $meta );
27 $dateIndex = null;
28 foreach ( $meta['visible'] as $i => $data ) {
29 if ( $data['id'] == 'exif-datetimeoriginal' ) {
30 $dateIndex = $i;
31 }
32 }
33 $this->assertNotNull( $dateIndex, 'Date entry exists in metadata' );
34 $this->assertEquals( '0000:01:00 00:02:27',
35 $meta['visible'][$dateIndex]['value'],
36 'File with invalid date metadata (bug 29471)' );
37 }
38
39 /**
40 * @param string $filename
41 * @param int $expected Total image area
42 * @dataProvider provideFlattenArray
43 * @covers FormatMetadata::flattenArray
44 */
45 public function testFlattenArray( $vals, $type, $noHtml, $ctx, $expected ) {
46 $actual = FormatMetadata::flattenArray( $vals, $type, $noHtml, $ctx );
47 $this->assertEquals( $expected, $actual );
48 }
49
50 public static function provideFlattenArray() {
51 return array(
52 array(
53 array( 1, 2, 3 ), 'ul', false, false,
54 "<ul><li>1</li>\n<li>2</li>\n<li>3</li></ul>",
55 ),
56 array(
57 array( 1, 2, 3 ), 'ol', false, false,
58 "<ol><li>1</li>\n<li>2</li>\n<li>3</li></ol>",
59 ),
60 array(
61 array( 1, 2, 3 ), 'ul', true, false,
62 "\n*1\n*2\n*3",
63 ),
64 array(
65 array( 1, 2, 3 ), 'ol', true, false,
66 "\n#1\n#2\n#3",
67 ),
68 // TODO: more test cases
69 );
70 }
71
72 /**
73 * @param mixed $input
74 * @param mixed $output
75 * @dataProvider provideResolveMultivalueValue
76 * @covers FormatMetadata::resolveMultivalueValue
77 */
78 public function testResolveMultivalueValue( $input, $output ) {
79 $formatMetadata = new FormatMetadata();
80 $class = new ReflectionClass( 'FormatMetadata' );
81 $method = $class->getMethod( 'resolveMultivalueValue' );
82 $method->setAccessible( true );
83 $actualInput = $method->invoke( $formatMetadata, $input );
84 $this->assertEquals( $output, $actualInput );
85 }
86
87 public function provideResolveMultivalueValue() {
88 return array(
89 'nonArray' => array( 'foo', 'foo' ),
90 'multiValue' => array( array( 'first', 'second', 'third', '_type' => 'ol' ), 'first' ),
91 'noType' => array( array( 'first', 'second', 'third' ), 'first' ),
92 'typeFirst' => array( array( '_type' => 'ol', 'first', 'second', 'third' ), 'first' ),
93 'multilang' => array(
94 array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
95 array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
96 ),
97 'multilang-multivalue' => array(
98 array( 'en' => array( 'first', 'second' ), 'de' => array( 'Erste', 'Zweite' ), '_type' => 'lang' ),
99 array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
100 ),
101 );
102 }
103 }