3 class LanguageConverterTest
extends MediaWikiLangTestCase
{
4 /** @var LanguageToTest */
5 protected $lang = null;
6 /** @var TestConverter */
9 protected function setUp() {
12 $this->setMwGlobals( [
13 'wgContLang' => Language
::factory( 'tg' ),
14 'wgLanguageCode' => 'tg',
15 'wgDefaultLanguageVariant' => false,
16 'wgRequest' => new FauxRequest( [] ),
20 $this->lang
= new LanguageToTest();
21 $this->lc
= new TestConverter(
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' ]
29 protected function tearDown() {
37 * @covers LanguageConverter::getPreferredVariant
39 public function testGetPreferredVariantDefaults() {
40 $this->assertEquals( 'tg', $this->lc
->getPreferredVariant() );
44 * @covers LanguageConverter::getPreferredVariant
45 * @covers LanguageConverter::getURLVariant
47 public function testGetPreferredVariantUrl() {
49 $wgRequest->setVal( 'variant', 'tg-latn' );
51 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
55 * @covers LanguageConverter::getPreferredVariant
56 * @covers LanguageConverter::getURLVariant
58 public function testGetPreferredVariantUrlDeprecated() {
60 $wgRequest->setVal( 'variant', 'bat-smg' );
62 $this->assertEquals( 'sgs', $this->lc
->getPreferredVariant() );
66 * @covers LanguageConverter::getPreferredVariant
67 * @covers LanguageConverter::getURLVariant
69 public function testGetPreferredVariantUrlBCP47() {
71 $wgRequest->setVal( 'variant', 'en-simple' );
73 $this->assertEquals( 'simple', $this->lc
->getPreferredVariant() );
77 * @covers LanguageConverter::getPreferredVariant
78 * @covers LanguageConverter::getHeaderVariant
80 public function testGetPreferredVariantHeaders() {
82 $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
84 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
88 * @covers LanguageConverter::getPreferredVariant
89 * @covers LanguageConverter::getHeaderVariant
91 public function testGetPreferredVariantHeadersBCP47() {
93 $wgRequest->setHeader( 'Accept-Language', 'en-simple' );
95 $this->assertEquals( 'simple', $this->lc
->getPreferredVariant() );
99 * @covers LanguageConverter::getPreferredVariant
100 * @covers LanguageConverter::getHeaderVariant
102 public function testGetPreferredVariantHeaderWeight() {
104 $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
106 $this->assertEquals( 'tg', $this->lc
->getPreferredVariant() );
110 * @covers LanguageConverter::getPreferredVariant
111 * @covers LanguageConverter::getHeaderVariant
113 public function testGetPreferredVariantHeaderWeight2() {
115 $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
117 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
121 * @covers LanguageConverter::getPreferredVariant
122 * @covers LanguageConverter::getHeaderVariant
124 public function testGetPreferredVariantHeaderMulti() {
126 $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
128 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
132 * @covers LanguageConverter::getPreferredVariant
134 public function testGetPreferredVariantUserOption() {
138 $wgUser->load(); // from 'defaults'
140 $wgUser->mDataLoaded
= true;
141 $wgUser->mOptionsLoaded
= true;
142 $wgUser->setOption( 'variant', 'tg-latn' );
144 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
148 * @covers LanguageConverter::getPreferredVariant
150 public function testGetPreferredVariantUserOptionDeprecated() {
154 $wgUser->load(); // from 'defaults'
156 $wgUser->mDataLoaded
= true;
157 $wgUser->mOptionsLoaded
= true;
158 $wgUser->setOption( 'variant', 'bat-smg' );
160 $this->assertEquals( 'sgs', $this->lc
->getPreferredVariant() );
164 * @covers LanguageConverter::getPreferredVariant
166 public function testGetPreferredVariantUserOptionBCP47() {
170 $wgUser->load(); // from 'defaults'
172 $wgUser->mDataLoaded
= true;
173 $wgUser->mOptionsLoaded
= true;
174 $wgUser->setOption( 'variant', 'en-simple' );
176 $this->assertEquals( 'simple', $this->lc
->getPreferredVariant() );
180 * @covers LanguageConverter::getPreferredVariant
181 * @covers LanguageConverter::getUserVariant
183 public function testGetPreferredVariantUserOptionForForeignLanguage() {
184 global $wgContLang, $wgUser;
186 $wgContLang = Language
::factory( 'en' );
188 $wgUser->load(); // from 'defaults'
190 $wgUser->mDataLoaded
= true;
191 $wgUser->mOptionsLoaded
= true;
192 $wgUser->setOption( 'variant-tg', 'tg-latn' );
194 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
198 * @covers LanguageConverter::getPreferredVariant
199 * @covers LanguageConverter::getUserVariant
201 public function testGetPreferredVariantUserOptionForForeignLanguageDeprecated() {
202 global $wgContLang, $wgUser;
204 $wgContLang = Language
::factory( 'en' );
206 $wgUser->load(); // from 'defaults'
208 $wgUser->mDataLoaded
= true;
209 $wgUser->mOptionsLoaded
= true;
210 $wgUser->setOption( 'variant-tg', 'bat-smg' );
212 $this->assertEquals( 'sgs', $this->lc
->getPreferredVariant() );
216 * @covers LanguageConverter::getPreferredVariant
217 * @covers LanguageConverter::getUserVariant
219 public function testGetPreferredVariantUserOptionForForeignLanguageBCP47() {
220 global $wgContLang, $wgUser;
222 $wgContLang = Language
::factory( 'en' );
224 $wgUser->load(); // from 'defaults'
226 $wgUser->mDataLoaded
= true;
227 $wgUser->mOptionsLoaded
= true;
228 $wgUser->setOption( 'variant-tg', 'en-simple' );
230 $this->assertEquals( 'simple', $this->lc
->getPreferredVariant() );
234 * @covers LanguageConverter::getPreferredVariant
235 * @covers LanguageConverter::getUserVariant
236 * @covers LanguageConverter::getURLVariant
238 public function testGetPreferredVariantHeaderUserVsUrl() {
239 global $wgContLang, $wgRequest, $wgUser;
241 $wgContLang = Language
::factory( 'tg-latn' );
242 $wgRequest->setVal( 'variant', 'tg' );
243 $wgUser = User
::newFromId( "admin" );
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() );
253 * @covers LanguageConverter::getPreferredVariant
255 public function testGetPreferredVariantDefaultLanguageVariant() {
256 global $wgDefaultLanguageVariant;
258 $wgDefaultLanguageVariant = 'tg-latn';
259 $this->assertEquals( 'tg-latn', $this->lc
->getPreferredVariant() );
263 * @covers LanguageConverter::getPreferredVariant
265 public function testGetPreferredVariantDefaultLanguageVariantDeprecated() {
266 global $wgDefaultLanguageVariant;
268 $wgDefaultLanguageVariant = 'bat-smg';
269 $this->assertEquals( 'sgs', $this->lc
->getPreferredVariant() );
273 * @covers LanguageConverter::getPreferredVariant
275 public function testGetPreferredVariantDefaultLanguageVariantBCP47() {
276 global $wgDefaultLanguageVariant;
278 $wgDefaultLanguageVariant = 'en-simple';
279 $this->assertEquals( 'simple', $this->lc
->getPreferredVariant() );
283 * @covers LanguageConverter::getPreferredVariant
284 * @covers LanguageConverter::getURLVariant
286 public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
287 global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
289 $wgContLang = Language
::factory( 'tg-latn' );
290 $wgDefaultLanguageVariant = 'tg';
291 $wgRequest->setVal( 'variant', null );
292 $this->assertEquals( 'tg', $this->lc
->getPreferredVariant() );
296 * Test exhausting pcre.backtrack_limit
298 * @covers LanguageConverter::autoConvert
300 public function testAutoConvertT124404() {
302 for ( $i = 0; $i < 1000; $i++
) {
303 $testString .= 'xxx xxx xxx';
305 $testString .= "\n<big id='в'></big>";
306 $old = ini_set( 'pcre.backtrack_limit', 200 );
307 $result = $this->lc
->autoConvert( $testString, 'tg-latn' );
308 ini_set( 'pcre.backtrack_limit', $old );
309 // The в in the id attribute should not get converted to a v
311 strpos( $result, 'v' ),
312 "в converted to v despite being in attribue"
318 * Test converter (from Tajiki to latin orthography)
320 class TestConverter
extends LanguageConverter
{
327 function loadDefaultTables() {
329 'sgs' => new ReplacementArray(),
330 'simple' => new ReplacementArray(),
331 'tg-latn' => new ReplacementArray( $this->table
),
332 'tg' => new ReplacementArray()
337 class LanguageToTest
extends Language
{
338 function __construct() {
339 parent
::__construct();
340 $variants = [ 'tg', 'tg-latn' ];
341 $this->mConverter
= new TestConverter( $this, 'tg', $variants );