Merge "Add type hint against LinkTarget"
[lhc/web/wiklou.git] / tests / phpunit / includes / media / IPTCTest.php
1 <?php
2
3 /**
4 * @group Media
5 */
6 class IPTCTest extends MediaWikiTestCase {
7
8 /**
9 * @covers IPTC::getCharset
10 */
11 public function testRecognizeUtf8() {
12 // utf-8 is the only one used in practise.
13 $res = IPTC::getCharset( "\x1b%G" );
14 $this->assertEquals( 'UTF-8', $res );
15 }
16
17 /**
18 * @covers IPTC::Parse
19 */
20 public function testIPTCParseNoCharset88591() {
21 // basically IPTC for keyword with value of 0xBC which is 1/4 in iso-8859-1
22 // This data doesn't specify a charset. We're supposed to guess
23 // (which basically means utf-8 if valid, windows 1252 (iso 8859-1) if not)
24 $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x06\x1c\x02\x19\x00\x01\xBC";
25 $res = IPTC::Parse( $iptcData );
26 $this->assertEquals( [ '¼' ], $res['Keywords'] );
27 }
28
29 /**
30 * @covers IPTC::Parse
31 */
32 public function testIPTCParseNoCharset88591b() {
33 /* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
34 /* \xC3 = Ã, \xB8 = ¸ */
35 $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x09\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8";
36 $res = IPTC::Parse( $iptcData );
37 $this->assertEquals( [ 'ÃÃø' ], $res['Keywords'] );
38 }
39
40 /**
41 * Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
42 * What should happen is the first "\xC3\xC3" should be dropped as invalid,
43 * leaving \xC3\xB8, which is ø
44 * @covers IPTC::Parse
45 */
46 public function testIPTCParseForcedUTFButInvalid() {
47 if ( version_compare( PHP_VERSION, '5.5.26', '<' )
48 || ( version_compare( PHP_VERSION, '5.6.0', '>' )
49 && version_compare( PHP_VERSION, '5.6.10', '<' )
50 )
51 ) {
52 $this->markTestSkipped( 'Test fails on pre-PHP 5.5.25. See T124574/T39665 for details.' );
53 }
54 $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
55 . "\x1c\x01\x5A\x00\x03\x1B\x25\x47";
56 $res = IPTC::Parse( $iptcData );
57 $this->assertEquals( [ 'ø' ], $res['Keywords'] );
58 }
59
60 /**
61 * @covers IPTC::Parse
62 */
63 public function testIPTCParseNoCharsetUTF8() {
64 $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x07\x1c\x02\x19\x00\x02¼";
65 $res = IPTC::Parse( $iptcData );
66 $this->assertEquals( [ '¼' ], $res['Keywords'] );
67 }
68
69 /**
70 * Testing something that has 2 values for keyword
71 * @covers IPTC::Parse
72 */
73 public function testIPTCParseMulti() {
74 $iptcData = /* identifier */ "Photoshop 3.0\08BIM\4\4"
75 /* length */ . "\0\0\0\0\0\x0D"
76 . "\x1c\x02\x19" . "\x00\x01" . "\xBC"
77 . "\x1c\x02\x19" . "\x00\x02" . "\xBC\xBD";
78 $res = IPTC::Parse( $iptcData );
79 $this->assertEquals( [ '¼', '¼½' ], $res['Keywords'] );
80 }
81
82 /**
83 * @covers IPTC::Parse
84 */
85 public function testIPTCParseUTF8() {
86 // This has the magic "\x1c\x01\x5A\x00\x03\x1B\x25\x47" which marks content as UTF8.
87 $iptcData =
88 "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
89 $res = IPTC::Parse( $iptcData );
90 $this->assertEquals( [ '¼' ], $res['Keywords'] );
91 }
92 }