Merge "mediawiki.language: Add unit tests for digit transform table"
[lhc/web/wiklou.git] / tests / qunit / suites / resources / mediawiki / mediawiki.language.test.js
1 ( function ( mw, $ ) {
2 'use strict';
3
4 QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
5 setup: function () {
6 this.liveLangData = mw.language.data;
7 mw.language.data = {};
8 },
9 teardown: function () {
10 mw.language.data = this.liveLangData;
11 },
12 messages: {
13 // mw.language.listToText test
14 and: ' and',
15 'comma-separator': ', ',
16 'word-separator': ' '
17 }
18 } ) );
19
20 QUnit.test( 'mw.language getData and setData', 3, function ( assert ) {
21 mw.language.setData( 'en', 'testkey', 'testvalue' );
22 assert.equal( mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
23 assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
24 mw.language.setData( 'en-us', 'testkey', 'testvalue' );
25 assert.equal( mw.language.getData( 'en-US', 'testkey' ), 'testvalue', 'Case insensitive test for mw.language' );
26 } );
27
28 QUnit.test( 'mw.language.commafy test', 9, function ( assert ) {
29 mw.language.setData( 'en', 'digitGroupingPattern', null );
30 mw.language.setData( 'en', 'digitTransformTable', null );
31 mw.language.setData( 'en', 'separatorTransformTable', null );
32
33 mw.config.set( 'wgUserLanguage', 'en' );
34 // Number grouping patterns are as per http://cldr.unicode.org/translation/number-patterns
35 assert.equal( mw.language.commafy( 1234.567, '###0.#####' ), '1234.567', 'Pattern with no digit grouping separator defined' );
36 assert.equal( mw.language.commafy( 123456789.567, '###0.#####' ), '123456789.567', 'Pattern with no digit grouping separator defined, bigger decimal part' );
37 assert.equal( mw.language.commafy( 0.567, '###0.#####' ), '0.567', 'Decimal part 0' );
38 assert.equal( mw.language.commafy( '.567', '###0.#####' ), '0.567', 'Decimal part missing. replace with zero' );
39 assert.equal( mw.language.commafy( 1234, '##,#0.#####' ), '12,34', 'Pattern with no fractional part' );
40 assert.equal( mw.language.commafy( -1234.567, '###0.#####' ), '-1234.567', 'Negative number' );
41 assert.equal( mw.language.commafy( -1234.567, '#,###.00' ), '-1,234.56', 'Fractional part bigger than pattern.' );
42 assert.equal( mw.language.commafy( 123456789.567, '###,##0.00' ), '123,456,789.56', 'Decimal part as group of 3' );
43 assert.equal( mw.language.commafy( 123456789.567, '###,###,#0.00' ), '1,234,567,89.56', 'Decimal part as group of 3 and last one 2' );
44 } );
45
46 QUnit.test( 'mw.language.convertNumber', 2, function ( assert ) {
47 mw.language.setData( 'en', 'digitGroupingPattern', null );
48 mw.language.setData( 'en', 'digitTransformTable', null );
49 mw.language.setData( 'en', 'separatorTransformTable', { ',': '.', '.': ',' } );
50 mw.config.set( 'wgUserLanguage', 'en' );
51 mw.config.set( 'wgTranslateNumerals', true );
52
53 assert.equal( mw.language.convertNumber( 1800 ), '1.800', 'formatting' );
54 assert.equal( mw.language.convertNumber( '1.800', true ), '1800', 'unformatting' );
55 } );
56
57 QUnit.test( 'mw.language.convertNumber - digitTransformTable', function ( assert ) {
58 mw.config.set( 'wgUserLanguage', 'hi' );
59 mw.config.set( 'wgTranslateNumerals', true );
60 mw.language.setData( 'hi', 'digitGroupingPattern', null );
61 mw.language.setData( 'hi', 'separatorTransformTable', { ',': '.', '.': ',' } );
62
63 // Example from Hindi (MessagesHi.php)
64 mw.language.setData( 'hi', 'digitTransformTable', {
65 0: '०',
66 1: '१',
67 2: '२'
68 } );
69
70 assert.equal( mw.language.convertNumber( 1200 ), '१.२००', 'format' );
71 assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform' );
72 assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain' );
73
74 mw.config.set( 'wgTranslateNumerals', false );
75
76 assert.equal( mw.language.convertNumber( 1200 ), '1.200', 'format (digit transform disabled)' );
77 assert.equal( mw.language.convertNumber( '१.२००', true ), '1200', 'unformat from digit transform (when disabled)' );
78 assert.equal( mw.language.convertNumber( '1.200', true ), '1200', 'unformat plain (digit transform disabled)' );
79 } );
80
81 function grammarTest( langCode, test ) {
82 // The test works only if the content language is opt.language
83 // because it requires [lang].js to be loaded.
84 QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
85 QUnit.expect( test.length );
86
87 for ( var i = 0; i < test.length; i++ ) {
88 assert.equal(
89 mw.language.convertGrammar( test[ i ].word, test[ i ].grammarForm ),
90 test[ i ].expected,
91 test[ i ].description
92 );
93 }
94 } );
95 }
96
97 // These tests run only for the current UI language.
98 var grammarTests = {
99 bs: [
100 {
101 word: 'word',
102 grammarForm: 'instrumental',
103 expected: 's word',
104 description: 'Grammar test for instrumental case'
105 },
106 {
107 word: 'word',
108 grammarForm: 'lokativ',
109 expected: 'o word',
110 description: 'Grammar test for lokativ case'
111 }
112 ],
113
114 he: [
115 {
116 word: 'ויקיפדיה',
117 grammarForm: 'prefixed',
118 expected: 'וויקיפדיה',
119 description: 'Duplicate the "Waw" if prefixed'
120 },
121 {
122 word: 'וולפגנג',
123 grammarForm: 'prefixed',
124 expected: 'וולפגנג',
125 description: 'Duplicate the "Waw" if prefixed, but not if it is already duplicated.'
126 },
127 {
128 word: 'הקובץ',
129 grammarForm: 'prefixed',
130 expected: 'קובץ',
131 description: 'Remove the "He" if prefixed'
132 },
133 {
134 word: 'Wikipedia',
135 grammarForm: 'תחילית',
136 expected: '־Wikipedia',
137 description: 'Add a hyphen (maqaf) before non-Hebrew letters'
138 },
139 {
140 word: '1995',
141 grammarForm: 'תחילית',
142 expected: '־1995',
143 description: 'Add a hyphen (maqaf) before numbers'
144 }
145 ],
146
147 hsb: [
148 {
149 word: 'word',
150 grammarForm: 'instrumental',
151 expected: 'z word',
152 description: 'Grammar test for instrumental case'
153 },
154 {
155 word: 'word',
156 grammarForm: 'lokatiw',
157 expected: 'wo word',
158 description: 'Grammar test for lokatiw case'
159 }
160 ],
161
162 dsb: [
163 {
164 word: 'word',
165 grammarForm: 'instrumental',
166 expected: 'z word',
167 description: 'Grammar test for instrumental case'
168 },
169 {
170 word: 'word',
171 grammarForm: 'lokatiw',
172 expected: 'wo word',
173 description: 'Grammar test for lokatiw case'
174 }
175 ],
176
177 hy: [
178 {
179 word: 'Մաունա',
180 grammarForm: 'genitive',
181 expected: 'Մաունայի',
182 description: 'Grammar test for genitive case'
183 },
184 {
185 word: 'հետո',
186 grammarForm: 'genitive',
187 expected: 'հետոյի',
188 description: 'Grammar test for genitive case'
189 },
190 {
191 word: 'գիրք',
192 grammarForm: 'genitive',
193 expected: 'գրքի',
194 description: 'Grammar test for genitive case'
195 },
196 {
197 word: 'ժամանակի',
198 grammarForm: 'genitive',
199 expected: 'ժամանակիի',
200 description: 'Grammar test for genitive case'
201 }
202 ],
203
204 fi: [
205 {
206 word: 'talo',
207 grammarForm: 'genitive',
208 expected: 'talon',
209 description: 'Grammar test for genitive case'
210 },
211 {
212 word: 'linux',
213 grammarForm: 'genitive',
214 expected: 'linuxin',
215 description: 'Grammar test for genitive case'
216 },
217 {
218 word: 'talo',
219 grammarForm: 'elative',
220 expected: 'talosta',
221 description: 'Grammar test for elative case'
222 },
223 {
224 word: 'pastöroitu',
225 grammarForm: 'partitive',
226 expected: 'pastöroitua',
227 description: 'Grammar test for partitive case'
228 },
229 {
230 word: 'talo',
231 grammarForm: 'partitive',
232 expected: 'taloa',
233 description: 'Grammar test for partitive case'
234 },
235 {
236 word: 'talo',
237 grammarForm: 'illative',
238 expected: 'taloon',
239 description: 'Grammar test for illative case'
240 },
241 {
242 word: 'linux',
243 grammarForm: 'inessive',
244 expected: 'linuxissa',
245 description: 'Grammar test for inessive case'
246 }
247 ],
248
249 ru: [
250 {
251 word: 'тесть',
252 grammarForm: 'genitive',
253 expected: 'тестя',
254 description: 'Grammar test for genitive case, тесть -> тестя'
255 },
256 {
257 word: 'привилегия',
258 grammarForm: 'genitive',
259 expected: 'привилегии',
260 description: 'Grammar test for genitive case, привилегия -> привилегии'
261 },
262 {
263 word: 'установка',
264 grammarForm: 'genitive',
265 expected: 'установки',
266 description: 'Grammar test for genitive case, установка -> установки'
267 },
268 {
269 word: 'похоти',
270 grammarForm: 'genitive',
271 expected: 'похотей',
272 description: 'Grammar test for genitive case, похоти -> похотей'
273 },
274 {
275 word: 'доводы',
276 grammarForm: 'genitive',
277 expected: 'доводов',
278 description: 'Grammar test for genitive case, доводы -> доводов'
279 },
280 {
281 word: 'песчаник',
282 grammarForm: 'genitive',
283 expected: 'песчаника',
284 description: 'Grammar test for genitive case, песчаник -> песчаника'
285 },
286 {
287 word: 'данные',
288 grammarForm: 'genitive',
289 expected: 'данных',
290 description: 'Grammar test for genitive case, данные -> данных'
291 },
292 {
293 word: 'тесть',
294 grammarForm: 'prepositional',
295 expected: 'тесте',
296 description: 'Grammar test for prepositional case, тесть -> тесте'
297 },
298 {
299 word: 'привилегия',
300 grammarForm: 'prepositional',
301 expected: 'привилегии',
302 description: 'Grammar test for prepositional case, привилегия -> привилегии'
303 },
304 {
305 word: 'установка',
306 grammarForm: 'prepositional',
307 expected: 'установке',
308 description: 'Grammar test for prepositional case, установка -> установке'
309 },
310 {
311 word: 'похоти',
312 grammarForm: 'prepositional',
313 expected: 'похотях',
314 description: 'Grammar test for prepositional case, похоти -> похотях'
315 },
316 {
317 word: 'доводы',
318 grammarForm: 'prepositional',
319 expected: 'доводах',
320 description: 'Grammar test for prepositional case, доводы -> доводах'
321 },
322 {
323 word: 'Викисклад',
324 grammarForm: 'prepositional',
325 expected: 'Викискладе',
326 description: 'Grammar test for prepositional case, Викисклад -> Викискладе'
327 },
328 {
329 word: 'Викисклад',
330 grammarForm: 'genitive',
331 expected: 'Викисклада',
332 description: 'Grammar test for genitive case, Викисклад -> Викисклада'
333 },
334 {
335 word: 'песчаник',
336 grammarForm: 'prepositional',
337 expected: 'песчанике',
338 description: 'Grammar test for prepositional case, песчаник -> песчанике'
339 },
340 {
341 word: 'данные',
342 grammarForm: 'prepositional',
343 expected: 'данных',
344 description: 'Grammar test for prepositional case, данные -> данных'
345 },
346 {
347 word: 'русский',
348 grammarForm: 'languagegen',
349 expected: 'русского',
350 description: 'Grammar test for languagegen case, русский -> русского'
351 },
352 {
353 word: 'немецкий',
354 grammarForm: 'languagegen',
355 expected: 'немецкого',
356 description: 'Grammar test for languagegen case, немецкий -> немецкого'
357 },
358 {
359 word: 'иврит',
360 grammarForm: 'languagegen',
361 expected: 'иврита',
362 description: 'Grammar test for languagegen case, иврит -> иврита'
363 },
364 {
365 word: 'эсперанто',
366 grammarForm: 'languagegen',
367 expected: 'эсперанто',
368 description: 'Grammar test for languagegen case, эсперанто -> эсперанто'
369 },
370 {
371 word: 'русский',
372 grammarForm: 'languageprep',
373 expected: 'русском',
374 description: 'Grammar test for languageprep case, русский -> русском'
375 },
376 {
377 word: 'немецкий',
378 grammarForm: 'languageprep',
379 expected: 'немецком',
380 description: 'Grammar test for languageprep case, немецкий -> немецком'
381 },
382 {
383 word: 'идиш',
384 grammarForm: 'languageprep',
385 expected: 'идише',
386 description: 'Grammar test for languageprep case, идиш -> идише'
387 },
388 {
389 word: 'эсперанто',
390 grammarForm: 'languageprep',
391 expected: 'эсперанто',
392 description: 'Grammar test for languageprep case, эсперанто -> эсперанто'
393 },
394 {
395 word: 'русский',
396 grammarForm: 'languageadverb',
397 expected: 'по-русски',
398 description: 'Grammar test for languageadverb case, русский -> по-русски'
399 },
400 {
401 word: 'немецкий',
402 grammarForm: 'languageadverb',
403 expected: 'по-немецки',
404 description: 'Grammar test for languageadverb case, немецкий -> по-немецки'
405 },
406 {
407 word: 'иврит',
408 grammarForm: 'languageadverb',
409 expected: 'на иврите',
410 description: 'Grammar test for languageadverb case, иврит -> на иврите'
411 },
412 {
413 word: 'эсперанто',
414 grammarForm: 'languageadverb',
415 expected: 'на эсперанто',
416 description: 'Grammar test for languageadverb case, эсперанто -> на эсперанто'
417 },
418 {
419 word: 'гуарани',
420 grammarForm: 'languageadverb',
421 expected: 'на языке гуарани',
422 description: 'Grammar test for languageadverb case, гуарани -> на языке гуарани'
423 }
424 ],
425
426 hu: [
427 {
428 word: 'Wikipédiá',
429 grammarForm: 'rol',
430 expected: 'Wikipédiáról',
431 description: 'Grammar test for rol case'
432 },
433 {
434 word: 'Wikipédiá',
435 grammarForm: 'ba',
436 expected: 'Wikipédiába',
437 description: 'Grammar test for ba case'
438 },
439 {
440 word: 'Wikipédiá',
441 grammarForm: 'k',
442 expected: 'Wikipédiák',
443 description: 'Grammar test for k case'
444 }
445 ],
446
447 ga: [
448 {
449 word: 'an Domhnach',
450 grammarForm: 'ainmlae',
451 expected: 'Dé Domhnaigh',
452 description: 'Grammar test for ainmlae case'
453 },
454 {
455 word: 'an Luan',
456 grammarForm: 'ainmlae',
457 expected: 'Dé Luain',
458 description: 'Grammar test for ainmlae case'
459 },
460 {
461 word: 'an Satharn',
462 grammarForm: 'ainmlae',
463 expected: 'Dé Sathairn',
464 description: 'Grammar test for ainmlae case'
465 }
466 ],
467
468 uk: [
469 {
470 word: 'Вікіпедія',
471 grammarForm: 'genitive',
472 expected: 'Вікіпедії',
473 description: 'Grammar test for genitive case'
474 },
475 {
476 word: 'Віківиди',
477 grammarForm: 'genitive',
478 expected: 'Віківидів',
479 description: 'Grammar test for genitive case'
480 },
481 {
482 word: 'Вікіцитати',
483 grammarForm: 'genitive',
484 expected: 'Вікіцитат',
485 description: 'Grammar test for genitive case'
486 },
487 {
488 word: 'Вікіпідручник',
489 grammarForm: 'genitive',
490 expected: 'Вікіпідручника',
491 description: 'Grammar test for genitive case'
492 },
493 {
494 word: 'Вікіпедія',
495 grammarForm: 'accusative',
496 expected: 'Вікіпедію',
497 description: 'Grammar test for accusative case'
498 }
499 ],
500
501 sl: [
502 {
503 word: 'word',
504 grammarForm: 'orodnik',
505 expected: 'z word',
506 description: 'Grammar test for orodnik case'
507 },
508 {
509 word: 'word',
510 grammarForm: 'mestnik',
511 expected: 'o word',
512 description: 'Grammar test for mestnik case'
513 }
514 ],
515
516 os: [
517 {
518 word: 'бæстæ',
519 grammarForm: 'genitive',
520 expected: 'бæсты',
521 description: 'Grammar test for genitive case'
522 },
523 {
524 word: 'бæстæ',
525 grammarForm: 'allative',
526 expected: 'бæстæм',
527 description: 'Grammar test for allative case'
528 },
529 {
530 word: 'Тигр',
531 grammarForm: 'dative',
532 expected: 'Тигрæн',
533 description: 'Grammar test for dative case'
534 },
535 {
536 word: 'цъити',
537 grammarForm: 'dative',
538 expected: 'цъитийæн',
539 description: 'Grammar test for dative case'
540 },
541 {
542 word: 'лæппу',
543 grammarForm: 'genitive',
544 expected: 'лæппуйы',
545 description: 'Grammar test for genitive case'
546 },
547 {
548 word: '2011',
549 grammarForm: 'equative',
550 expected: '2011-ау',
551 description: 'Grammar test for equative case'
552 }
553 ],
554
555 la: [
556 {
557 word: 'Translatio',
558 grammarForm: 'genitive',
559 expected: 'Translationis',
560 description: 'Grammar test for genitive case'
561 },
562 {
563 word: 'Translatio',
564 grammarForm: 'accusative',
565 expected: 'Translationem',
566 description: 'Grammar test for accusative case'
567 },
568 {
569 word: 'Translatio',
570 grammarForm: 'ablative',
571 expected: 'Translatione',
572 description: 'Grammar test for ablative case'
573 }
574 ]
575 };
576
577 $.each( grammarTests, function ( langCode, test ) {
578 if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
579 grammarTest( langCode, test );
580 }
581 } );
582
583 QUnit.test( 'List to text test', 4, function ( assert ) {
584 assert.equal( mw.language.listToText( [] ), '', 'Blank list' );
585 assert.equal( mw.language.listToText( [ 'a' ] ), 'a', 'Single item' );
586 assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
587 assert.equal( mw.language.listToText( [ 'a', 'b', 'c' ] ), 'a, b and c', 'More than two items' );
588 } );
589 }( mediaWiki, jQuery ) );