Add tests to a few Language class methods

Yes, the tests indicate that ucwordbreaks() is bugged, but this
should be addressed separately.

Change-Id: Ibc4a9dd2659bd723ce88c27be1c20b56a997709e
This commit is contained in:
Max Semenik 2019-11-17 01:52:02 -08:00
parent b9c675ca15
commit e6e2e80dfa
2 changed files with 174 additions and 0 deletions

View file

@ -2,6 +2,7 @@
use MediaWiki\Languages\LanguageFallback;
use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\MediaWikiServices;
use Wikimedia\TestingAccessWrapper;
class LanguageIntegrationTest extends LanguageClassesTestCase {
@ -1958,4 +1959,133 @@ class LanguageIntegrationTest extends LanguageClassesTestCase {
// CLDR in English
$this->assertTrue( Language::isKnownLanguageTag( 'pal' ) );
}
/**
* @covers Language::getNamespaces
* @covers Language::fixVariableInNamespace
* @dataProvider provideGetNamespaces
*/
public function testGetNamespaces( string $langCode, array $config, array $expected ) {
$langClass = Language::class . ucfirst( $langCode );
if ( !class_exists( $langClass ) ) {
$langClass = Language::class;
}
/** @var Language $lang */
$lang = new $langClass(
$langCode,
MediaWikiServices::getInstance()->getLocalisationCache(),
$this->createNoOpMock( LanguageNameUtils::class ),
$this->createNoOpMock( LanguageFallback::class ),
$this->createNoOpMock( MapCacheLRU::class )
);
$config += [
'wgMetaNamespace' => 'Project',
'wgMetaNamespaceTalk' => false,
'wgExtraNamespaces' => [],
];
$this->setMwGlobals( $config );
$namespaces = $lang->getNamespaces();
$this->assertEquals( $expected, $namespaces );
}
public function provideGetNamespaces() {
$enNamespaces = [
NS_MEDIA => 'Media',
NS_SPECIAL => 'Special',
NS_MAIN => '',
NS_TALK => 'Talk',
NS_USER => 'User',
NS_USER_TALK => 'User_talk',
NS_FILE => 'File',
NS_FILE_TALK => 'File_talk',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_talk',
NS_TEMPLATE => 'Template',
NS_TEMPLATE_TALK => 'Template_talk',
NS_HELP => 'Help',
NS_HELP_TALK => 'Help_talk',
NS_CATEGORY => 'Category',
NS_CATEGORY_TALK => 'Category_talk',
];
$ukNamespaces = [
NS_MEDIA => 'Медіа',
NS_SPECIAL => 'Спеціальна',
NS_TALK => 'Обговорення',
NS_USER => 'Користувач',
NS_USER_TALK => 'Обговорення_користувача',
NS_FILE => 'Файл',
NS_FILE_TALK => 'Обговорення_файлу',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'Обговорення_MediaWiki',
NS_TEMPLATE => 'Шаблон',
NS_TEMPLATE_TALK => 'Обговорення_шаблону',
NS_HELP => 'Довідка',
NS_HELP_TALK => 'Обговорення_довідки',
NS_CATEGORY => 'Категорія',
NS_CATEGORY_TALK => 'Обговорення_категорії',
];
return [
'Default configuration' => [
'en',
[],
$enNamespaces + [
NS_PROJECT => 'Project',
NS_PROJECT_TALK => 'Project_talk',
],
],
'Custom project NS + extra' => [
'en',
[
'wgMetaNamespace' => 'Wikipedia',
'wgExtraNamespaces' => [
100 => 'Borderlands',
101 => 'Borderlands_talk',
],
],
$enNamespaces + [
NS_PROJECT => 'Wikipedia',
NS_PROJECT_TALK => 'Wikipedia_talk',
100 => 'Borderlands',
101 => 'Borderlands_talk',
],
],
'Custom project NS and talk + extra' => [
'en',
[
'wgMetaNamespace' => 'Wikipedia',
'wgMetaNamespaceTalk' => 'Wikipedia_drama',
'wgExtraNamespaces' => [
100 => 'Borderlands',
101 => 'Borderlands_talk',
],
],
$enNamespaces + [
NS_PROJECT => 'Wikipedia',
NS_PROJECT_TALK => 'Wikipedia_drama',
100 => 'Borderlands',
101 => 'Borderlands_talk',
],
],
'Ukrainian default' => [
'uk',
[],
$ukNamespaces + [
NS_MAIN => '',
NS_PROJECT => 'Project',
NS_PROJECT_TALK => 'Обговорення_Project',
],
],
'Ukrainian custom NS' => [
'uk',
[
'wgMetaNamespace' => 'Вікіпедія',
],
$ukNamespaces + [
NS_MAIN => '',
NS_PROJECT => 'Вікіпедія',
NS_PROJECT_TALK => 'Обговорення_Вікіпедії',
],
],
];
}
}

View file

@ -47,4 +47,48 @@ class LanguageTest extends MediaWikiUnitTestCase {
$this->assertSame( [], $lang->getGrammarTransformations() );
$this->assertSame( [], $lang->getGrammarTransformations() );
}
/**
* @covers ::ucwords
* @dataProvider provideUcwords
*/
public function testUcwords( string $input, string $expected ) {
$lang = $this->getObj();
$this->assertSame( $expected, $lang->ucwords( $input ) );
}
public function provideUcwords() {
return [
'Empty string' => [ '', '' ],
'Non-alpha only' => [ '3212-353', '3212-353' ],
'Non-alpha only, multiple words' => [ '@%#, #@$%!', '@%#, #@$%!' ],
'Single ASCII word' => [ 'teSt', 'Test' ],
'ASCII words' => [ 'TeSt 123 test foo-bar', 'Test 123 Test Foo-bar' ],
'Single multibyte word' => [ 'теСт', 'Тест' ],
'Multibyte words' => [ 'ТесТ 123, тест 测试 test раз-два', 'Тест 123, Тест 测试 Test Раз-два' ],
];
}
/**
* @covers ::ucwordbreaks
* @dataProvider provideUcwordbreaks
*/
public function testUcwordbreaks( string $input, string $expected ) {
$lang = $this->getObj();
$this->assertSame( $expected, $lang->ucwordbreaks( $input ) );
}
public function provideUcwordbreaks() {
return [
'Empty string' => [ '', '' ],
'Non-alpha only' => [ '3212-353', '3212-353' ],
'Non-alpha only, multiple words' => [ '@%#, #@$%!', '@%#, #@$%!' ],
'Single ASCII word' => [ 'teSt', 'TeSt' ],
'Single ASCII word, prefixed' => [ '-teSt', '-TeSt' ],
'ASCII words' => [ 'TeSt 123 test foo-bar', 'TeSt 123 Test Foo-Bar' ],
'Single multibyte word' => [ 'теСт', 'Тест' ],
'Single multibyte word, prefixed' => [ '-теСт', '-Тест' ],
'Multibyte words' => [ 'ТесТ 123, тест 测试 test раз-два', 'Тест 123, Тест 测试 Test Раз-Два' ],
];
}
}