Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\Component\Utility;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Utility\Unicode;
|
Chris@0
|
6 use PHPUnit\Framework\TestCase;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Test unicode handling features implemented in Unicode component.
|
Chris@0
|
10 *
|
Chris@0
|
11 * @group Utility
|
Chris@0
|
12 *
|
Chris@0
|
13 * @coversDefaultClass \Drupal\Component\Utility\Unicode
|
Chris@0
|
14 */
|
Chris@0
|
15 class UnicodeTest extends TestCase {
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@17
|
18 * @group legacy
|
Chris@17
|
19 * @expectedDeprecation \Drupal\Component\Utility\Unicode::setStatus() is deprecated in Drupal 8.6.0 and will be removed before Drupal 9.0.0. In Drupal 9 there will be no way to set the status and in Drupal 8 this ability has been removed because mb_*() functions are supplied using Symfony's polyfill. See https://www.drupal.org/node/2850048.
|
Chris@0
|
20 */
|
Chris@17
|
21 public function testSetStatus() {
|
Chris@17
|
22 Unicode::setStatus(Unicode::STATUS_SINGLEBYTE);
|
Chris@0
|
23 }
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * Tests multibyte encoding and decoding.
|
Chris@0
|
27 *
|
Chris@0
|
28 * @dataProvider providerTestMimeHeader
|
Chris@0
|
29 * @covers ::mimeHeaderEncode
|
Chris@0
|
30 * @covers ::mimeHeaderDecode
|
Chris@0
|
31 */
|
Chris@0
|
32 public function testMimeHeader($value, $encoded) {
|
Chris@0
|
33 $this->assertEquals($encoded, Unicode::mimeHeaderEncode($value));
|
Chris@0
|
34 $this->assertEquals($value, Unicode::mimeHeaderDecode($encoded));
|
Chris@0
|
35 }
|
Chris@0
|
36
|
Chris@0
|
37 /**
|
Chris@0
|
38 * Data provider for testMimeHeader().
|
Chris@0
|
39 *
|
Chris@0
|
40 * @see testMimeHeader()
|
Chris@0
|
41 *
|
Chris@0
|
42 * @return array
|
Chris@0
|
43 * An array containing a string and its encoded value.
|
Chris@0
|
44 */
|
Chris@0
|
45 public function providerTestMimeHeader() {
|
Chris@0
|
46 return [
|
Chris@0
|
47 ['tést.txt', '=?UTF-8?B?dMOpc3QudHh0?='],
|
Chris@0
|
48 // Simple ASCII characters.
|
Chris@0
|
49 ['ASCII', 'ASCII'],
|
Chris@0
|
50 ];
|
Chris@0
|
51 }
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * Tests multibyte strtolower.
|
Chris@0
|
55 *
|
Chris@0
|
56 * @dataProvider providerStrtolower
|
Chris@0
|
57 * @covers ::strtolower
|
Chris@0
|
58 * @covers ::caseFlip
|
Chris@17
|
59 * @group legacy
|
Chris@17
|
60 * @expectedDeprecation \Drupal\Component\Utility\Unicode::strtolower() is deprecated in Drupal 8.6.0 and will be removed before Drupal 9.0.0. Use mb_strtolower() instead. See https://www.drupal.org/node/2850048.
|
Chris@0
|
61 */
|
Chris@17
|
62 public function testStrtolower($text, $expected) {
|
Chris@0
|
63 $this->assertEquals($expected, Unicode::strtolower($text));
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66 /**
|
Chris@0
|
67 * Data provider for testStrtolower().
|
Chris@0
|
68 *
|
Chris@0
|
69 * @see testStrtolower()
|
Chris@0
|
70 *
|
Chris@0
|
71 * @return array
|
Chris@17
|
72 * An array containing a string and its lowercase version.
|
Chris@0
|
73 */
|
Chris@0
|
74 public function providerStrtolower() {
|
Chris@17
|
75 return [
|
Chris@0
|
76 ['tHe QUIcK bRoWn', 'the quick brown'],
|
Chris@0
|
77 ['FrançAIS is ÜBER-åwesome', 'français is über-åwesome'],
|
Chris@17
|
78 ['ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ', 'αβγδεζηθικλμνξοσὠ'],
|
Chris@0
|
79 ];
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 /**
|
Chris@0
|
83 * Tests multibyte strtoupper.
|
Chris@0
|
84 *
|
Chris@0
|
85 * @dataProvider providerStrtoupper
|
Chris@0
|
86 * @covers ::strtoupper
|
Chris@0
|
87 * @covers ::caseFlip
|
Chris@17
|
88 * @group legacy
|
Chris@17
|
89 * @expectedDeprecation \Drupal\Component\Utility\Unicode::strtoupper() is deprecated in Drupal 8.6.0 and will be removed before Drupal 9.0.0. Use mb_strtoupper() instead. See https://www.drupal.org/node/2850048.
|
Chris@0
|
90 */
|
Chris@17
|
91 public function testStrtoupper($text, $expected) {
|
Chris@0
|
92 $this->assertEquals($expected, Unicode::strtoupper($text));
|
Chris@0
|
93 }
|
Chris@0
|
94
|
Chris@0
|
95 /**
|
Chris@0
|
96 * Data provider for testStrtoupper().
|
Chris@0
|
97 *
|
Chris@0
|
98 * @see testStrtoupper()
|
Chris@0
|
99 *
|
Chris@0
|
100 * @return array
|
Chris@17
|
101 * An array containing a string and its uppercase version.
|
Chris@0
|
102 */
|
Chris@0
|
103 public function providerStrtoupper() {
|
Chris@17
|
104 return [
|
Chris@0
|
105 ['tHe QUIcK bRoWn', 'THE QUICK BROWN'],
|
Chris@0
|
106 ['FrançAIS is ÜBER-åwesome', 'FRANÇAIS IS ÜBER-ÅWESOME'],
|
Chris@17
|
107 ['αβγδεζηθικλμνξοσὠ', 'ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ'],
|
Chris@0
|
108 ];
|
Chris@0
|
109 }
|
Chris@0
|
110
|
Chris@0
|
111 /**
|
Chris@0
|
112 * Tests multibyte ucfirst.
|
Chris@0
|
113 *
|
Chris@0
|
114 * @dataProvider providerUcfirst
|
Chris@0
|
115 * @covers ::ucfirst
|
Chris@0
|
116 */
|
Chris@0
|
117 public function testUcfirst($text, $expected) {
|
Chris@0
|
118 $this->assertEquals($expected, Unicode::ucfirst($text));
|
Chris@0
|
119 }
|
Chris@0
|
120
|
Chris@0
|
121 /**
|
Chris@0
|
122 * Data provider for testUcfirst().
|
Chris@0
|
123 *
|
Chris@0
|
124 * @see testUcfirst()
|
Chris@0
|
125 *
|
Chris@0
|
126 * @return array
|
Chris@0
|
127 * An array containing a string and its uppercase first version.
|
Chris@0
|
128 */
|
Chris@0
|
129 public function providerUcfirst() {
|
Chris@0
|
130 return [
|
Chris@0
|
131 ['tHe QUIcK bRoWn', 'THe QUIcK bRoWn'],
|
Chris@0
|
132 ['françAIS', 'FrançAIS'],
|
Chris@0
|
133 ['über', 'Über'],
|
Chris@0
|
134 ['åwesome', 'Åwesome'],
|
Chris@0
|
135 // A multibyte string.
|
Chris@0
|
136 ['σion', 'Σion'],
|
Chris@0
|
137 ];
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 /**
|
Chris@0
|
141 * Tests multibyte lcfirst.
|
Chris@0
|
142 *
|
Chris@0
|
143 * @dataProvider providerLcfirst
|
Chris@0
|
144 * @covers ::lcfirst
|
Chris@0
|
145 */
|
Chris@17
|
146 public function testLcfirst($text, $expected) {
|
Chris@0
|
147 $this->assertEquals($expected, Unicode::lcfirst($text));
|
Chris@0
|
148 }
|
Chris@0
|
149
|
Chris@0
|
150 /**
|
Chris@0
|
151 * Data provider for testLcfirst().
|
Chris@0
|
152 *
|
Chris@0
|
153 * @see testLcfirst()
|
Chris@0
|
154 *
|
Chris@0
|
155 * @return array
|
Chris@17
|
156 * An array containing a string and its lowercase version.
|
Chris@0
|
157 */
|
Chris@0
|
158 public function providerLcfirst() {
|
Chris@0
|
159 return [
|
Chris@0
|
160 ['tHe QUIcK bRoWn', 'tHe QUIcK bRoWn'],
|
Chris@0
|
161 ['FrançAIS is ÜBER-åwesome', 'françAIS is ÜBER-åwesome'],
|
Chris@0
|
162 ['Über', 'über'],
|
Chris@0
|
163 ['Åwesome', 'åwesome'],
|
Chris@0
|
164 // Add a multibyte string.
|
Chris@17
|
165 ['ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ', 'αΒΓΔΕΖΗΘΙΚΛΜΝΞΟΣὨ'],
|
Chris@0
|
166 ];
|
Chris@0
|
167 }
|
Chris@0
|
168
|
Chris@0
|
169 /**
|
Chris@0
|
170 * Tests multibyte ucwords.
|
Chris@0
|
171 *
|
Chris@0
|
172 * @dataProvider providerUcwords
|
Chris@0
|
173 * @covers ::ucwords
|
Chris@0
|
174 */
|
Chris@17
|
175 public function testUcwords($text, $expected) {
|
Chris@0
|
176 $this->assertEquals($expected, Unicode::ucwords($text));
|
Chris@0
|
177 }
|
Chris@0
|
178
|
Chris@0
|
179 /**
|
Chris@0
|
180 * Data provider for testUcwords().
|
Chris@0
|
181 *
|
Chris@0
|
182 * @see testUcwords()
|
Chris@0
|
183 *
|
Chris@0
|
184 * @return array
|
Chris@17
|
185 * An array containing a string and its capitalized version.
|
Chris@0
|
186 */
|
Chris@0
|
187 public function providerUcwords() {
|
Chris@0
|
188 return [
|
Chris@0
|
189 ['tHe QUIcK bRoWn', 'THe QUIcK BRoWn'],
|
Chris@0
|
190 ['françAIS', 'FrançAIS'],
|
Chris@0
|
191 ['über', 'Über'],
|
Chris@0
|
192 ['åwesome', 'Åwesome'],
|
Chris@0
|
193 // Make sure we don't mangle extra spaces.
|
Chris@0
|
194 ['frànçAIS is über-åwesome', 'FrànçAIS Is Über-Åwesome'],
|
Chris@0
|
195 // Add a multibyte string.
|
Chris@17
|
196 ['σion', 'Σion'],
|
Chris@0
|
197 ];
|
Chris@0
|
198 }
|
Chris@0
|
199
|
Chris@0
|
200 /**
|
Chris@0
|
201 * Tests multibyte strlen.
|
Chris@0
|
202 *
|
Chris@0
|
203 * @dataProvider providerStrlen
|
Chris@0
|
204 * @covers ::strlen
|
Chris@17
|
205 * @group legacy
|
Chris@17
|
206 * @expectedDeprecation \Drupal\Component\Utility\Unicode::strlen() is deprecated in Drupal 8.6.0 and will be removed before Drupal 9.0.0. Use mb_strlen() instead. See https://www.drupal.org/node/2850048.
|
Chris@0
|
207 */
|
Chris@0
|
208 public function testStrlen($text, $expected) {
|
Chris@0
|
209 $this->assertEquals($expected, Unicode::strlen($text));
|
Chris@0
|
210 }
|
Chris@0
|
211
|
Chris@0
|
212 /**
|
Chris@0
|
213 * Data provider for testStrlen().
|
Chris@0
|
214 *
|
Chris@0
|
215 * @see testStrlen()
|
Chris@0
|
216 *
|
Chris@0
|
217 * @return array
|
Chris@0
|
218 * An array containing a string and its length.
|
Chris@0
|
219 */
|
Chris@0
|
220 public function providerStrlen() {
|
Chris@0
|
221 return [
|
Chris@0
|
222 ['tHe QUIcK bRoWn', 15],
|
Chris@0
|
223 ['ÜBER-åwesome', 12],
|
Chris@0
|
224 ['以呂波耳・ほへとち。リヌルヲ。', 15],
|
Chris@0
|
225 ];
|
Chris@0
|
226 }
|
Chris@0
|
227
|
Chris@0
|
228 /**
|
Chris@0
|
229 * Tests multibyte substr.
|
Chris@0
|
230 *
|
Chris@0
|
231 * @dataProvider providerSubstr
|
Chris@0
|
232 * @covers ::substr
|
Chris@17
|
233 * @group legacy
|
Chris@17
|
234 * @expectedDeprecation \Drupal\Component\Utility\Unicode::substr() is deprecated in Drupal 8.6.0 and will be removed before Drupal 9.0.0. Use mb_substr() instead. See https://www.drupal.org/node/2850048.
|
Chris@0
|
235 */
|
Chris@0
|
236 public function testSubstr($text, $start, $length, $expected) {
|
Chris@0
|
237 $this->assertEquals($expected, Unicode::substr($text, $start, $length));
|
Chris@0
|
238 }
|
Chris@0
|
239
|
Chris@0
|
240 /**
|
Chris@0
|
241 * Data provider for testSubstr().
|
Chris@0
|
242 *
|
Chris@0
|
243 * @see testSubstr()
|
Chris@0
|
244 *
|
Chris@0
|
245 * @return array
|
Chris@0
|
246 * An array containing:
|
Chris@0
|
247 * - The string to test.
|
Chris@0
|
248 * - The start number to be processed by substr.
|
Chris@0
|
249 * - The length number to be processed by substr.
|
Chris@0
|
250 * - The expected string result.
|
Chris@0
|
251 */
|
Chris@0
|
252 public function providerSubstr() {
|
Chris@0
|
253 return [
|
Chris@0
|
254 ['frànçAIS is über-åwesome', 0, NULL, 'frànçAIS is über-åwesome'],
|
Chris@0
|
255 ['frànçAIS is über-åwesome', 0, 0, ''],
|
Chris@0
|
256 ['frànçAIS is über-åwesome', 0, 1, 'f'],
|
Chris@0
|
257 ['frànçAIS is über-åwesome', 0, 8, 'frànçAIS'],
|
Chris@0
|
258 ['frànçAIS is über-åwesome', 0, 23, 'frànçAIS is über-åwesom'],
|
Chris@0
|
259 ['frànçAIS is über-åwesome', 0, 24, 'frànçAIS is über-åwesome'],
|
Chris@0
|
260 ['frànçAIS is über-åwesome', 0, 25, 'frànçAIS is über-åwesome'],
|
Chris@0
|
261 ['frànçAIS is über-åwesome', 0, 100, 'frànçAIS is über-åwesome'],
|
Chris@0
|
262 ['frànçAIS is über-åwesome', 4, 4, 'çAIS'],
|
Chris@0
|
263 ['frànçAIS is über-åwesome', 1, 0, ''],
|
Chris@0
|
264 ['frànçAIS is über-åwesome', 100, 0, ''],
|
Chris@0
|
265 ['frànçAIS is über-åwesome', -4, 2, 'so'],
|
Chris@0
|
266 ['frànçAIS is über-åwesome', -4, 3, 'som'],
|
Chris@0
|
267 ['frànçAIS is über-åwesome', -4, 4, 'some'],
|
Chris@0
|
268 ['frànçAIS is über-åwesome', -4, 5, 'some'],
|
Chris@0
|
269 ['frànçAIS is über-åwesome', -7, 10, 'åwesome'],
|
Chris@0
|
270 ['frànçAIS is über-åwesome', 5, -10, 'AIS is üb'],
|
Chris@0
|
271 ['frànçAIS is über-åwesome', 0, -10, 'frànçAIS is üb'],
|
Chris@0
|
272 ['frànçAIS is über-åwesome', 0, -1, 'frànçAIS is über-åwesom'],
|
Chris@0
|
273 ['frànçAIS is über-åwesome', -7, -2, 'åweso'],
|
Chris@0
|
274 ['frànçAIS is über-åwesome', -7, -6, 'å'],
|
Chris@0
|
275 ['frànçAIS is über-åwesome', -7, -7, ''],
|
Chris@0
|
276 ['frànçAIS is über-åwesome', -7, -8, ''],
|
Chris@0
|
277 ['...', 0, 2, '..'],
|
Chris@0
|
278 ['以呂波耳・ほへとち。リヌルヲ。', 1, 3, '呂波耳'],
|
Chris@0
|
279 ];
|
Chris@0
|
280 }
|
Chris@0
|
281
|
Chris@0
|
282 /**
|
Chris@0
|
283 * Tests multibyte truncate.
|
Chris@0
|
284 *
|
Chris@0
|
285 * @dataProvider providerTruncate
|
Chris@0
|
286 * @covers ::truncate
|
Chris@0
|
287 */
|
Chris@0
|
288 public function testTruncate($text, $max_length, $expected, $wordsafe = FALSE, $add_ellipsis = FALSE) {
|
Chris@0
|
289 $this->assertEquals($expected, Unicode::truncate($text, $max_length, $wordsafe, $add_ellipsis));
|
Chris@0
|
290 }
|
Chris@0
|
291
|
Chris@0
|
292 /**
|
Chris@0
|
293 * Data provider for testTruncate().
|
Chris@0
|
294 *
|
Chris@0
|
295 * @see testTruncate()
|
Chris@0
|
296 *
|
Chris@0
|
297 * @return array
|
Chris@0
|
298 * An array containing:
|
Chris@0
|
299 * - The string to test.
|
Chris@0
|
300 * - The max length to truncate this string to.
|
Chris@0
|
301 * - The expected string result.
|
Chris@0
|
302 * - (optional) Boolean for the $wordsafe flag. Defaults to FALSE.
|
Chris@0
|
303 * - (optional) Boolean for the $add_ellipsis flag. Defaults to FALSE.
|
Chris@0
|
304 */
|
Chris@0
|
305 public function providerTruncate() {
|
Chris@14
|
306 $tests = [
|
Chris@0
|
307 ['frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome'],
|
Chris@0
|
308 ['frànçAIS is über-åwesome', 23, 'frànçAIS is über-åwesom'],
|
Chris@0
|
309 ['frànçAIS is über-åwesome', 17, 'frànçAIS is über-'],
|
Chris@0
|
310 ['以呂波耳・ほへとち。リヌルヲ。', 6, '以呂波耳・ほ'],
|
Chris@0
|
311 ['frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome', FALSE, TRUE],
|
Chris@0
|
312 ['frànçAIS is über-åwesome', 23, 'frànçAIS is über-åweso…', FALSE, TRUE],
|
Chris@0
|
313 ['frànçAIS is über-åwesome', 17, 'frànçAIS is über…', FALSE, TRUE],
|
Chris@0
|
314 ['123', 1, '…', TRUE, TRUE],
|
Chris@0
|
315 ['123', 2, '1…', TRUE, TRUE],
|
Chris@0
|
316 ['123', 3, '123', TRUE, TRUE],
|
Chris@0
|
317 ['1234', 3, '12…', TRUE, TRUE],
|
Chris@0
|
318 ['1234567890', 10, '1234567890', TRUE, TRUE],
|
Chris@0
|
319 ['12345678901', 10, '123456789…', TRUE, TRUE],
|
Chris@0
|
320 ['12345678901', 11, '12345678901', TRUE, TRUE],
|
Chris@0
|
321 ['123456789012', 11, '1234567890…', TRUE, TRUE],
|
Chris@0
|
322 ['12345 7890', 10, '12345 7890', TRUE, TRUE],
|
Chris@0
|
323 ['12345 7890', 9, '12345…', TRUE, TRUE],
|
Chris@0
|
324 ['123 567 90', 10, '123 567 90', TRUE, TRUE],
|
Chris@0
|
325 ['123 567 901', 10, '123 567…', TRUE, TRUE],
|
Chris@0
|
326 ['Stop. Hammertime.', 17, 'Stop. Hammertime.', TRUE, TRUE],
|
Chris@0
|
327 ['Stop. Hammertime.', 16, 'Stop…', TRUE, TRUE],
|
Chris@0
|
328 ['frànçAIS is über-åwesome', 24, 'frànçAIS is über-åwesome', TRUE, TRUE],
|
Chris@0
|
329 ['frànçAIS is über-åwesome', 23, 'frànçAIS is über…', TRUE, TRUE],
|
Chris@0
|
330 ['frànçAIS is über-åwesome', 17, 'frànçAIS is über…', TRUE, TRUE],
|
Chris@0
|
331 ['¿Dónde está el niño?', 20, '¿Dónde está el niño?', TRUE, TRUE],
|
Chris@0
|
332 ['¿Dónde está el niño?', 19, '¿Dónde está el…', TRUE, TRUE],
|
Chris@0
|
333 ['¿Dónde está el niño?', 13, '¿Dónde está…', TRUE, TRUE],
|
Chris@0
|
334 ['¿Dónde está el niño?', 10, '¿Dónde…', TRUE, TRUE],
|
Chris@0
|
335 ['Help! Help! Help!', 17, 'Help! Help! Help!', TRUE, TRUE],
|
Chris@0
|
336 ['Help! Help! Help!', 16, 'Help! Help!…', TRUE, TRUE],
|
Chris@0
|
337 ['Help! Help! Help!', 15, 'Help! Help!…', TRUE, TRUE],
|
Chris@0
|
338 ['Help! Help! Help!', 14, 'Help! Help!…', TRUE, TRUE],
|
Chris@0
|
339 ['Help! Help! Help!', 13, 'Help! Help!…', TRUE, TRUE],
|
Chris@0
|
340 ['Help! Help! Help!', 12, 'Help! Help!…', TRUE, TRUE],
|
Chris@0
|
341 ['Help! Help! Help!', 11, 'Help! Help…', TRUE, TRUE],
|
Chris@0
|
342 ['Help! Help! Help!', 10, 'Help!…', TRUE, TRUE],
|
Chris@0
|
343 ['Help! Help! Help!', 9, 'Help!…', TRUE, TRUE],
|
Chris@0
|
344 ['Help! Help! Help!', 8, 'Help!…', TRUE, TRUE],
|
Chris@0
|
345 ['Help! Help! Help!', 7, 'Help!…', TRUE, TRUE],
|
Chris@0
|
346 ['Help! Help! Help!', 6, 'Help!…', TRUE, TRUE],
|
Chris@0
|
347 ['Help! Help! Help!', 5, 'Help…', TRUE, TRUE],
|
Chris@0
|
348 ['Help! Help! Help!', 4, 'Hel…', TRUE, TRUE],
|
Chris@0
|
349 ['Help! Help! Help!', 3, 'He…', TRUE, TRUE],
|
Chris@0
|
350 ['Help! Help! Help!', 2, 'H…', TRUE, TRUE],
|
Chris@0
|
351 ];
|
Chris@14
|
352
|
Chris@14
|
353 // Test truncate on text with multiple lines.
|
Chris@14
|
354 $multi_line = <<<EOF
|
Chris@14
|
355 This is a text that spans multiple lines.
|
Chris@14
|
356 Line 2 goes here.
|
Chris@14
|
357 EOF;
|
Chris@14
|
358 $multi_line_wordsafe = <<<EOF
|
Chris@14
|
359 This is a text that spans multiple lines.
|
Chris@14
|
360 Line 2
|
Chris@14
|
361 EOF;
|
Chris@14
|
362 $multi_line_non_wordsafe = <<<EOF
|
Chris@14
|
363 This is a text that spans multiple lines.
|
Chris@14
|
364 Line 2 go
|
Chris@14
|
365 EOF;
|
Chris@14
|
366 $tests[] = [$multi_line, 51, $multi_line_wordsafe, TRUE];
|
Chris@14
|
367 $tests[] = [$multi_line, 51, $multi_line_non_wordsafe, FALSE];
|
Chris@14
|
368
|
Chris@14
|
369 return $tests;
|
Chris@0
|
370 }
|
Chris@0
|
371
|
Chris@0
|
372 /**
|
Chris@0
|
373 * Tests multibyte truncate bytes.
|
Chris@0
|
374 *
|
Chris@0
|
375 * @dataProvider providerTestTruncateBytes
|
Chris@0
|
376 * @covers ::truncateBytes
|
Chris@0
|
377 *
|
Chris@0
|
378 * @param string $text
|
Chris@0
|
379 * The string to truncate.
|
Chris@0
|
380 * @param int $max_length
|
Chris@0
|
381 * The upper limit on the returned string length.
|
Chris@0
|
382 * @param string $expected
|
Chris@0
|
383 * The expected return from Unicode::truncateBytes().
|
Chris@0
|
384 */
|
Chris@0
|
385 public function testTruncateBytes($text, $max_length, $expected) {
|
Chris@0
|
386 $this->assertEquals($expected, Unicode::truncateBytes($text, $max_length), 'The string was not correctly truncated.');
|
Chris@0
|
387 }
|
Chris@0
|
388
|
Chris@0
|
389 /**
|
Chris@0
|
390 * Provides data for self::testTruncateBytes().
|
Chris@0
|
391 *
|
Chris@0
|
392 * @return array
|
Chris@0
|
393 * An array of arrays, each containing the parameters to
|
Chris@0
|
394 * self::testTruncateBytes().
|
Chris@0
|
395 */
|
Chris@0
|
396 public function providerTestTruncateBytes() {
|
Chris@0
|
397 return [
|
Chris@0
|
398 // String shorter than max length.
|
Chris@0
|
399 ['Short string', 42, 'Short string'],
|
Chris@0
|
400 // Simple string longer than max length.
|
Chris@0
|
401 ['Longer string than previous.', 10, 'Longer str'],
|
Chris@0
|
402 // Unicode.
|
Chris@0
|
403 ['以呂波耳・ほへとち。リヌルヲ。', 10, '以呂波'],
|
Chris@0
|
404 ];
|
Chris@0
|
405 }
|
Chris@0
|
406
|
Chris@0
|
407 /**
|
Chris@0
|
408 * Tests UTF-8 validation.
|
Chris@0
|
409 *
|
Chris@0
|
410 * @dataProvider providerTestValidateUtf8
|
Chris@0
|
411 * @covers ::validateUtf8
|
Chris@0
|
412 *
|
Chris@0
|
413 * @param string $text
|
Chris@0
|
414 * The text to validate.
|
Chris@0
|
415 * @param bool $expected
|
Chris@0
|
416 * The expected return value from Unicode::validateUtf8().
|
Chris@0
|
417 * @param string $message
|
Chris@0
|
418 * The message to display on failure.
|
Chris@0
|
419 */
|
Chris@0
|
420 public function testValidateUtf8($text, $expected, $message) {
|
Chris@0
|
421 $this->assertEquals($expected, Unicode::validateUtf8($text), $message);
|
Chris@0
|
422 }
|
Chris@0
|
423
|
Chris@0
|
424 /**
|
Chris@0
|
425 * Provides data for self::testValidateUtf8().
|
Chris@0
|
426 *
|
Chris@0
|
427 * Invalid UTF-8 examples sourced from http://stackoverflow.com/a/11709412/109119.
|
Chris@0
|
428 *
|
Chris@0
|
429 * @return array
|
Chris@0
|
430 * An array of arrays, each containing the parameters for
|
Chris@0
|
431 * self::testValidateUtf8().
|
Chris@0
|
432 */
|
Chris@0
|
433 public function providerTestValidateUtf8() {
|
Chris@0
|
434 return [
|
Chris@0
|
435 // Empty string.
|
Chris@0
|
436 ['', TRUE, 'An empty string did not validate.'],
|
Chris@0
|
437 // Simple text string.
|
Chris@0
|
438 ['Simple text.', TRUE, 'A simple ASCII text string did not validate.'],
|
Chris@0
|
439 // Invalid UTF-8, overlong 5 byte encoding.
|
Chris@0
|
440 [chr(0xF8) . chr(0x80) . chr(0x80) . chr(0x80) . chr(0x80), FALSE, 'Invalid UTF-8 was validated.'],
|
Chris@0
|
441 // High code-point without trailing characters.
|
Chris@0
|
442 [chr(0xD0) . chr(0x01), FALSE, 'Invalid UTF-8 was validated.'],
|
Chris@0
|
443 ];
|
Chris@0
|
444 }
|
Chris@0
|
445
|
Chris@0
|
446 /**
|
Chris@0
|
447 * Tests UTF-8 conversion.
|
Chris@0
|
448 *
|
Chris@0
|
449 * @dataProvider providerTestConvertToUtf8
|
Chris@0
|
450 * @covers ::convertToUtf8
|
Chris@0
|
451 *
|
Chris@0
|
452 * @param string $data
|
Chris@0
|
453 * The data to be converted.
|
Chris@0
|
454 * @param string $encoding
|
Chris@0
|
455 * The encoding the data is in.
|
Chris@0
|
456 * @param string|bool $expected
|
Chris@0
|
457 * The expected result.
|
Chris@0
|
458 */
|
Chris@0
|
459 public function testConvertToUtf8($data, $encoding, $expected) {
|
Chris@0
|
460 $this->assertEquals($expected, Unicode::convertToUtf8($data, $encoding));
|
Chris@0
|
461 }
|
Chris@0
|
462
|
Chris@0
|
463 /**
|
Chris@0
|
464 * Provides data to self::testConvertToUtf8().
|
Chris@0
|
465 *
|
Chris@0
|
466 * @return array
|
Chris@0
|
467 * An array of arrays, each containing the parameters to
|
Chris@0
|
468 * self::testConvertUtf8(). }
|
Chris@0
|
469 */
|
Chris@0
|
470 public function providerTestConvertToUtf8() {
|
Chris@0
|
471 return [
|
Chris@0
|
472 [chr(0x97), 'Windows-1252', '—'],
|
Chris@0
|
473 [chr(0x99), 'Windows-1252', '™'],
|
Chris@0
|
474 [chr(0x80), 'Windows-1252', '€'],
|
Chris@0
|
475 ];
|
Chris@0
|
476 }
|
Chris@0
|
477
|
Chris@0
|
478 /**
|
Chris@0
|
479 * Tests multibyte strpos.
|
Chris@0
|
480 *
|
Chris@0
|
481 * @dataProvider providerStrpos
|
Chris@0
|
482 * @covers ::strpos
|
Chris@17
|
483 * @group legacy
|
Chris@17
|
484 * @expectedDeprecation \Drupal\Component\Utility\Unicode::strpos() is deprecated in Drupal 8.6.0 and will be removed before Drupal 9.0.0. Use mb_strpos() instead. See https://www.drupal.org/node/2850048.
|
Chris@0
|
485 */
|
Chris@0
|
486 public function testStrpos($haystack, $needle, $offset, $expected) {
|
Chris@0
|
487 $this->assertEquals($expected, Unicode::strpos($haystack, $needle, $offset));
|
Chris@0
|
488 }
|
Chris@0
|
489
|
Chris@0
|
490 /**
|
Chris@0
|
491 * Data provider for testStrpos().
|
Chris@0
|
492 *
|
Chris@0
|
493 * @see testStrpos()
|
Chris@0
|
494 *
|
Chris@0
|
495 * @return array
|
Chris@0
|
496 * An array containing:
|
Chris@0
|
497 * - The haystack string to be searched in.
|
Chris@0
|
498 * - The needle string to search for.
|
Chris@0
|
499 * - The offset integer to start at.
|
Chris@0
|
500 * - The expected integer/FALSE result.
|
Chris@0
|
501 */
|
Chris@0
|
502 public function providerStrpos() {
|
Chris@0
|
503 return [
|
Chris@0
|
504 ['frànçAIS is über-åwesome', 'frànçAIS is über-åwesome', 0, 0],
|
Chris@0
|
505 ['frànçAIS is über-åwesome', 'rànçAIS is über-åwesome', 0, 1],
|
Chris@0
|
506 ['frànçAIS is über-åwesome', 'not in string', 0, FALSE],
|
Chris@0
|
507 ['frànçAIS is über-åwesome', 'r', 0, 1],
|
Chris@0
|
508 ['frànçAIS is über-åwesome', 'nçAIS', 0, 3],
|
Chris@0
|
509 ['frànçAIS is über-åwesome', 'nçAIS', 2, 3],
|
Chris@0
|
510 ['frànçAIS is über-åwesome', 'nçAIS', 3, 3],
|
Chris@0
|
511 ['以呂波耳・ほへとち。リヌルヲ。', '波耳', 0, 2],
|
Chris@0
|
512 ['以呂波耳・ほへとち。リヌルヲ。', '波耳', 1, 2],
|
Chris@0
|
513 ['以呂波耳・ほへとち。リヌルヲ。', '波耳', 2, 2],
|
Chris@0
|
514 ];
|
Chris@0
|
515 }
|
Chris@0
|
516
|
Chris@0
|
517 }
|