aboutsummaryrefslogtreecommitdiffstats
path: root/tests/phpunit/includes/language/converters/CrhConverterTest.php
blob: ba1fe481959453b7f25189ab2703275e4a140e87 (plain) (blame)
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
<?php

/**
 * @group Language
 * @covers \CrhConverter
 * @covers \MediaWiki\Languages\Data\CrhExceptions
 */
class CrhConverterTest extends MediaWikiIntegrationTestCase {

	use LanguageConverterTestTrait;

	/**
	 * @dataProvider provideAutoConvertToAllVariantsByWord
	 *
	 * Test individual words and test minimal contextual transforms
	 * by creating test strings "<cyrillic> <latin>" and
	 * "<latin> <cyrillic>" and then converting to all variants.
	 */
	public function testAutoConvertToAllVariantsByWord( $cyrl, $lat ) {
		$value = $lat;
		$result = [
			'crh'      => $value,
			'crh-cyrl' => $cyrl,
			'crh-latn' => $lat,
			];
		$this->assertEquals( $result, $this->getLanguageConverter()->autoConvertToAllVariants( $value ) );

		$value = $cyrl;
		$result = [
			'crh'      => $value,
			'crh-cyrl' => $cyrl,
			'crh-latn' => $lat,
			];
		$this->assertEquals( $result, $this->getLanguageConverter()->autoConvertToAllVariants( $value ) );

		$value = $cyrl . ' ' . $lat;
		$result = [
			'crh'      => $value,
			'crh-cyrl' => $cyrl . ' ' . $cyrl,
			'crh-latn' => $lat . ' ' . $lat,
			];
		$this->assertEquals( $result, $this->getLanguageConverter()->autoConvertToAllVariants( $value ) );

		$value = $lat . ' ' . $cyrl;
		$result = [
			'crh'      => $value,
			'crh-cyrl' => $cyrl . ' ' . $cyrl,
			'crh-latn' => $lat . ' ' . $lat,
			];
		$this->assertEquals( $result, $this->getLanguageConverter()->autoConvertToAllVariants( $value ) );
	}

	public static function provideAutoConvertToAllVariantsByWord() {
		return [
			// general words, covering more of the alphabet
			[ 'рузгярнынъ', 'ruzgârnıñ' ], [ 'Париж', 'Parij' ], [ 'чёкюч', 'çöküç' ],
			[ 'элифбени', 'elifbeni' ], [ 'полициясы', 'politsiyası' ], [ 'хусусында', 'hususında' ],
			[ 'акъшамларны', 'aqşamlarnı' ], [ 'опькеленюв', 'öpkelenüv' ],
			[ 'кулюмсиреди', 'külümsiredi' ], [ 'айтмайджагъым', 'aytmaycağım' ],
			[ 'козьяшсыз', 'közyaşsız' ],

			// exception words
			[ 'инструменталь', 'instrumental' ], [ 'гургуль', 'gürgül' ], [ 'тюшюнмемек', 'tüşünmemek' ],

			// specific problem words
			[ 'куню', 'künü' ], [ 'сюргюнлиги', 'sürgünligi' ], [ 'озю', 'özü' ], [ 'этти', 'etti' ],
			[ 'эсас', 'esas' ], [ 'дёрт', 'dört' ], [ 'кельди', 'keldi' ], [ 'км²', 'km²' ],
			[ 'юзь', 'yüz' ], [ 'АКъШ', 'AQŞ' ], [ 'ШСДжБнен', 'ŞSCBnen' ], [ 'июль', 'iyül' ],
			[ 'ишгъаль', 'işğal' ], [ 'ишгъальджилерине', 'işğalcilerine' ], [ 'район', 'rayon' ],
			[ 'районынынъ', 'rayonınıñ' ], [ 'Ногъай', 'Noğay' ], [ 'Юрьтю', 'Yürtü' ],
			[ 'ватандан', 'vatandan' ], [ 'ком-кок', 'köm-kök' ], [ 'АКЪКЪЫ', 'AQQI' ],
			[ 'ДАГЪГЪА', 'DAĞĞA' ], [ '13-юнджи', '13-ünci' ], [ 'ДЖУРЬМЕК', 'CÜRMEK' ],
			[ 'джумлеси', 'cümlesi' ], [ 'ильи', 'ilyi' ], [ 'Ильи', 'İlyi' ], [ 'бруцел', 'brutsel' ],
			[ 'коцюб', 'kotsüb' ], [ 'плацен', 'platsen' ], [ 'эпицентр', 'epitsentr' ],

			// -tsin- words
			[ 'кетсин', 'ketsin' ], [ 'кирлетсин', 'kirletsin' ], [ 'этсин', 'etsin' ],
			[ 'етсин', 'yetsin' ], [ 'этсинлерми', 'etsinlermi' ], [ 'принцини', 'printsini' ],
			[ 'медицина', 'meditsina' ], [ 'Щетсин', 'Şçetsin' ], [ 'Щекоцины', 'Şçekotsinı' ],

			// regex pattern words
			[ 'коюнден', 'köyünden' ], [ 'аньге', 'ange' ],

			// multi part words
			[ 'эки юз', 'eki yüz' ],

			// affix patterns
			[ 'койнинъ', 'köyniñ' ], [ 'Авджыкойде', 'Avcıköyde' ], [ 'экваториаль', 'ekvatorial' ],
			[ 'Джанкой', 'Canköy' ], [ 'усть', 'üst' ], [ 'роль', 'rol' ], [ 'буюк', 'büyük' ],
			[ 'джонк', 'cönk' ],

			// Roman numerals vs Initials, part 1 - Roman numeral initials without spaces
			[ 'А.Б.Дж.Д.М. Къадырова XII', 'A.B.C.D.M. Qadırova XII' ],
			// Roman numerals vs Initials, part 2 - Roman numeral initials with spaces
			[ 'Г. Х. Ы. В. X. Л. Меметов III', 'G. H. I. V. X. L. Memetov III' ],

			// ALL CAPS, made up acronyms
			[ 'НЪАБ', 'ÑAB' ], [ 'КЪЫДЖ', 'QIC' ], [ 'ГЪУК', 'ĞUK' ], [ 'ДЖОТ', 'COT' ], [ 'ДЖА', 'CA' ],
		];
	}

	/**
	 * @dataProvider provideAutoConvertToAllVariantsByString
	 *
	 * Run tests that require some context (like Roman numerals) or with
	 * many-to-one mappings, or other asymmetric results (like smart quotes)
	 */
	public function testAutoConvertToAllVariantsByString( $result, $value ) {
		$this->assertEquals( $result, $this->getLanguageConverter()->autoConvertToAllVariants( $value ) );
	}

	public static function provideAutoConvertToAllVariantsByString() {
		return [
			[ // Roman numerals and quotes, esp. single-letter Roman numerals at the end of a string
				[
					'crh'      => 'VI,VII IX “dört” «дёрт» XI XII I V X L C D M',
					'crh-cyrl' => 'VI,VII IX «дёрт» «дёрт» XI XII I V X L C D M',
					'crh-latn' => 'VI,VII IX “dört” "dört" XI XII I V X L C D M',
				],
				'VI,VII IX “dört” «дёрт» XI XII I V X L C D M'
			],
			[ // Many-to-one mappings: many Cyrillic to one Latin
				[
					'crh'      => 'шофер шофёр şoför корбекул корьбекул корьбекуль körbekül',
					'crh-cyrl' => 'шофер шофёр шофёр корбекул корьбекул корьбекуль корьбекуль',
					'crh-latn' => 'şoför şoför şoför körbekül körbekül körbekül körbekül',
				],
				'шофер шофёр şoför корбекул корьбекул корьбекуль körbekül'
			],
			[ // Many-to-one mappings: many Latin to one Cyrillic
				[
					'crh'      => 'fevqülade fevqulade февкъульаде beyude beyüde бейуде',
					'crh-cyrl' => 'февкъульаде февкъульаде февкъульаде бейуде бейуде бейуде',
					'crh-latn' => 'fevqülade fevqulade fevqulade beyude beyüde beyüde',
				],
				'fevqülade fevqulade февкъульаде beyude beyüde бейуде'
			],
		];
	}
}