1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
<?php
use MediaWiki\Config\HashConfig;
use MediaWiki\Json\FormatJson;
use MediaWiki\Languages\LanguageConverterFactory;
use MediaWiki\Languages\LanguageFallback;
use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\Title\NamespaceInfo;
use Wikimedia\Bcp47Code\Bcp47CodeValue;
/**
* @group Language
* @covers \MediaWiki\Language\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( [] )
);
}
/**
* @dataProvider provideCodes
*/
public function testGetCode( $code, $bcp47code ) {
$lang = $this->getObj( [ 'code' => $code ] );
$this->assertSame( $code, $lang->getCode() );
}
/**
* @dataProvider provideCodes
*/
public function testGetHtmlCode( $code, $bcp47code ) {
$lang = $this->getObj( [ 'code' => $code ] );
$this->assertSame( $bcp47code, $lang->getHtmlCode() );
}
/**
* @dataProvider provideCodes
*/
public function testToBcp47Code( $code, $bcp47code ) {
$lang = $this->getObj( [ 'code' => $code ] );
$this->assertSame( $bcp47code, $lang->toBcp47Code() );
}
/**
* @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
}
/**
* @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();
}
/**
* @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() );
}
public function testGetGrammarTransformations_empty() {
$lang = $this->getObj();
$this->assertSame( [], $lang->getGrammarTransformations() );
$this->assertSame( [], $lang->getGrammarTransformations() );
}
/**
* @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 Раз-два' ],
];
}
/**
* @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 Раз-Два' ],
];
}
/**
* @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' => [ '위키백과', 'ㅇ' ],
];
}
}
|