File: LanguageTest.php

package info (click to toggle)
mediawiki 1%3A1.35.13-1%2Bdeb11u2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 274,932 kB
  • sloc: php: 677,563; javascript: 572,709; sql: 11,565; python: 4,447; xml: 3,145; sh: 892; perl: 788; ruby: 496; pascal: 365; makefile: 128
file content (120 lines) | stat: -rw-r--r-- 3,740 bytes parent folder | download
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
<?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'
	 */
	private function getObj( array $options = [] ) {
		return new Language(
			$options['code'] ?? 'en',
			$this->createNoOpMock( LocalisationCache::class ),
			$this->createNoOpMock( LanguageNameUtils::class ),
			$this->createNoOpMock( LanguageFallback::class ),
			$this->createNoOpMock( LanguageConverterFactory::class ),
			$this->createHookContainer()

		);
	}

	/**
	 * @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' => [ '위키백과', 'ㅇ' ],
		];
	}
}