Merge "Add PHPUnit test to ApiQueryDisabled"
[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 [ 'tg', 'tg-latn' ]
24 );
25 }
26
27 protected function tearDown() {
28 unset( $this->lc );
29 unset( $this->lang );
30
31 parent::tearDown();
32 }
33
34 /**
35 * @covers LanguageConverter::getPreferredVariant
36 */
37 public function testGetPreferredVariantDefaults() {
38 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
39 }
40
41 /**
42 * @covers LanguageConverter::getPreferredVariant
43 * @covers LanguageConverter::getHeaderVariant
44 */
45 public function testGetPreferredVariantHeaders() {
46 global $wgRequest;
47 $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
48
49 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
50 }
51
52 /**
53 * @covers LanguageConverter::getPreferredVariant
54 * @covers LanguageConverter::getHeaderVariant
55 */
56 public function testGetPreferredVariantHeaderWeight() {
57 global $wgRequest;
58 $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
59
60 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
61 }
62
63 /**
64 * @covers LanguageConverter::getPreferredVariant
65 * @covers LanguageConverter::getHeaderVariant
66 */
67 public function testGetPreferredVariantHeaderWeight2() {
68 global $wgRequest;
69 $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
70
71 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
72 }
73
74 /**
75 * @covers LanguageConverter::getPreferredVariant
76 * @covers LanguageConverter::getHeaderVariant
77 */
78 public function testGetPreferredVariantHeaderMulti() {
79 global $wgRequest;
80 $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
81
82 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
83 }
84
85 /**
86 * @covers LanguageConverter::getPreferredVariant
87 */
88 public function testGetPreferredVariantUserOption() {
89 global $wgUser;
90
91 $wgUser = new User;
92 $wgUser->load(); // from 'defaults'
93 $wgUser->mId = 1;
94 $wgUser->mDataLoaded = true;
95 $wgUser->mOptionsLoaded = true;
96 $wgUser->setOption( 'variant', 'tg-latn' );
97
98 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
99 }
100
101 /**
102 * @covers LanguageConverter::getPreferredVariant
103 * @covers LanguageConverter::getUserVariant
104 */
105 public function testGetPreferredVariantUserOptionForForeignLanguage() {
106 global $wgUser;
107
108 $this->setContentLang( 'en' );
109 $wgUser = new User;
110 $wgUser->load(); // from 'defaults'
111 $wgUser->mId = 1;
112 $wgUser->mDataLoaded = true;
113 $wgUser->mOptionsLoaded = true;
114 $wgUser->setOption( 'variant-tg', 'tg-latn' );
115
116 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
117 }
118
119 /**
120 * @covers LanguageConverter::getPreferredVariant
121 * @covers LanguageConverter::getUserVariant
122 * @covers LanguageConverter::getURLVariant
123 */
124 public function testGetPreferredVariantHeaderUserVsUrl() {
125 global $wgRequest, $wgUser;
126
127 $this->setContentLang( 'tg-latn' );
128 $wgRequest->setVal( 'variant', 'tg' );
129 $wgUser = User::newFromId( "admin" );
130 $wgUser->setId( 1 );
131 $wgUser->mFrom = 'defaults';
132 $wgUser->mOptionsLoaded = true;
133 // The user's data is ignored because the variant is set in the URL.
134 $wgUser->setOption( 'variant', 'tg-latn' );
135 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
136 }
137
138 /**
139 * @covers LanguageConverter::getPreferredVariant
140 */
141 public function testGetPreferredVariantDefaultLanguageVariant() {
142 global $wgDefaultLanguageVariant;
143
144 $wgDefaultLanguageVariant = 'tg-latn';
145 $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
146 }
147
148 /**
149 * @covers LanguageConverter::getPreferredVariant
150 * @covers LanguageConverter::getURLVariant
151 */
152 public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
153 global $wgDefaultLanguageVariant, $wgRequest;
154
155 $this->setContentLang( 'tg-latn' );
156 $wgDefaultLanguageVariant = 'tg';
157 $wgRequest->setVal( 'variant', null );
158 $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
159 }
160
161 /**
162 * Test exhausting pcre.backtrack_limit
163 *
164 * @covers LanguageConverter::autoConvert
165 */
166 public function testAutoConvertT124404() {
167 $testString = '';
168 for ( $i = 0; $i < 1000; $i++ ) {
169 $testString .= 'xxx xxx xxx';
170 }
171 $testString .= "\n<big id='в'></big>";
172 $old = ini_set( 'pcre.backtrack_limit', 200 );
173 $result = $this->lc->autoConvert( $testString, 'tg-latn' );
174 ini_set( 'pcre.backtrack_limit', $old );
175 // The в in the id attribute should not get converted to a v
176 $this->assertFalse(
177 strpos( $result, 'v' ),
178 "в converted to v despite being in attribue"
179 );
180 }
181 }
182
183 /**
184 * Test converter (from Tajiki to latin orthography)
185 */
186 class TestConverter extends LanguageConverter {
187 private $table = [
188 'б' => 'b',
189 'в' => 'v',
190 'г' => 'g',
191 ];
192
193 function loadDefaultTables() {
194 $this->mTables = [
195 'tg-latn' => new ReplacementArray( $this->table ),
196 'tg' => new ReplacementArray()
197 ];
198 }
199 }
200
201 class LanguageToTest extends Language {
202 function __construct() {
203 parent::__construct();
204 $variants = [ 'tg', 'tg-latn' ];
205 $this->mConverter = new TestConverter( $this, 'tg', $variants );
206 }
207 }