<?php
+use Wikimedia\TestingAccessWrapper;
+
class LanguageTest extends LanguageClassesTestCase {
/**
* @covers Language::convertDoubleWidth
'48 hours 0 minutes',
'formatTimePeriod() rounding (=48h), avoidseconds'
],
+ [
+ 259199.55,
+ 'avoidhours',
+ '3 d',
+ 'formatTimePeriod() rounding (>48h), avoidhours'
+ ],
+ [
+ 259199.55,
+ [ 'avoid' => 'avoidhours', 'noabbrevs' => true ],
+ '3 days',
+ 'formatTimePeriod() rounding (>48h), avoidhours'
+ ],
[
259199.55,
'avoidminutes',
'平成24',
'nengo'
],
+ [
+ 'xtY',
+ '20190430235959',
+ '平成31',
+ '平成31',
+ 'nengo - last day of heisei'
+ ],
+ [
+ 'xtY',
+ '20190501000000',
+ '令和元',
+ '令和元',
+ 'nengo - first day of reiwa'
+ ],
+ [
+ 'xtY',
+ '20200501000000',
+ '令和2',
+ '令和2',
+ 'nengo - second year of reiwa'
+ ],
[
'xrxkYY',
'20120102090705',
$this->assertEquals( "a{$c}b{$c}c{$and}{$s}d", $lang->listToText( [ 'a', 'b', 'c', 'd' ] ) );
}
+ /**
+ * @covers Language::clearCaches
+ */
+ public function testClearCaches() {
+ $languageClass = TestingAccessWrapper::newFromClass( Language::class );
+
+ // Populate $dataCache
+ Language::getLocalisationCache()->getItem( 'zh', 'mainpage' );
+ $oldCacheObj = Language::$dataCache;
+ $this->assertNotCount( 0,
+ TestingAccessWrapper::newFromObject( Language::$dataCache )->loadedItems );
+
+ // Populate $mLangObjCache
+ $lang = Language::factory( 'en' );
+ $this->assertNotCount( 0, Language::$mLangObjCache );
+
+ // Populate $fallbackLanguageCache
+ Language::getFallbacksIncludingSiteLanguage( 'en' );
+ $this->assertNotCount( 0, $languageClass->fallbackLanguageCache );
+
+ // Populate $grammarTransformations
+ $lang->getGrammarTransformations();
+ $this->assertNotNull( $languageClass->grammarTransformations );
+
+ // Populate $languageNameCache
+ Language::fetchLanguageNames();
+ $this->assertNotNull( $languageClass->languageNameCache );
+
+ Language::clearCaches();
+
+ $this->assertNotSame( $oldCacheObj, Language::$dataCache );
+ $this->assertCount( 0,
+ TestingAccessWrapper::newFromObject( Language::$dataCache )->loadedItems );
+ $this->assertCount( 0, Language::$mLangObjCache );
+ $this->assertCount( 0, $languageClass->fallbackLanguageCache );
+ $this->assertNull( $languageClass->grammarTransformations );
+ $this->assertNull( $languageClass->languageNameCache );
+ }
+
/**
* @dataProvider provideIsSupportedLanguage
* @covers Language::isSupportedLanguage
];
}
+ /**
+ * @covers Language::hasVariant
+ */
+ public function testHasVariant() {
+ // See LanguageSrTest::testHasVariant() for additional tests
+ $en = Language::factory( 'en' );
+ $this->assertTrue( $en->hasVariant( 'en' ), 'base is always a variant' );
+ $this->assertFalse( $en->hasVariant( 'en-bogus' ), 'bogus en variant' );
+
+ $bogus = Language::factory( 'bogus' );
+ $this->assertTrue( $bogus->hasVariant( 'bogus' ), 'base is always a variant' );
+ }
+
/**
* @covers Language::equals
*/
public function testEquals() {
- $en1 = new Language();
- $en1->setCode( 'en' );
-
+ $en1 = Language::factory( 'en' );
$en2 = Language::factory( 'en' );
- $en2->setCode( 'en' );
-
- $this->assertTrue( $en1->equals( $en2 ), 'en equals en' );
+ $en3 = new Language();
+ $this->assertTrue( $en1->equals( $en2 ), 'en1 equals en2' );
+ $this->assertTrue( $en2->equals( $en3 ), 'en2 equals en3' );
+ $this->assertTrue( $en3->equals( $en1 ), 'en3 equals en1' );
$fr = Language::factory( 'fr' );
$this->assertFalse( $en1->equals( $fr ), 'en not equals fr' );
+
+ $ar1 = Language::factory( 'ar' );
+ $ar2 = new LanguageAr();
+ $this->assertTrue( $ar1->equals( $ar2 ), 'ar equals ar' );
+ }
+
+ /**
+ * @dataProvider provideUcfirst
+ * @covers Language::ucfirst
+ */
+ public function testUcfirst( $orig, $expected, $desc, $overrides = false ) {
+ $lang = new Language();
+ if ( is_array( $overrides ) ) {
+ $this->setMwGlobals( [ 'wgOverrideUcfirstCharacters' => $overrides ] );
+ }
+ $this->assertSame( $lang->ucfirst( $orig ), $expected, $desc );
+ }
+
+ public static function provideUcfirst() {
+ return [
+ [ 'alice', 'Alice', 'simple ASCII string', false ],
+ [ 'århus', 'Århus', 'unicode string', false ],
+ //overrides do not affect ASCII characters
+ [ 'foo', 'Foo', 'ASCII is not overriden', [ 'f' => 'b' ] ],
+ // but they do affect non-ascii ones
+ [ 'èl', 'Ll' , 'Non-ASCII is overridden', [ 'è' => 'L' ] ],
+ ];
}
}