use Wikimedia\TestingAccessWrapper;
class LanguageTest extends LanguageClassesTestCase {
- use LanguageNameUtilsTestTrait;
-
- /** @var array Copy of $wgHooks from before we unset LanguageGetTranslatedLanguageNames */
- private $origHooks;
-
- public function setUp() {
- global $wgHooks;
-
- parent::setUp();
-
- // Don't allow installed hooks to run, except if a test restores them via origHooks (needed
- // for testIsKnownLanguageTag_cldr)
- $this->origHooks = $wgHooks;
- $newHooks = $wgHooks;
- unset( $newHooks['LanguageGetTranslatedLanguageNames'] );
- $this->setMwGlobals( 'wgHooks', $newHooks );
- }
-
/**
* @covers Language::convertDoubleWidth
* @covers Language::normalizeForSearch
);
}
+ /**
+ * Test Language::isValidBuiltInCode()
+ * @dataProvider provideLanguageCodes
+ * @covers Language::isValidBuiltInCode
+ */
+ public function testBuiltInCodeValidation( $code, $expected, $message = '' ) {
+ $this->assertEquals( $expected,
+ (bool)Language::isValidBuiltInCode( $code ),
+ "validating code $code $message"
+ );
+ }
+
+ public static function provideLanguageCodes() {
+ return [
+ [ 'fr', true, 'Two letters, minor case' ],
+ [ 'EN', false, 'Two letters, upper case' ],
+ [ 'tyv', true, 'Three letters' ],
+ [ 'be-tarask', true, 'With dash' ],
+ [ 'be-x-old', true, 'With extension (two dashes)' ],
+ [ 'be_tarask', false, 'Reject underscores' ],
+ ];
+ }
+
+ /**
+ * Test Language::isKnownLanguageTag()
+ * @dataProvider provideKnownLanguageTags
+ * @covers Language::isKnownLanguageTag
+ */
+ public function testKnownLanguageTag( $code, $message = '' ) {
+ $this->assertTrue(
+ (bool)Language::isKnownLanguageTag( $code ),
+ "validating code $code - $message"
+ );
+ }
+
+ public static function provideKnownLanguageTags() {
+ return [
+ [ 'fr', 'simple code' ],
+ [ 'bat-smg', 'an MW legacy tag' ],
+ [ 'sgs', 'an internal standard MW name, for which a legacy tag is used externally' ],
+ ];
+ }
+
+ /**
+ * @covers Language::isKnownLanguageTag
+ */
+ public function testKnownCldrLanguageTag() {
+ if ( !class_exists( 'LanguageNames' ) ) {
+ $this->markTestSkipped( 'The LanguageNames class is not available. '
+ . 'The CLDR extension is probably not installed.' );
+ }
+
+ $this->assertTrue(
+ (bool)Language::isKnownLanguageTag( 'pal' ),
+ 'validating code "pal" an ancient language, which probably will '
+ . 'not appear in Names.php, but appears in CLDR in English'
+ );
+ }
+
+ /**
+ * Negative tests for Language::isKnownLanguageTag()
+ * @dataProvider provideUnKnownLanguageTags
+ * @covers Language::isKnownLanguageTag
+ */
+ public function testUnknownLanguageTag( $code, $message = '' ) {
+ $this->assertFalse(
+ (bool)Language::isKnownLanguageTag( $code ),
+ "checking that code $code is invalid - $message"
+ );
+ }
+
+ public static function provideUnknownLanguageTags() {
+ return [
+ [ 'mw', 'non-existent two-letter code' ],
+ [ 'foo"<bar', 'very invalid language code' ],
+ ];
+ }
+
/**
* Test too short timestamp
* @expectedException MWException
$s = $lang->getMessageFromDB( 'word-separator' );
$c = $lang->getMessageFromDB( 'comma-separator' );
- $this->assertEquals( '', $lang->listToText( [] ) );
+ $this->assertSame( '', $lang->listToText( [] ) );
$this->assertEquals( 'a', $lang->listToText( [ 'a' ] ) );
$this->assertEquals( "a{$and}{$s}b", $lang->listToText( [ 'a', 'b' ] ) );
$this->assertEquals( "a{$c}b{$and}{$s}c", $lang->listToText( [ 'a', 'b', 'c' ] ) );
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 );
$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
+ */
+ public function testIsSupportedLanguage( $code, $expected, $comment ) {
+ $this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
+ }
+
+ public static function provideIsSupportedLanguage() {
+ return [
+ [ 'en', true, 'is supported language' ],
+ [ 'fi', true, 'is supported language' ],
+ [ 'bunny', false, 'is not supported language' ],
+ [ 'FI', false, 'is not supported language, input should be in lower case' ],
+ ];
}
/**
[ 'èl', 'Ll' , 'Non-ASCII is overridden', [ 'è' => 'L' ] ],
];
}
-
- // The following methods are for LanguageNameUtilsTestTrait
-
- private function isSupportedLanguage( $code ) {
- return Language::isSupportedLanguage( $code );
- }
-
- private function isValidCode( $code ) {
- return Language::isValidCode( $code );
- }
-
- private function isValidBuiltInCode( $code ) {
- return Language::isValidBuiltInCode( $code );
- }
-
- private function isKnownLanguageTag( $code ) {
- return Language::isKnownLanguageTag( $code );
- }
-
- /**
- * Call getLanguageName() and getLanguageNames() using the Language static methods.
- *
- * @param array $options To set globals for testing Language
- * @param string $expected
- * @param string $code
- * @param mixed ...$otherArgs Optionally, pass $inLanguage and/or $include.
- */
- private function assertGetLanguageNames( array $options, $expected, $code, ...$otherArgs ) {
- if ( $options ) {
- foreach ( $options as $key => $val ) {
- $this->setMwGlobals( "wg$key", $val );
- }
- $this->resetServices();
- }
- $this->assertSame( $expected,
- Language::fetchLanguageNames( ...$otherArgs )[strtolower( $code )] ?? '' );
- $this->assertSame( $expected, Language::fetchLanguageName( $code, ...$otherArgs ) );
- }
-
- private function getLanguageNames( ...$args ) {
- return Language::fetchLanguageNames( ...$args );
- }
-
- private function getLanguageName( ...$args ) {
- return Language::fetchLanguageName( ...$args );
- }
-
- private static function getFileName( ...$args ) {
- return Language::getFileName( ...$args );
- }
-
- private static function getMessagesFileName( $code ) {
- return Language::getMessagesFileName( $code );
- }
-
- private static function getJsonMessagesFileName( $code ) {
- return Language::getJsonMessagesFileName( $code );
- }
-
- /**
- * @todo This really belongs in the cldr extension's tests.
- *
- * @covers MediaWiki\Languages\LanguageNameUtils::isKnownLanguageTag
- * @covers Language::isKnownLanguageTag
- */
- public function testIsKnownLanguageTag_cldr() {
- if ( !class_exists( 'LanguageNames' ) ) {
- $this->markTestSkipped( 'The LanguageNames class is not available. '
- . 'The CLDR extension is probably not installed.' );
- }
-
- // We need to restore the extension's hook that we removed.
- $this->setMwGlobals( 'wgHooks', $this->origHooks );
-
- // "pal" is an ancient language, which probably will not appear in Names.php, but appears in
- // CLDR in English
- $this->assertTrue( Language::isKnownLanguageTag( 'pal' ) );
- }
}