wiki.techinc.nl/tests/phpunit/unit/includes/language/LanguageTest.php
C. Scott Ananian d87ea27fb3 Implement Bcp47Code in Language class
This implements Language::toBcp47Code(), an interface defined in the
wikimedia/bcp-47-code library, in order to facilitate interacting with
the parsoid library (which shouldn't know anything about
mediawiki-internal language codes).

Change-Id: Id09218ae97fd8167866064c0a3f6142696d66a8d
2023-01-27 22:56:11 -05:00

153 lines
4.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use MediaWiki\Languages\LanguageConverterFactory;
use MediaWiki\Languages\LanguageFallback;
use MediaWiki\Languages\LanguageNameUtils;
/**
* @coversDefaultClass Language
*/
class LanguageTest extends MediaWikiUnitTestCase {
/**
* @param array $options Valid keys:
* 'code'
* 'grammarTransformCache'
* @return Language
*/
private function getObj( array $options = [] ) {
return new Language(
$options['code'] ?? 'en',
$this->createNoOpMock( NamespaceInfo::class ),
$this->createNoOpMock( LocalisationCache::class ),
$this->createNoOpMock( LanguageNameUtils::class ),
$this->createNoOpMock( LanguageFallback::class ),
$this->createNoOpMock( LanguageConverterFactory::class ),
$this->createHookContainer(),
new HashConfig( [] )
);
}
/**
* @covers ::getCode
* @dataProvider provideCodes
*/
public function testGetCode( $code, $bcp47code ) {
$lang = $this->getObj( [ 'code' => $code ] );
$this->assertSame( $code, $lang->getCode() );
}
/**
* @covers ::getHtmlCode
* @dataProvider provideCodes
*/
public function testGetHtmlCode( $code, $bcp47code ) {
$lang = $this->getObj( [ 'code' => $code ] );
$this->assertSame( $bcp47code, $lang->getHtmlCode() );
}
/**
* @covers ::toBcp47Code
* @dataProvider provideCodes
*/
public function testToBcp47Code( $code, $bcp47code ) {
$lang = $this->getObj( [ 'code' => $code ] );
$this->assertSame( $bcp47code, $lang->toBcp47Code() );
}
public function provideCodes() {
return LanguageCodeTest::provideLanguageCodes();
}
/**
* @covers ::getGrammarTransformations
* @todo Test the exception case
*/
public function testGetGrammarTransformations() {
global $IP;
// XXX Inject a value here instead of reading the filesystem (T231159)
$expected = FormatJson::decode(
file_get_contents( "$IP/languages/data/grammarTransformations/he.json" ), true );
$lang = $this->getObj( [ 'code' => 'he' ] );
$this->assertSame( $expected, $lang->getGrammarTransformations() );
$this->assertSame( $expected, $lang->getGrammarTransformations() );
}
/**
* @covers ::getGrammarTransformations
*/
public function testGetGrammarTransformations_empty() {
$lang = $this->getObj();
$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 Раз-Два' ],
];
}
/**
* @covers ::firstChar
* @dataProvider provideFirstChar
*/
public function testFirstChar( string $input, string $expected ) {
$lang = $this->getObj();
$this->assertSame( $expected, $lang->firstChar( $input ) );
}
public function provideFirstChar() {
return [
'Empty string' => [ '', '' ],
'Single Latin' => [ 'T', 'T' ],
'Latin' => [ 'TEST', 'T' ],
'Digit' => [ '123', '1' ],
'Russian' => [ 'Ёпт', 'Ё' ],
'Emoji' => [ '😂💀☢️', '😂' ],
// Korean is special-cased to remove single letters from syllables
'Korean' => [ '위키백과', 'ㅇ' ],
];
}
}