3 class LanguageTest
extends LanguageClassesTestCase
{
5 function testLanguageConvertDoubleWidthToSingleWidth() {
7 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
8 $this->getLang()->normalizeForSearch(
9 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
11 'convertDoubleWidth() with the full alphabet and digits'
16 * @dataProvider provideFormattableTimes
18 function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
19 $this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
22 public static function provideFormattableTimes() {
28 'formatTimePeriod() rounding (<10s)'
32 array( 'noabbrevs' => true ),
34 'formatTimePeriod() rounding (<10s)'
40 'formatTimePeriod() rounding (<10s)'
44 array( 'noabbrevs' => true ),
46 'formatTimePeriod() rounding (<10s)'
52 'formatTimePeriod() rounding (<60s)'
56 array( 'noabbrevs' => true ),
58 'formatTimePeriod() rounding (<60s)'
64 'formatTimePeriod() rounding (<1h)'
68 array( 'noabbrevs' => true ),
69 '2 minutes 0 seconds',
70 'formatTimePeriod() rounding (<1h)'
76 'formatTimePeriod() rounding (<1h)'
80 array( 'noabbrevs' => true ),
81 '1 hour 0 minutes 0 seconds',
82 'formatTimePeriod() rounding (<1h)'
88 'formatTimePeriod() rounding (>=1h)'
92 array( 'noabbrevs' => true ),
93 '2 hours 0 minutes 0 seconds',
94 'formatTimePeriod() rounding (>=1h)'
100 'formatTimePeriod() rounding (>=1h), avoidseconds'
104 array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
106 'formatTimePeriod() rounding (>=1h), avoidseconds'
112 'formatTimePeriod() rounding (>=1h), avoidminutes'
116 array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
118 'formatTimePeriod() rounding (>=1h), avoidminutes'
124 'formatTimePeriod() rounding (=48h), avoidseconds'
128 array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
129 '48 hours 0 minutes',
130 'formatTimePeriod() rounding (=48h), avoidseconds'
136 'formatTimePeriod() rounding (>48h), avoidminutes'
140 array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
142 'formatTimePeriod() rounding (>48h), avoidminutes'
148 'formatTimePeriod() rounding (>48h), avoidseconds'
152 array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
153 '2 days 1 hour 0 minutes',
154 'formatTimePeriod() rounding (>48h), avoidseconds'
160 'formatTimePeriod() rounding (>48h), avoidminutes'
164 array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
166 'formatTimePeriod() rounding (>48h), avoidminutes'
172 'formatTimePeriod() rounding (>48h), avoidseconds'
176 array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
177 '3 days 0 hours 0 minutes',
178 'formatTimePeriod() rounding (>48h), avoidseconds'
184 'formatTimePeriod() rounding, (>48h), avoidseconds'
188 array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
189 '2 days 0 hours 0 minutes',
190 'formatTimePeriod() rounding, (>48h), avoidseconds'
196 'formatTimePeriod() rounding, recursion, (>48h)'
200 array( 'noabbrevs' => true ),
201 '2 days 1 hour 1 minute 1 second',
202 'formatTimePeriod() rounding, recursion, (>48h)'
208 function testTruncate() {
211 $this->getLang()->truncate( "1234567890", 0, 'XXX' ),
212 'truncate prefix, len 0, small ellipsis'
217 $this->getLang()->truncate( "1234567890", 8, 'XXX' ),
218 'truncate prefix, small ellipsis'
223 $this->getLang()->truncate( "123456789", 5, 'XXXXXXXXXXXXXXX' ),
224 'truncate prefix, large ellipsis'
229 $this->getLang()->truncate( "1234567890", -8, 'XXX' ),
230 'truncate suffix, small ellipsis'
235 $this->getLang()->truncate( "123456789", -5, 'XXXXXXXXXXXXXXX' ),
236 'truncate suffix, large ellipsis'
241 * @dataProvider provideHTMLTruncateData()
243 function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
247 $this->getLang()->truncateHTML( $input, $len, $ellipsis )
252 * Array format is ($len, $ellipsis, $input, $expected)
254 public static function provideHTMLTruncateData() {
256 array( 0, 'XXX', "1234567890", "XXX" ),
257 array( 8, 'XXX', "1234567890", "12345XXX" ),
258 array( 5, 'XXXXXXXXXXXXXXX', '1234567890', "1234567890" ),
260 '<p><span style="font-weight:bold;"></span></p>',
261 '<p><span style="font-weight:bold;"></span></p>',
264 '<p><span style="font-weight:bold;">123456789</span></p>',
265 '<p><span style="font-weight:bold;">***</span></p>',
268 '<p><span style="font-weight:bold;"> 23456789</span></p>',
269 '<p><span style="font-weight:bold;">***</span></p>',
272 '<p><span style="font-weight:bold;">123456789</span></p>',
273 '<p><span style="font-weight:bold;">***</span></p>',
276 '<p><span style="font-weight:bold;">123456789</span></p>',
277 '<p><span style="font-weight:bold;">1***</span></p>',
280 '<tt><span style="font-weight:bold;">123456789</span></tt>',
281 '<tt><span style="font-weight:bold;">12***</span></tt>',
284 '<p><a href="www.mediawiki.org">123456789</a></p>',
285 '<p><a href="www.mediawiki.org">123***</a></p>',
288 '<p><a href="www.mediawiki.org">12 456789</a></p>',
289 '<p><a href="www.mediawiki.org">12 ***</a></p>',
292 '<small><span style="font-weight:bold;">123<p id="#moo">456</p>789</span></small>',
293 '<small><span style="font-weight:bold;">123<p id="#moo">4***</p></span></small>',
296 '<div><span style="font-weight:bold;">123<span>4</span>56789</span></div>',
297 '<div><span style="font-weight:bold;">123<span>4</span>5***</span></div>',
300 '<p><table style="font-weight:bold;"><tr><td>123456789</td></tr></table></p>',
301 '<p><table style="font-weight:bold;"><tr><td>123456789</td></tr></table></p>',
304 '<p><font style="font-weight:bold;">123456789</font></p>',
305 '<p><font style="font-weight:bold;">123456789</font></p>',
311 * Test Language::isWellFormedLanguageTag()
312 * @dataProvider provideWellFormedLanguageTags
314 function testWellFormedLanguageTag( $code, $message = '' ) {
316 Language
::isWellFormedLanguageTag( $code ),
317 "validating code $code $message"
322 * The test cases are based on the tests in the GaBuZoMeu parser
323 * written by Stéphane Bortzmeyer <bortzmeyer@nic.fr>
324 * and distributed as free software, under the GNU General Public Licence.
325 * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
327 public static function provideWellFormedLanguageTags() {
329 array( 'fr', 'two-letter code' ),
330 array( 'fr-latn', 'two-letter code with lower case script code' ),
331 array( 'fr-Latn-FR', 'two-letter code with title case script code and uppercase country code' ),
332 array( 'fr-Latn-419', 'two-letter code with title case script code and region number' ),
333 array( 'fr-FR', 'two-letter code with uppercase' ),
334 array( 'ax-TZ', 'Not in the registry, but well-formed' ),
335 array( 'fr-shadok', 'two-letter code with variant' ),
336 array( 'fr-y-myext-myext2', 'non-x singleton' ),
337 array( 'fra-Latn', 'ISO 639 can be 3-letters' ),
338 array( 'fra', 'three-letter language code' ),
339 array( 'fra-FX', 'three-letter language code with country code' ),
340 array( 'i-klingon', 'grandfathered with singleton' ),
341 array( 'I-kLINgon', 'tags are case-insensitive...' ),
342 array( 'no-bok', 'grandfathered without singleton' ),
343 array( 'i-enochian', 'Grandfathered' ),
344 array( 'x-fr-CH', 'private use' ),
345 array( 'es-419', 'two-letter code with region number' ),
346 array( 'en-Latn-GB-boont-r-extended-sequence-x-private', 'weird, but well-formed' ),
347 array( 'ab-x-abc-x-abc', 'anything goes after x' ),
348 array( 'ab-x-abc-a-a', 'anything goes after x, including several non-x singletons' ),
349 array( 'i-default', 'grandfathered' ),
350 array( 'abcd-Latn', 'Language of 4 chars reserved for future use' ),
351 array( 'AaBbCcDd-x-y-any-x', 'Language of 5-8 chars, registered' ),
352 array( 'de-CH-1901', 'with country and year' ),
353 array( 'en-US-x-twain', 'with country and singleton' ),
354 array( 'zh-cmn', 'three-letter variant' ),
355 array( 'zh-cmn-Hant', 'three-letter variant and script' ),
356 array( 'zh-cmn-Hant-HK', 'three-letter variant, script and country' ),
357 array( 'xr-p-lze', 'Extension' ),
362 * Negative test for Language::isWellFormedLanguageTag()
363 * @dataProvider provideMalformedLanguageTags
365 function testMalformedLanguageTag( $code, $message = '' ) {
367 Language
::isWellFormedLanguageTag( $code ),
368 "validating that code $code is a malformed language tag - $message"
373 * The test cases are based on the tests in the GaBuZoMeu parser
374 * written by Stéphane Bortzmeyer <bortzmeyer@nic.fr>
375 * and distributed as free software, under the GNU General Public Licence.
376 * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
378 public static function provideMalformedLanguageTags() {
380 array( 'f', 'language too short' ),
381 array( 'f-Latn', 'language too short with script' ),
382 array( 'xr-lxs-qut', 'variants too short' ), # extlangS
383 array( 'fr-Latn-F', 'region too short' ),
384 array( 'a-value', 'language too short with region' ),
385 array( 'tlh-a-b-foo', 'valid three-letter with wrong variant' ),
386 array( 'i-notexist', 'grandfathered but not registered: invalid, even if we only test well-formedness' ),
387 array( 'abcdefghi-012345678', 'numbers too long' ),
388 array( 'ab-abc-abc-abc-abc', 'invalid extensions' ),
389 array( 'ab-abcd-abc', 'invalid extensions' ),
390 array( 'ab-ab-abc', 'invalid extensions' ),
391 array( 'ab-123-abc', 'invalid extensions' ),
392 array( 'a-Hant-ZH', 'short language with valid extensions' ),
393 array( 'a1-Hant-ZH', 'invalid character in language' ),
394 array( 'ab-abcde-abc', 'invalid extensions' ),
395 array( 'ab-1abc-abc', 'invalid characters in extensions' ),
396 array( 'ab-ab-abcd', 'invalid order of extensions' ),
397 array( 'ab-123-abcd', 'invalid order of extensions' ),
398 array( 'ab-abcde-abcd', 'invalid extensions' ),
399 array( 'ab-1abc-abcd', 'invalid characters in extensions' ),
400 array( 'ab-a-b', 'extensions too short' ),
401 array( 'ab-a-x', 'extensions too short, even with singleton' ),
402 array( 'ab--ab', 'two separators' ),
403 array( 'ab-abc-', 'separator in the end' ),
404 array( '-ab-abc', 'separator in the beginning' ),
405 array( 'abcd-efg', 'language too long' ),
406 array( 'aabbccddE', 'tag too long' ),
407 array( 'pa_guru', 'A tag with underscore is invalid in strict mode' ),
408 array( 'de-f', 'subtag too short' ),
413 * Negative test for Language::isWellFormedLanguageTag()
415 function testLenientLanguageTag() {
417 Language
::isWellFormedLanguageTag( 'pa_guru', true ),
418 'pa_guru is a well-formed language tag in lenient mode'
423 * Test Language::isValidBuiltInCode()
424 * @dataProvider provideLanguageCodes
426 function testBuiltInCodeValidation( $code, $message = '' ) {
428 (bool)Language
::isValidBuiltInCode( $code ),
429 "validating code $code $message"
433 function testBuiltInCodeValidationRejectUnderscore() {
435 (bool)Language
::isValidBuiltInCode( 'be_tarask' ),
436 "reject underscore in language code"
440 public static function provideLanguageCodes() {
442 array( 'fr', 'Two letters, minor case' ),
443 array( 'EN', 'Two letters, upper case' ),
444 array( 'tyv', 'Three letters' ),
445 array( 'tokipona', 'long language code' ),
446 array( 'be-tarask', 'With dash' ),
447 array( 'Zh-classical', 'Begin with upper case, dash' ),
448 array( 'Be-x-old', 'With extension (two dashes)' ),
453 * Test Language::isKnownLanguageTag()
454 * @dataProvider provideKnownLanguageTags
456 function testKnownLanguageTag( $code, $message = '' ) {
458 (bool)Language
::isKnownLanguageTag( $code ),
459 "validating code $code - $message"
463 public static function provideKnownLanguageTags() {
465 array( 'fr', 'simple code' ),
466 array( 'bat-smg', 'an MW legacy tag' ),
467 array( 'sgs', 'an internal standard MW name, for which a legacy tag is used externally' ),
472 * Test Language::isKnownLanguageTag()
474 function testKnownCldrLanguageTag() {
475 if ( !class_exists( 'LanguageNames' ) ) {
476 $this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
480 (bool)Language
::isKnownLanguageTag( 'pal' ),
481 'validating code "pal" an ancient language, which probably will not appear in Names.php, but appears in CLDR in English'
486 * Negative tests for Language::isKnownLanguageTag()
487 * @dataProvider provideUnKnownLanguageTags
489 function testUnknownLanguageTag( $code, $message = '' ) {
491 (bool)Language
::isKnownLanguageTag( $code ),
492 "checking that code $code is invalid - $message"
496 public static function provideUnknownLanguageTags() {
498 array( 'mw', 'non-existent two-letter code' ),
503 * @dataProvider provideSprintfDateSamples
505 function testSprintfDate( $format, $ts, $expected, $msg ) {
508 $this->getLang()->sprintfDate( $format, $ts ),
509 "sprintfDate('$format', '$ts'): $msg"
514 * sprintfDate should always use UTC when no zone is given.
515 * @dataProvider provideSprintfDateSamples
517 function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
518 $oldTZ = date_default_timezone_get();
519 $res = date_default_timezone_set( 'Asia/Seoul' );
521 $this->markTestSkipped( "Error setting Timezone" );
526 $this->getLang()->sprintfDate( $format, $ts ),
527 "sprintfDate('$format', '$ts'): $msg"
530 date_default_timezone_set( $oldTZ );
534 * sprintfDate should use passed timezone
535 * @dataProvider provideSprintfDateSamples
537 function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
538 $tz = new DateTimeZone( 'Asia/Seoul' );
540 $this->markTestSkipped( "Error getting Timezone" );
545 $this->getLang()->sprintfDate( $format, $ts, $tz ),
546 "sprintfDate('$format', '$ts', 'Asia/Seoul'): $msg"
550 public static function provideSprintfDateSamples() {
555 '1390', // note because we're testing English locale we get Latin-standard digits
557 'Iranian calendar full year'
564 'Iranian calendar short year'
571 'ISO 8601 (week) year'
594 // What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
621 'Month index, not zero pad'
628 'Month index. Zero pad'
649 'Genitive month name (same in EN)'
656 'Day of month (not zero pad)'
663 'Day of month (zero-pad)'
670 'Day of year (zero-indexed)'
677 'Day of week (abbrev)'
691 'Day of week (Mon=1, Sun=7)'
698 'Day of week (Sun=0, Sat=6)'
740 '12 hour, zero padded'
789 'Days in current month'
794 '2012-01-02T09:07:05+00:00',
795 '2012-01-02T09:07:05+09:00',
801 'Mon, 02 Jan 2012 09:07:05 +0000',
802 'Mon, 02 Jan 2012 09:07:05 +0900',
810 'Timezone identifier'
831 'Timezone offset with colon'
838 'Timezone abbreviation'
845 'Timezone offset in seconds'
873 'Hebrew number of days in month'
880 'Hebrew genitive month name (No difference in EN)'
922 'Raw numerals (doesn\'t mean much in EN)'
925 '[[Y "(yea"\\r)]] \\"xx\\"',
927 '[[2012 (year)]] "x"',
928 '[[2012 (year)]] "x"',
936 * @dataProvider provideFormatSizes
938 function testFormatSize( $size, $expected, $msg ) {
941 $this->getLang()->formatSize( $size ),
942 "formatSize('$size'): $msg"
946 public static function provideFormatSizes() {
993 // How big!? THIS BIG!
998 * @dataProvider provideFormatBitrate
1000 function testFormatBitrate( $bps, $expected, $msg ) {
1001 $this->assertEquals(
1003 $this->getLang()->formatBitrate( $bps ),
1004 "formatBitrate('$bps'): $msg"
1008 public static function provideFormatBitrate() {
1018 "999 bits per second"
1023 "1 kilobit per second"
1028 "1 megabit per second"
1033 "1 gigabit per second"
1038 "1 terabit per second"
1043 "1 petabit per second"
1048 "1 exabit per second"
1053 "1 zetabit per second"
1058 "1 yottabit per second"
1063 "1,000 yottabits per second"
1070 * @dataProvider provideFormatDuration
1072 function testFormatDuration( $duration, $expected, $intervals = array() ) {
1073 $this->assertEquals(
1075 $this->getLang()->formatDuration( $duration, $intervals ),
1076 "formatDuration('$duration'): $expected"
1080 public static function provideFormatDuration() {
1119 // ( 365 + ( 24 * 3 + 25 ) / 400 ) * 86400 = 31556952
1120 ( 365 +
( 24 * 3 +
25 ) / 400.0 ) * 86400,
1153 '2 hours, 30 minutes and 1 second'
1157 '1 hour and 1 second'
1160 31556952 +
2 * 86400 +
9000,
1161 '1 year, 2 days, 2 hours and 30 minutes'
1164 42 * 1000 * 31556952 +
42,
1165 '42 millennia and 42 seconds'
1183 31556952 +
2 * 86400 +
9000,
1184 '1 year, 2 days and 150 minutes',
1185 array( 'years', 'days', 'minutes' ),
1190 array( 'years', 'days' ),
1193 31556952 +
2 * 86400 +
9000,
1194 '1 year, 2 days and 150 minutes',
1195 array( 'minutes', 'days', 'years' ),
1200 array( 'days', 'years' ),
1206 * @dataProvider provideCheckTitleEncodingData
1208 function testCheckTitleEncoding( $s ) {
1209 $this->assertEquals(
1211 $this->getLang()->checkTitleEncoding( $s ),
1212 "checkTitleEncoding('$s')"
1216 public static function provideCheckTitleEncodingData() {
1219 array( "United States of America" ), // 7bit ASCII
1220 array( rawurldecode( "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e" ) ),
1223 "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn"
1226 // The following two data sets come from bug 36839. They fail if checkTitleEncoding uses a regexp to test for
1227 // valid UTF-8 encoding and the pcre.recursion_limit is low (like, say, 1024). They succeed if checkTitleEncoding
1228 // uses mb_check_encoding for its test.
1231 "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
1232 . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
1233 . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
1234 . "Les%20Experts%20(s%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e)%7CLes%20Experts%20:%20Manhattan%7C"
1235 . "Les%20Experts%20:%20Miami%7CListe%20des%20personnages%20des%20Experts%7C"
1236 . "Liste%20des%20%C3%A9pisodes%20des%20Experts%7CMod%C3%A8le%20discussion:Palette%20Les%20Experts%7C"
1237 . "Nick%20Stokes%7CPersonnage%20de%20fiction%7CPersonnage%20fictif%7CPersonnage%20de%20fiction%7C"
1238 . "Personnages%20r%C3%A9currents%20dans%20Les%20Experts%7CRaymond%20Langston%7CRiley%20Adams%7C"
1239 . "Saison%201%20des%20Experts%7CSaison%2010%20des%20Experts%7CSaison%2011%20des%20Experts%7C"
1240 . "Saison%2012%20des%20Experts%7CSaison%202%20des%20Experts%7CSaison%203%20des%20Experts%7C"
1241 . "Saison%204%20des%20Experts%7CSaison%205%20des%20Experts%7CSaison%206%20des%20Experts%7C"
1242 . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
1243 . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
1244 . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
1249 "Mod%C3%A8le%3AArrondissements%20homonymes%7CMod%C3%A8le%3ABandeau%20standard%20pour%20page%20d'homonymie%7C"
1250 . "Mod%C3%A8le%3ABatailles%20homonymes%7CMod%C3%A8le%3ACantons%20homonymes%7C"
1251 . "Mod%C3%A8le%3ACommunes%20fran%C3%A7aises%20homonymes%7CMod%C3%A8le%3AFilms%20homonymes%7C"
1252 . "Mod%C3%A8le%3AGouvernements%20homonymes%7CMod%C3%A8le%3AGuerres%20homonymes%7CMod%C3%A8le%3AHomonymie%7C"
1253 . "Mod%C3%A8le%3AHomonymie%20bateau%7CMod%C3%A8le%3AHomonymie%20d'%C3%A9tablissements%20scolaires%20ou"
1254 . "%20universitaires%7CMod%C3%A8le%3AHomonymie%20d'%C3%AEles%7CMod%C3%A8le%3AHomonymie%20de%20clubs%20sportifs%7C"
1255 . "Mod%C3%A8le%3AHomonymie%20de%20comt%C3%A9s%7CMod%C3%A8le%3AHomonymie%20de%20monument%7C"
1256 . "Mod%C3%A8le%3AHomonymie%20de%20nom%20romain%7CMod%C3%A8le%3AHomonymie%20de%20parti%20politique%7C"
1257 . "Mod%C3%A8le%3AHomonymie%20de%20route%7CMod%C3%A8le%3AHomonymie%20dynastique%7C"
1258 . "Mod%C3%A8le%3AHomonymie%20vid%C3%A9oludique%7CMod%C3%A8le%3AHomonymie%20%C3%A9difice%20religieux%7C"
1259 . "Mod%C3%A8le%3AInternationalisation%7CMod%C3%A8le%3AIsom%C3%A9rie%7CMod%C3%A8le%3AParonymie%7C"
1260 . "Mod%C3%A8le%3APatronyme%7CMod%C3%A8le%3APatronyme%20basque%7CMod%C3%A8le%3APatronyme%20italien%7C"
1261 . "Mod%C3%A8le%3APatronymie%7CMod%C3%A8le%3APersonnes%20homonymes%7CMod%C3%A8le%3ASaints%20homonymes%7C"
1262 . "Mod%C3%A8le%3ATitres%20homonymes%7CMod%C3%A8le%3AToponymie%7CMod%C3%A8le%3AUnit%C3%A9s%20homonymes%7C"
1263 . "Mod%C3%A8le%3AVilles%20homonymes%7CMod%C3%A8le%3A%C3%89difices%20religieux%20homonymes"
1270 * @dataProvider provideRomanNumeralsData
1272 function testRomanNumerals( $num, $numerals ) {
1273 $this->assertEquals(
1275 Language
::romanNumeral( $num ),
1276 "romanNumeral('$num')"
1280 public static function provideRomanNumeralsData() {
1295 array( 49, 'XLIX' ),
1299 array( 80, 'LXXX' ),
1301 array( 99, 'XCIX' ),
1304 array( 300, 'CCC' ),
1308 array( 700, 'DCC' ),
1309 array( 800, 'DCCC' ),
1311 array( 999, 'CMXCIX' ),
1313 array( 1989, 'MCMLXXXIX' ),
1314 array( 2000, 'MM' ),
1315 array( 3000, 'MMM' ),
1316 array( 4000, 'MMMM' ),
1317 array( 5000, 'MMMMM' ),
1318 array( 6000, 'MMMMMM' ),
1319 array( 7000, 'MMMMMMM' ),
1320 array( 8000, 'MMMMMMMM' ),
1321 array( 9000, 'MMMMMMMMM' ),
1322 array( 9999, 'MMMMMMMMMCMXCIX' ),
1323 array( 10000, 'MMMMMMMMMM' ),
1328 * @dataProvider providePluralData
1330 function testConvertPlural( $expected, $number, $forms ) {
1331 $chosen = $this->getLang()->convertPlural( $number, $forms );
1332 $this->assertEquals( $expected, $chosen );
1335 public static function providePluralData() {
1336 // Params are: [expected text, number given, [the plural forms]]
1338 array( 'plural', 0, array(
1339 'singular', 'plural'
1341 array( 'explicit zero', 0, array(
1342 '0=explicit zero', 'singular', 'plural'
1344 array( 'explicit one', 1, array(
1345 'singular', 'plural', '1=explicit one',
1347 array( 'singular', 1, array(
1348 'singular', 'plural', '0=explicit zero',
1350 array( 'plural', 3, array(
1351 '0=explicit zero', '1=explicit one', 'singular', 'plural'
1353 array( 'explicit eleven', 11, array(
1354 'singular', 'plural', '11=explicit eleven',
1356 array( 'plural', 12, array(
1357 'singular', 'plural', '11=explicit twelve',
1359 array( 'plural', 12, array(
1360 'singular', 'plural', '=explicit form',
1362 array( 'other', 2, array(
1363 'kissa=kala', '1=2=3', 'other',
1369 * @covers Language::translateBlockExpiry()
1370 * @dataProvider provideTranslateBlockExpiry
1372 function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
1373 $lang = $this->getLang();
1374 if ( is_array( $expectedData ) ) {
1375 list( $func, $arg ) = $expectedData;
1376 $expected = $lang->$func( $arg );
1378 $expected = $expectedData;
1380 $this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
1383 public static function provideTranslateBlockExpiry() {
1385 array( '2 hours', '2 hours', 'simple data from ipboptions' ),
1386 array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
1387 array( 'indefinite', 'infinity', 'alternative infinite from ipboptions' ),
1388 array( 'indefinite', 'indefinite', 'another alternative infinite from ipboptions' ),
1389 array( array( 'formatDuration', 1023 * 60 * 60 ), '1023 hours', 'relative' ),
1390 array( array( 'formatDuration', -1023 ), '-1023 seconds', 'negative relative' ),
1391 array( array( 'formatDuration', 0 ), 'now', 'now' ),
1392 array( array( 'timeanddate', '20120102070000' ), '2012-1-1 7:00 +1 day', 'mixed, handled as absolute' ),
1393 array( array( 'timeanddate', '19910203040506' ), '1991-2-3 4:05:06', 'absolute' ),
1394 array( array( 'timeanddate', '19700101000000' ), '1970-1-1 0:00:00', 'absolute at epoch' ),
1395 array( array( 'timeanddate', '19691231235959' ), '1969-12-31 23:59:59', 'time before epoch' ),
1396 array( 'dummy', 'dummy', 'return garbage as is' ),
1401 * @covers Language::commafy()
1402 * @dataProvider provideCommafyData
1404 function testCommafy( $number, $numbersWithCommas ) {
1405 $this->assertEquals(
1407 $this->getLang()->commafy( $number ),
1408 "commafy('$number')"
1412 public static function provideCommafyData() {
1416 array( 100, '100' ),
1417 array( 1000, '1,000' ),
1418 array( 10000, '10,000' ),
1419 array( 100000, '100,000' ),
1420 array( 1000000, '1,000,000' ),
1421 array( 1.0001, '1.0001' ),
1422 array( 10.0001, '10.0001' ),
1423 array( 100.0001, '100.0001' ),
1424 array( 1000.0001, '1,000.0001' ),
1425 array( 10000.0001, '10,000.0001' ),
1426 array( 100000.0001, '100,000.0001' ),
1427 array( 1000000.0001, '1,000,000.0001' ),
1431 function testListToText() {
1432 $lang = $this->getLang();
1433 $and = $lang->getMessageFromDB( 'and' );
1434 $s = $lang->getMessageFromDB( 'word-separator' );
1435 $c = $lang->getMessageFromDB( 'comma-separator' );
1437 $this->assertEquals( '', $lang->listToText( array() ) );
1438 $this->assertEquals( 'a', $lang->listToText( array( 'a' ) ) );
1439 $this->assertEquals( "a{$and}{$s}b", $lang->listToText( array( 'a', 'b' ) ) );
1440 $this->assertEquals( "a{$c}b{$and}{$s}c", $lang->listToText( array( 'a', 'b', 'c' ) ) );
1441 $this->assertEquals( "a{$c}b{$c}c{$and}{$s}d", $lang->listToText( array( 'a', 'b', 'c', 'd' ) ) );
1445 * @dataProvider provideIsSupportedLanguage
1447 function testIsSupportedLanguage( $code, $expected, $comment ) {
1448 $this->assertEquals( $expected, Language
::isSupportedLanguage( $code ), $comment );
1451 public static function provideIsSupportedLanguage() {
1453 array( 'en', true, 'is supported language' ),
1454 array( 'fi', true, 'is supported language' ),
1455 array( 'bunny', false, 'is not supported language' ),
1456 array( 'FI', false, 'is not supported language, input should be in lower case' ),