Merge "Update special page aliases for Serbian"
[lhc/web/wiklou.git] / tests / phpunit / languages / LanguageConverterTest.php
1 <?php
2
3 class LanguageConverterTest extends MediaWikiLangTestCase {
4 /** @var LanguageToTest */
5 protected $lang = null;
6 /** @var TestConverter */
7 protected $lc = null;
8
9 protected function setUp() {
10 parent::setUp();
11
12 $this->setContentLang( 'tg' );
13
14 $this->setMwGlobals( [
15 'wgDefaultLanguageVariant' => false,
16 'wgRequest' => new FauxRequest( [] ),
17 'wgUser' => new User,
18 ] );
19
20 $this->lang = new LanguageToTest();
21 $this->lc = new TestConverter(
22 $this->lang, 'tg',
23 # Adding 'sgs' as a variant to ensure we handle deprecated codes
24 # adding 'simple' as a variant to ensure we handle non BCP 47 codes
25 [ 'tg', 'tg-latn', 'sgs', 'simple' ]
26 );
27 }
28
29 protected function tearDown() {
30 unset( $this->lc );
31 unset( $this->lang );
32
33 parent::tearDown();
34 }
35
36 /**
37 * @covers LanguageConverter::getPreferredVariant
38 */
39 public function testGetPreferredVariantDefaults() {
40 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
41 }
42
43 /**
44 * @covers LanguageConverter::getPreferredVariant
45 * @covers LanguageConverter::getURLVariant
46 */
47 public function testGetPreferredVariantUrl() {
48 global $wgRequest;
49 $wgRequest->setVal( 'variant', 'tg-latn' );
50
51 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
52 }
53
54 /**
55 * @covers LanguageConverter::getPreferredVariant
56 * @covers LanguageConverter::getURLVariant
57 */
58 public function testGetPreferredVariantUrlDeprecated() {
59 global $wgRequest;
60 $wgRequest->setVal( 'variant', 'bat-smg' );
61
62 $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
63 }
64
65 /**
66 * @covers LanguageConverter::getPreferredVariant
67 * @covers LanguageConverter::getURLVariant
68 */
69 public function testGetPreferredVariantUrlBCP47() {
70 global $wgRequest;
71 $wgRequest->setVal( 'variant', 'en-simple' );
72
73 $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
74 }
75
76 /**
77 * @covers LanguageConverter::getPreferredVariant
78 * @covers LanguageConverter::getHeaderVariant
79 */
80 public function testGetPreferredVariantHeaders() {
81 global $wgRequest;
82 $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
83
84 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
85 }
86
87 /**
88 * @covers LanguageConverter::getPreferredVariant
89 * @covers LanguageConverter::getHeaderVariant
90 */
91 public function testGetPreferredVariantHeadersBCP47() {
92 global $wgRequest;
93 $wgRequest->setHeader( 'Accept-Language', 'en-simple' );
94
95 $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
96 }
97
98 /**
99 * @covers LanguageConverter::getPreferredVariant
100 * @covers LanguageConverter::getHeaderVariant
101 */
102 public function testGetPreferredVariantHeaderWeight() {
103 global $wgRequest;
104 $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
105
106 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
107 }
108
109 /**
110 * @covers LanguageConverter::getPreferredVariant
111 * @covers LanguageConverter::getHeaderVariant
112 */
113 public function testGetPreferredVariantHeaderWeight2() {
114 global $wgRequest;
115 $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
116
117 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
118 }
119
120 /**
121 * @covers LanguageConverter::getPreferredVariant
122 * @covers LanguageConverter::getHeaderVariant
123 */
124 public function testGetPreferredVariantHeaderMulti() {
125 global $wgRequest;
126 $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
127
128 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
129 }
130
131 /**
132 * @covers LanguageConverter::getPreferredVariant
133 */
134 public function testGetPreferredVariantUserOption() {
135 global $wgUser;
136
137 $wgUser = new User;
138 $wgUser->load(); // from 'defaults'
139 $wgUser->mId = 1;
140 $wgUser->mDataLoaded = true;
141 $wgUser->mOptionsLoaded = true;
142 $wgUser->setOption( 'variant', 'tg-latn' );
143
144 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
145 }
146
147 /**
148 * @covers LanguageConverter::getPreferredVariant
149 */
150 public function testGetPreferredVariantUserOptionDeprecated() {
151 global $wgUser;
152
153 $wgUser = new User;
154 $wgUser->load(); // from 'defaults'
155 $wgUser->mId = 1;
156 $wgUser->mDataLoaded = true;
157 $wgUser->mOptionsLoaded = true;
158 $wgUser->setOption( 'variant', 'bat-smg' );
159
160 $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
161 }
162
163 /**
164 * @covers LanguageConverter::getPreferredVariant
165 */
166 public function testGetPreferredVariantUserOptionBCP47() {
167 global $wgUser;
168
169 $wgUser = new User;
170 $wgUser->load(); // from 'defaults'
171 $wgUser->mId = 1;
172 $wgUser->mDataLoaded = true;
173 $wgUser->mOptionsLoaded = true;
174 $wgUser->setOption( 'variant', 'en-simple' );
175
176 $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
177 }
178
179 /**
180 * @covers LanguageConverter::getPreferredVariant
181 * @covers LanguageConverter::getUserVariant
182 */
183 public function testGetPreferredVariantUserOptionForForeignLanguage() {
184 global $wgUser;
185
186 $this->setContentLang( 'en' );
187 $wgUser = new User;
188 $wgUser->load(); // from 'defaults'
189 $wgUser->mId = 1;
190 $wgUser->mDataLoaded = true;
191 $wgUser->mOptionsLoaded = true;
192 $wgUser->setOption( 'variant-tg', 'tg-latn' );
193
194 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
195 }
196
197 /**
198 * @covers LanguageConverter::getPreferredVariant
199 * @covers LanguageConverter::getUserVariant
200 */
201 public function testGetPreferredVariantUserOptionForForeignLanguageDeprecated() {
202 global $wgUser;
203
204 $this->setContentLang( 'en' );
205 $wgUser = new User;
206 $wgUser->load(); // from 'defaults'
207 $wgUser->mId = 1;
208 $wgUser->mDataLoaded = true;
209 $wgUser->mOptionsLoaded = true;
210 $wgUser->setOption( 'variant-tg', 'bat-smg' );
211
212 $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
213 }
214
215 /**
216 * @covers LanguageConverter::getPreferredVariant
217 * @covers LanguageConverter::getUserVariant
218 */
219 public function testGetPreferredVariantUserOptionForForeignLanguageBCP47() {
220 global $wgUser;
221
222 $this->setContentLang( 'en' );
223 $wgUser = new User;
224 $wgUser->load(); // from 'defaults'
225 $wgUser->mId = 1;
226 $wgUser->mDataLoaded = true;
227 $wgUser->mOptionsLoaded = true;
228 $wgUser->setOption( 'variant-tg', 'en-simple' );
229
230 $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
231 }
232
233 /**
234 * @covers LanguageConverter::getPreferredVariant
235 * @covers LanguageConverter::getUserVariant
236 * @covers LanguageConverter::getURLVariant
237 */
238 public function testGetPreferredVariantHeaderUserVsUrl() {
239 global $wgRequest, $wgUser;
240
241 $this->setContentLang( 'tg-latn' );
242 $wgRequest->setVal( 'variant', 'tg' );
243 $wgUser = User::newFromId( "admin" );
244 $wgUser->setId( 1 );
245 $wgUser->mFrom = 'defaults';
246 $wgUser->mOptionsLoaded = true;
247 // The user's data is ignored because the variant is set in the URL.
248 $wgUser->setOption( 'variant', 'tg-latn' );
249 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
250 }
251
252 /**
253 * @covers LanguageConverter::getPreferredVariant
254 */
255 public function testGetPreferredVariantDefaultLanguageVariant() {
256 global $wgDefaultLanguageVariant;
257
258 $wgDefaultLanguageVariant = 'tg-latn';
259 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
260 }
261
262 /**
263 * @covers LanguageConverter::getPreferredVariant
264 */
265 public function testGetPreferredVariantDefaultLanguageVariantDeprecated() {
266 global $wgDefaultLanguageVariant;
267
268 $wgDefaultLanguageVariant = 'bat-smg';
269 $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
270 }
271
272 /**
273 * @covers LanguageConverter::getPreferredVariant
274 */
275 public function testGetPreferredVariantDefaultLanguageVariantBCP47() {
276 global $wgDefaultLanguageVariant;
277
278 $wgDefaultLanguageVariant = 'en-simple';
279 $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
280 }
281
282 /**
283 * @covers LanguageConverter::getPreferredVariant
284 * @covers LanguageConverter::getURLVariant
285 */
286 public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
287 global $wgDefaultLanguageVariant, $wgRequest;
288
289 $this->setContentLang( 'tg-latn' );
290 $wgDefaultLanguageVariant = 'tg';
291 $wgRequest->setVal( 'variant', null );
292 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
293 }
294
295 /**
296 * Test exhausting pcre.backtrack_limit
297 *
298 * @covers LanguageConverter::autoConvert
299 */
300 public function testAutoConvertT124404() {
301 $testString = '';
302 for ( $i = 0; $i < 1000; $i++ ) {
303 $testString .= 'xxx xxx xxx';
304 }
305 $testString .= "\n<big id='в'></big>";
306 $this->setIniSetting( 'pcre.backtrack_limit', 200 );
307 $result = $this->lc->autoConvert( $testString, 'tg-latn' );
308 // The в in the id attribute should not get converted to a v
309 $this->assertFalse(
310 strpos( $result, 'v' ),
311 "в converted to v despite being in attribue"
312 );
313 }
314 }
315
316 /**
317 * Test converter (from Tajiki to latin orthography)
318 */
319 class TestConverter extends LanguageConverter {
320 private $table = [
321 'б' => 'b',
322 'в' => 'v',
323 'г' => 'g',
324 ];
325
326 function loadDefaultTables() {
327 $this->mTables = [
328 'sgs' => new ReplacementArray(),
329 'simple' => new ReplacementArray(),
330 'tg-latn' => new ReplacementArray( $this->table ),
331 'tg' => new ReplacementArray()
332 ];
333 }
334 }
335
336 class LanguageToTest extends Language {
337 function __construct() {
338 parent::__construct();
339 $variants = [ 'tg', 'tg-latn' ];
340 $this->mConverter = new TestConverter( $this, 'tg', $variants );
341 }
342 }