Merge "Parser test to test language conversion around HTML tags."
[lhc/web/wiklou.git] / tests / qunit / suites / resources / mediawiki / mediawiki.jqueryMsg.test.js
1 ( function ( mw, $ ) {
2
3 QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
4 setup: function () {
5 this.orgMwLangauge = mw.language;
6 mw.language = $.extend( true, {}, this.orgMwLangauge );
7 },
8 teardown: function () {
9 mw.language = this.orgMwLangauge;
10 }
11 }) );
12
13 var mwLanguageCache = {};
14 function getMwLanguage( langCode, cb ) {
15 if ( mwLanguageCache[langCode] !== undefined ) {
16 mwLanguageCache[langCode].add( cb );
17 return;
18 }
19 mwLanguageCache[langCode] = $.Callbacks( 'once memory' );
20 mwLanguageCache[langCode].add( cb );
21 $.ajax({
22 url: mw.util.wikiScript( 'load' ),
23 data: {
24 skin: mw.config.get( 'skin' ),
25 lang: langCode,
26 debug: mw.config.get( 'debug' ),
27 modules: [
28 'mediawiki.language.data',
29 'mediawiki.language'
30 ].join( '|' ),
31 only: 'scripts'
32 },
33 dataType: 'script'
34 }).done( function () {
35 mwLanguageCache[langCode].fire( mw.language );
36 }).fail( function () {
37 mwLanguageCache[langCode].fire( false );
38 });
39 }
40
41 QUnit.test( 'Plural', 3, function ( assert ) {
42 var parser = mw.jqueryMsg.getMessageFunction();
43
44 mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' );
45 assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
46 assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
47 assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
48 } );
49
50
51 QUnit.test( 'Gender', 11, function ( assert ) {
52 // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
53 // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
54 var user = mw.user,
55 parser = mw.jqueryMsg.getMessageFunction();
56
57 // The values here are not significant,
58 // what matters is which of the values is choosen by the parser
59 mw.messages.set( 'gender-msg', '$1: {{GENDER:$2|blue|pink|green}}' );
60
61 user.options.set( 'gender', 'male' );
62 assert.equal(
63 parser( 'gender-msg', 'Bob', 'male' ),
64 'Bob: blue',
65 'Masculine from string "male"'
66 );
67 assert.equal(
68 parser( 'gender-msg', 'Bob', user ),
69 'Bob: blue',
70 'Masculine from mw.user object'
71 );
72
73 user.options.set( 'gender', 'unknown' );
74 assert.equal(
75 parser( 'gender-msg', 'Foo', user ),
76 'Foo: green',
77 'Neutral from mw.user object' );
78 assert.equal(
79 parser( 'gender-msg', 'Alice', 'female' ),
80 'Alice: pink',
81 'Feminine from string "female"' );
82 assert.equal(
83 parser( 'gender-msg', 'User' ),
84 'User: green',
85 'Neutral when no parameter given' );
86 assert.equal(
87 parser( 'gender-msg', 'User', 'unknown' ),
88 'User: green',
89 'Neutral from string "unknown"'
90 );
91
92 mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
93
94 assert.equal(
95 parser( 'gender-msg-one-form', 'male', 10 ),
96 'User: 10 edits',
97 'Gender neutral and plural form'
98 );
99 assert.equal(
100 parser( 'gender-msg-one-form', 'female', 1 ),
101 'User: 1 edit',
102 'Gender neutral and singular form'
103 );
104
105 mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
106 assert.equal(
107 parser( 'gender-msg-lowercase', 'male' ),
108 'he is awesome',
109 'Gender masculine'
110 );
111 assert.equal(
112 parser( 'gender-msg-lowercase', 'female' ),
113 'she is awesome',
114 'Gender feminine'
115 );
116
117 mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
118 assert.equal(
119 parser( 'gender-msg-wrong', 'female' ),
120 ' test',
121 'Invalid syntax should result in {{gender}} simply being stripped away'
122 );
123 } );
124
125 QUnit.test( 'Grammar', 2, function ( assert ) {
126 var parser = mw.jqueryMsg.getMessageFunction();
127
128 // Assume the grammar form grammar_case_foo is not valid in any language
129 mw.messages.set( 'grammar-msg', 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}' );
130 assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
131
132 mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
133 assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
134 } );
135
136 QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
137 mw.messages.set( mw.libs.phpParserData.messages );
138 $.each( mw.libs.phpParserData.tests, function ( i, test ) {
139 QUnit.stop();
140 getMwLanguage( test.lang, function ( langClass ) {
141 QUnit.start();
142 if ( !langClass ) {
143 assert.ok( false, 'Language "' + test.lang + '" failed to load' );
144 return;
145 }
146 mw.config.set( 'wgUserLanguage', test.lang ) ;
147 var parser = new mw.jqueryMsg.parser( { language: langClass } );
148 assert.equal(
149 parser.parse( test.key, test.args ).html(),
150 test.result,
151 test.name
152 );
153 } );
154 } );
155 });
156
157 }( mediaWiki, jQuery ) );