summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/tests/phpunit/MediaWikiMessageCheckerTest.php
blob: 11a4a11d464eaa41762aa0f206ef363779f53fa7 (plain)
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
<?php
/**
 * @file
 * @author Niklas Laxström
 * @copyright Copyright © 2012-2013, Niklas Laxström
 * @license GPL-2.0-or-later
 */

class MediaWikiMessageCheckerTest extends MediaWikiTestCase {

	/**
	 * @dataProvider getPluralFormCountProvider
	 */
	public function testGetPluralFormCount( $expected, $code, $comment ) {
		$provided = MediaWikiMessageChecker::getPluralFormCount( $code );
		$this->assertEquals( $expected, $provided, $comment );
	}

	public function getPluralFormCountProvider() {
		return [
			[ 2, 'en', 'English has two plural forms' ],
			[ 3, 'ro', 'Romanian has three plural forms' ],
			[ 5, 'br', 'Breton has five plural forms' ],
		];
	}

	/**
	 * @dataProvider getPluralFormsProvider
	 */
	public function testGetPluralForms( $expected, $string, $comment ) {
		$provided = MediaWikiMessageChecker::getPluralForms( $string );
		$this->assertSame( $expected, $provided, $comment );
	}

	public function getPluralFormsProvider() {
		return [
			[
				[ [ '1', '2' ] ],
				'a{{PLURAL:#|1|2}}b',
				'one plural magic word is parsed correctly'
			],

			[
				[ [ '1', '2' ], [ '3', '4' ] ],
				'{{PLURAL:#|1|2}}{{PLURAL:#|3|4}}',
				'two plural magic words are parsed correctly'
			],

			[
				[ [ '1', '2{{}}3' ] ],
				'a{{PLURAL:#|1|2{{}}3}}',
				'one plural magic word with curlies inside is parsed correctly'
			],

			[
				[ [ '0=0', '1=one', '1', '2' ] ],
				'a{{PLURAL:#|0=0|1=one|1|2}}',
				'one plural magic word with explicit forms is parsed correctly'
			],
			[
				[],
				'a{{PLURAL:#|0=0|1=one|1|2}',
				'unclosed plural tag is ignored'
			],
			[
				[ [ '1=foo', '{{GENDER:#|he}}' ] ],
				'a{{PLURAL:#|1=foo|{{GENDER:#|he}}}}',
				'pipes in subtemplates are ignored'
			],
			[
				[ [ '[[Special:A|письмо]]', '[[Special:A|писем]]', '[[Special:A|письма]]' ] ],
				'{{PLURAL:#|[[Special:A|письмо]]|[[Special:A|писем]]|[[Special:A|письма]]}}',
				'pipes in links are ignored'
			],
			[
				[
					[ 'a', 'b' ],
					[ 'c', 'd' ],
					[ '{{PLURAL:#|a|b}}', '{{PLURAL:#|c|d}}' ],
					],
				'{{PLURAL:#|{{PLURAL:#|a|b}}|{{PLURAL:#|c|d}}}}',
				'nested plurals are handled correctly'
			]
		];
	}

	/**
	 * @dataProvider removeExplicitPluralFormsProvider
	 */
	public function testRemoveExplicitPluralForms( $expected, $forms, $comment ) {
		$provided = MediaWikiMessageChecker::removeExplicitPluralForms( $forms );
		$this->assertEquals( $expected, $provided, $comment );
	}

	public function removeExplicitPluralFormsProvider() {
		return [
			[
				[ '1', '2' ],
				[ '1', '2' ],
				'default forms are not removed',
			],

			[
				[ '1', '2' ],
				[ '0=0', '1', '0=0', '2', '1=one' ],
				'explicit forms are removed regardless of position',
			],

			[
				[ '1', '2' ],
				[ '1', '2', '500=lots' ],
				'works for any number',
			],
		];
	}
}