wiki.techinc.nl/tests/phpunit/unit/includes/language/LanguageTest.php
C. Scott Ananian e01e41bdea Implement Language::isSameCodeAs()
This implements the additional Bcp47Code interface method required by
wikimedia/bcp-47-code 2.0.0.

Bug: T331887
Change-Id: If3abc8a55eda8879ca904b25e9e3e5d40c1b0bab
2023-10-04 12:29:57 -04:00

191 lines
5.9 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\Config\HashConfig;
use MediaWiki\Languages\LanguageConverterFactory;
use MediaWiki\Languages\LanguageFallback;
use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\Title\NamespaceInfo;
use Wikimedia\Bcp47Code\Bcp47CodeValue;
/**
* @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() );
}
/**
* @covers ::isSameCodeAs
* @dataProvider provideCodes
*/
public function testIsSameCodeAs( $code, $bcp47code ) {
// Commented out symmetric tests below can be enabled once
// we require wikimedia/bcp47-code ^2.0.0
$code1 = $this->getObj( [ 'code' => $code ] );
$code2 = new Bcp47CodeValue( $bcp47code );
$this->assertTrue( $code1->isSameCodeAs( $code2 ) );
// $this->assertTrue( $code2->isSameCodeAs( $code1 ) ); // ^2.0.0
// Should be case-insensitive.
$code2 = new Bcp47CodeValue( strtoupper( $bcp47code ) );
$this->assertTrue( $code1->isSameCodeAs( $code2 ) );
// $this->assertTrue( $code2->isSameCodeAs( $code1 ) ); // ^2.0.0
$code2 = new Bcp47CodeValue( strtolower( $bcp47code ) );
$this->assertTrue( $code1->isSameCodeAs( $code2 ) );
// $this->assertTrue( $code2->isSameCodeAs( $code1 ) ); // ^2.0.0
}
/**
* @covers ::isSameCodeAs
* @dataProvider provideCodes
*/
public function testIsNotSameCodeAs( $code, $bcp47code ) {
// Commented out symmetric tests below can be enabled once
// we require wikimedia/bcp47-code ^2.0.0
$code1 = $this->getObj( [ 'code' => $code ] );
$code2 = new Bcp47CodeValue( 'x-not-the-same-code' );
$this->assertFalse( $code1->isSameCodeAs( $code2 ) );
// $this->assertFalse( $code2->isSameCodeAs( $code1 ) ); // ^2.0.0
}
public static 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 static 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 static 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 static 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' => [ '위키백과', 'ㅇ' ],
];
}
}