]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - tests/phpunit/includes/libs/StringUtilsTest.php
MediaWiki 1.30.2
[autoinstalls/mediawiki.git] / tests / phpunit / includes / libs / StringUtilsTest.php
1 <?php
2
3 class StringUtilsTest extends PHPUnit_Framework_TestCase {
4
5         /**
6          * @covers StringUtils::isUtf8
7          * @dataProvider provideStringsForIsUtf8Check
8          */
9         public function testIsUtf8( $expected, $string ) {
10                 $this->assertEquals( $expected, StringUtils::isUtf8( $string ),
11                         'Testing string "' . $this->escaped( $string ) . '"' );
12         }
13
14         /**
15          * Print high range characters as a hexadecimal
16          * @param string $string
17          * @return string
18          */
19         function escaped( $string ) {
20                 $escaped = '';
21                 $length = strlen( $string );
22                 for ( $i = 0; $i < $length; $i++ ) {
23                         $char = $string[$i];
24                         $val = ord( $char );
25                         if ( $val > 127 ) {
26                                 $escaped .= '\x' . dechex( $val );
27                         } else {
28                                 $escaped .= $char;
29                         }
30                 }
31
32                 return $escaped;
33         }
34
35         /**
36          * See also "UTF-8 decoder capability and stress test" by
37          * Markus Kuhn:
38          * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
39          */
40         public static function provideStringsForIsUtf8Check() {
41                 // Expected return values for StringUtils::isUtf8()
42                 $PASS = true;
43                 $FAIL = false;
44
45                 return [
46                         'some ASCII' => [ $PASS, 'Some ASCII' ],
47                         'euro sign' => [ $PASS, "Euro sign €" ],
48
49                         'first possible sequence 1 byte' => [ $PASS, "\x00" ],
50                         'first possible sequence 2 bytes' => [ $PASS, "\xc2\x80" ],
51                         'first possible sequence 3 bytes' => [ $PASS, "\xe0\xa0\x80" ],
52                         'first possible sequence 4 bytes' => [ $PASS, "\xf0\x90\x80\x80" ],
53                         'first possible sequence 5 bytes' => [ $FAIL, "\xf8\x88\x80\x80\x80" ],
54                         'first possible sequence 6 bytes' => [ $FAIL, "\xfc\x84\x80\x80\x80\x80" ],
55
56                         'last possible sequence 1 byte' => [ $PASS, "\x7f" ],
57                         'last possible sequence 2 bytes' => [ $PASS, "\xdf\xbf" ],
58                         'last possible sequence 3 bytes' => [ $PASS, "\xef\xbf\xbf" ],
59                         'last possible sequence 4 bytes (U+1FFFFF)' => [ $FAIL, "\xf7\xbf\xbf\xbf" ],
60                         'last possible sequence 5 bytes' => [ $FAIL, "\xfb\xbf\xbf\xbf\xbf" ],
61                         'last possible sequence 6 bytes' => [ $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ],
62
63                         'boundary 1' => [ $PASS, "\xed\x9f\xbf" ],
64                         'boundary 2' => [ $PASS, "\xee\x80\x80" ],
65                         'boundary 3' => [ $PASS, "\xef\xbf\xbd" ],
66                         'boundary 4' => [ $PASS, "\xf2\x80\x80\x80" ],
67                         'boundary 5 (U+FFFFF)' => [ $PASS, "\xf3\xbf\xbf\xbf" ],
68                         'boundary 6 (U+100000)' => [ $PASS, "\xf4\x80\x80\x80" ],
69                         'boundary 7 (U+10FFFF)' => [ $PASS, "\xf4\x8f\xbf\xbf" ],
70                         'boundary 8 (U+110000)' => [ $FAIL, "\xf4\x90\x80\x80" ],
71
72                         'malformed 1' => [ $FAIL, "\x80" ],
73                         'malformed 2' => [ $FAIL, "\xbf" ],
74                         'malformed 3' => [ $FAIL, "\x80\xbf" ],
75                         'malformed 4' => [ $FAIL, "\x80\xbf\x80" ],
76                         'malformed 5' => [ $FAIL, "\x80\xbf\x80\xbf" ],
77                         'malformed 6' => [ $FAIL, "\x80\xbf\x80\xbf\x80" ],
78                         'malformed 7' => [ $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ],
79                         'malformed 8' => [ $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ],
80
81                         'last byte missing 1' => [ $FAIL, "\xc0" ],
82                         'last byte missing 2' => [ $FAIL, "\xe0\x80" ],
83                         'last byte missing 3' => [ $FAIL, "\xf0\x80\x80" ],
84                         'last byte missing 4' => [ $FAIL, "\xf8\x80\x80\x80" ],
85                         'last byte missing 5' => [ $FAIL, "\xfc\x80\x80\x80\x80" ],
86                         'last byte missing 6' => [ $FAIL, "\xdf" ],
87                         'last byte missing 7' => [ $FAIL, "\xef\xbf" ],
88                         'last byte missing 8' => [ $FAIL, "\xf7\xbf\xbf" ],
89                         'last byte missing 9' => [ $FAIL, "\xfb\xbf\xbf\xbf" ],
90                         'last byte missing 10' => [ $FAIL, "\xfd\xbf\xbf\xbf\xbf" ],
91
92                         'extra continuation byte 1' => [ $FAIL, "e\xaf" ],
93                         'extra continuation byte 2' => [ $FAIL, "\xc3\x89\xaf" ],
94                         'extra continuation byte 3' => [ $FAIL, "\xef\xbc\xa5\xaf" ],
95                         'extra continuation byte 4' => [ $FAIL, "\xf0\x9d\x99\xb4\xaf" ],
96
97                         'impossible bytes 1' => [ $FAIL, "\xfe" ],
98                         'impossible bytes 2' => [ $FAIL, "\xff" ],
99                         'impossible bytes 3' => [ $FAIL, "\xfe\xfe\xff\xff" ],
100
101                         'overlong sequences 1' => [ $FAIL, "\xc0\xaf" ],
102                         'overlong sequences 2' => [ $FAIL, "\xc1\xaf" ],
103                         'overlong sequences 3' => [ $FAIL, "\xe0\x80\xaf" ],
104                         'overlong sequences 4' => [ $FAIL, "\xf0\x80\x80\xaf" ],
105                         'overlong sequences 5' => [ $FAIL, "\xf8\x80\x80\x80\xaf" ],
106                         'overlong sequences 6' => [ $FAIL, "\xfc\x80\x80\x80\x80\xaf" ],
107
108                         'maximum overlong sequences 1' => [ $FAIL, "\xc1\xbf" ],
109                         'maximum overlong sequences 2' => [ $FAIL, "\xe0\x9f\xbf" ],
110                         'maximum overlong sequences 3' => [ $FAIL, "\xf0\x8f\xbf\xbf" ],
111                         'maximum overlong sequences 4' => [ $FAIL, "\xf8\x87\xbf\xbf" ],
112                         'maximum overlong sequences 5' => [ $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ],
113
114                         'surrogates 1 (U+D799)' => [ $PASS, "\xed\x9f\xbf" ],
115                         'surrogates 2 (U+E000)' => [ $PASS, "\xee\x80\x80" ],
116                         'surrogates 3 (U+D800)' => [ $FAIL, "\xed\xa0\x80" ],
117                         'surrogates 4 (U+DBFF)' => [ $FAIL, "\xed\xaf\xbf" ],
118                         'surrogates 5 (U+DC00)' => [ $FAIL, "\xed\xb0\x80" ],
119                         'surrogates 6 (U+DFFF)' => [ $FAIL, "\xed\xbf\xbf" ],
120                         'surrogates 7 (U+D800 U+DC00)' => [ $FAIL, "\xed\xa0\x80\xed\xb0\x80" ],
121
122                         'noncharacters 1' => [ $PASS, "\xef\xbf\xbe" ],
123                         'noncharacters 2' => [ $PASS, "\xef\xbf\xbf" ],
124                 ];
125         }
126 }