protected function setUp() {
parent::setUp();
- $this->setMwGlobals( array(
+ $this->setMwGlobals( [
'wgContLang' => Language::factory( 'tg' ),
'wgLanguageCode' => 'tg',
'wgDefaultLanguageVariant' => false,
- 'wgRequest' => new FauxRequest( array() ),
+ 'wgRequest' => new FauxRequest( [] ),
'wgUser' => new User,
- ) );
+ ] );
$this->lang = new LanguageToTest();
$this->lc = new TestConverter(
$this->lang, 'tg',
- array( 'tg', 'tg-latn' )
+ # Adding 'sgs' as a variant to ensure we handle deprecated codes
+ # adding 'simple' as a variant to ensure we handle non BCP 47 codes
+ [ 'tg', 'tg-latn', 'sgs', 'simple' ]
);
}
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
}
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ * @covers LanguageConverter::getURLVariant
+ */
+ public function testGetPreferredVariantUrl() {
+ global $wgRequest;
+ $wgRequest->setVal( 'variant', 'tg-latn' );
+
+ $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+ }
+
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ * @covers LanguageConverter::getURLVariant
+ */
+ public function testGetPreferredVariantUrlDeprecated() {
+ global $wgRequest;
+ $wgRequest->setVal( 'variant', 'bat-smg' );
+
+ $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
+ }
+
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ * @covers LanguageConverter::getURLVariant
+ */
+ public function testGetPreferredVariantUrlBCP47() {
+ global $wgRequest;
+ $wgRequest->setVal( 'variant', 'en-simple' );
+
+ $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
+ }
+
/**
* @covers LanguageConverter::getPreferredVariant
* @covers LanguageConverter::getHeaderVariant
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ * @covers LanguageConverter::getHeaderVariant
+ */
+ public function testGetPreferredVariantHeadersBCP47() {
+ global $wgRequest;
+ $wgRequest->setHeader( 'Accept-Language', 'en-simple' );
+
+ $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
+ }
+
/**
* @covers LanguageConverter::getPreferredVariant
* @covers LanguageConverter::getHeaderVariant
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ */
+ public function testGetPreferredVariantUserOptionDeprecated() {
+ global $wgUser;
+
+ $wgUser = new User;
+ $wgUser->load(); // from 'defaults'
+ $wgUser->mId = 1;
+ $wgUser->mDataLoaded = true;
+ $wgUser->mOptionsLoaded = true;
+ $wgUser->setOption( 'variant', 'bat-smg' );
+
+ $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
+ }
+
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ */
+ public function testGetPreferredVariantUserOptionBCP47() {
+ global $wgUser;
+
+ $wgUser = new User;
+ $wgUser->load(); // from 'defaults'
+ $wgUser->mId = 1;
+ $wgUser->mDataLoaded = true;
+ $wgUser->mOptionsLoaded = true;
+ $wgUser->setOption( 'variant', 'en-simple' );
+
+ $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
+ }
+
/**
* @covers LanguageConverter::getPreferredVariant
* @covers LanguageConverter::getUserVariant
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ * @covers LanguageConverter::getUserVariant
+ */
+ public function testGetPreferredVariantUserOptionForForeignLanguageDeprecated() {
+ global $wgContLang, $wgUser;
+
+ $wgContLang = Language::factory( 'en' );
+ $wgUser = new User;
+ $wgUser->load(); // from 'defaults'
+ $wgUser->mId = 1;
+ $wgUser->mDataLoaded = true;
+ $wgUser->mOptionsLoaded = true;
+ $wgUser->setOption( 'variant-tg', 'bat-smg' );
+
+ $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
+ }
+
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ * @covers LanguageConverter::getUserVariant
+ */
+ public function testGetPreferredVariantUserOptionForForeignLanguageBCP47() {
+ global $wgContLang, $wgUser;
+
+ $wgContLang = Language::factory( 'en' );
+ $wgUser = new User;
+ $wgUser->load(); // from 'defaults'
+ $wgUser->mId = 1;
+ $wgUser->mDataLoaded = true;
+ $wgUser->mOptionsLoaded = true;
+ $wgUser->setOption( 'variant-tg', 'en-simple' );
+
+ $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
+ }
+
/**
* @covers LanguageConverter::getPreferredVariant
* @covers LanguageConverter::getUserVariant
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ */
+ public function testGetPreferredVariantDefaultLanguageVariantDeprecated() {
+ global $wgDefaultLanguageVariant;
+
+ $wgDefaultLanguageVariant = 'bat-smg';
+ $this->assertEquals( 'sgs', $this->lc->getPreferredVariant() );
+ }
+
+ /**
+ * @covers LanguageConverter::getPreferredVariant
+ */
+ public function testGetPreferredVariantDefaultLanguageVariantBCP47() {
+ global $wgDefaultLanguageVariant;
+
+ $wgDefaultLanguageVariant = 'en-simple';
+ $this->assertEquals( 'simple', $this->lc->getPreferredVariant() );
+ }
+
/**
* @covers LanguageConverter::getPreferredVariant
* @covers LanguageConverter::getURLVariant
$wgRequest->setVal( 'variant', null );
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
}
+
+ /**
+ * Test exhausting pcre.backtrack_limit
+ *
+ * @covers LanguageConverter::autoConvert
+ */
+ public function testAutoConvertT124404() {
+ $testString = '';
+ for ( $i = 0; $i < 1000; $i++ ) {
+ $testString .= 'xxx xxx xxx';
+ }
+ $testString .= "\n<big id='в'></big>";
+ $old = ini_set( 'pcre.backtrack_limit', 200 );
+ $result = $this->lc->autoConvert( $testString, 'tg-latn' );
+ ini_set( 'pcre.backtrack_limit', $old );
+ // The в in the id attribute should not get converted to a v
+ $this->assertFalse(
+ strpos( $result, 'v' ),
+ "в converted to v despite being in attribue"
+ );
+ }
}
/**
* Test converter (from Tajiki to latin orthography)
*/
class TestConverter extends LanguageConverter {
- private $table = array(
+ private $table = [
'б' => 'b',
'в' => 'v',
'г' => 'g',
- );
+ ];
function loadDefaultTables() {
- $this->mTables = array(
+ $this->mTables = [
+ 'sgs' => new ReplacementArray(),
+ 'simple' => new ReplacementArray(),
'tg-latn' => new ReplacementArray( $this->table ),
'tg' => new ReplacementArray()
- );
+ ];
}
}
class LanguageToTest extends Language {
function __construct() {
parent::__construct();
- $variants = array( 'tg', 'tg-latn' );
+ $variants = [ 'tg', 'tg-latn' ];
$this->mConverter = new TestConverter( $this, 'tg', $variants );
}
}