1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
<?php
class BitmapMetadataHandlerTest extends MediaWikiTestCase {
public function setUp() {
$this->filePath = __DIR__ . '/../../data/media/';
}
/**
* 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() {
if ( !wfDl( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
if ( !wfDl( 'xml' ) ) {
$this->markTestSkipped( "This test needs the xml extension." );
}
global $wgShowEXIF;
$oldExif = $wgShowEXIF;
$wgShowEXIF = true;
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'/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'] );
$wgShowEXIF = $oldExif;
}
/**
* Test for jpeg comments are being handled by
* BitmapMetadataHandler correctly.
*
* There's more extensive tests of comment extraction in
* JpegMetadataExtractorTests.php
*/
public function testJpegComment() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'jpeg-comment-utf.jpg' );
$this->assertEquals( 'UTF-8 JPEG Comment — ¼',
$meta['JPEGFileComment'][0] );
}
/**
* Make sure a bad iptc block doesn't stop the other metadata
* from being extracted.
*/
public function testBadIPTC() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'iptc-invalid-psir.jpg' );
$this->assertEquals( 'Created with GIMP', $meta['JPEGFileComment'][0] );
}
public function testIPTCDates() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'iptc-timetest.jpg' );
$this->assertEquals( '2020:07:14 01:36:05', $meta['DateTimeDigitized'] );
$this->assertEquals( '1997:03:02 00:01:02', $meta['DateTimeOriginal'] );
}
/**
* File has an invalid time (+ one valid but really weird time)
* that shouldn't be included
*/
public function testIPTCDatesInvalid() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'iptc-timetest-invalid.jpg' );
$this->assertEquals( '1845:03:02 00:01:02', $meta['DateTimeOriginal'] );
$this->assertFalse( isset( $meta['DateTimeDigitized'] ) );
}
/**
* XMP data should take priority over iptc data
* when hash has been updated, but not when
* the hash is wrong.
*/
public function testMerging() {
$merger = new BitmapMetadataHandler();
$merger->addMetadata( array( 'foo' => 'xmp' ), 'xmp-general' );
$merger->addMetadata( array( 'bar' => 'xmp' ), 'xmp-general' );
$merger->addMetadata( array( 'baz' => 'xmp' ), 'xmp-general' );
$merger->addMetadata( array( 'fred' => 'xmp' ), 'xmp-general' );
$merger->addMetadata( array( 'foo' => 'iptc (hash)' ), 'iptc-good-hash' );
$merger->addMetadata( array( 'bar' => 'iptc (bad hash)' ), 'iptc-bad-hash' );
$merger->addMetadata( array( 'baz' => 'iptc (bad hash)' ), 'iptc-bad-hash' );
$merger->addMetadata( array( 'fred' => 'iptc (no hash)' ), 'iptc-no-hash' );
$merger->addMetadata( array( 'baz' => 'exif' ), 'exif' );
$actual = $merger->getMetadataArray();
$expected = array(
'foo' => 'xmp',
'bar' => 'iptc (bad hash)',
'baz' => 'exif',
'fred' => 'xmp',
);
$this->assertEquals( $expected, $actual );
}
public function testPNGXMP() {
if ( !wfDl( 'xml' ) ) {
$this->markTestSkipped( "This test needs the xml extension." );
}
$handler = new BitmapMetadataHandler();
$result = $handler->png( $this->filePath . 'xmp.png' );
$expected = array (
'frameCount' => 0,
'loopCount' => 1,
'duration' => 0,
'bitDepth' => 1,
'colorType' => 'index-coloured',
'metadata' => array (
'SerialNumber' => '123456789',
'_MW_PNG_VERSION' => 1,
),
);
$this->assertEquals( $expected, $result );
}
public function testPNGNative() {
$handler = new BitmapMetadataHandler();
$result = $handler->png( $this->filePath . 'Png-native-test.png' );
$expected = 'http://example.com/url';
$this->assertEquals( $expected, $result['metadata']['Identifier']['x-default'] );
}
public function testTiffByteOrder() {
$handler = new BitmapMetadataHandler();
$res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
$this->assertEquals( 'LE', $res );
}
}
|