LanguageConverterTest.php 5.3 KB

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