Make Language::formatTimePeriod() more flexible so it can produce stuff like '3 hours...
[lhc/web/wiklou.git] / tests / phpunit / languages / LanguageTest.php
1 <?php
2
3 class LanguageTest extends MediaWikiTestCase {
4 private $lang;
5
6 function setUp() {
7 $this->lang = Language::factory( 'en' );
8 }
9 function tearDown() {
10 unset( $this->lang );
11 }
12
13 function testLanguageConvertDoubleWidthToSingleWidth() {
14 $this->assertEquals(
15 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
16 $this->lang->normalizeForSearch(
17 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
18 ),
19 'convertDoubleWidth() with the full alphabet and digits'
20 );
21 }
22
23 /** @dataProvider provideFormattableTimes */
24 function testFormatTimePeriod( $seconds, $avoid, $noAbbrevs, $expected, $desc ) {
25 $this->assertEquals( $expected, $this->lang->formatTimePeriod( $seconds, $avoid, $noAbbrevs ), $desc );
26 }
27
28 function provideFormattableTimes() {
29 return array(
30 array( 9.45, false, false, '9.5s', 'formatTimePeriod() rounding (<10s)' ),
31 array( 9.45, false, 'noabbrevs', '9.5 seconds', 'formatTimePeriod() rounding (<10s)' ),
32 array( 9.95, false, false, '10s', 'formatTimePeriod() rounding (<10s)' ),
33 array( 9.95, false, 'noabbrevs', '10 seconds', 'formatTimePeriod() rounding (<10s)' ),
34 array( 59.55, false, false, '1m 0s', 'formatTimePeriod() rounding (<60s)' ),
35 array( 59.55, false, 'noabbrevs', '1 minute 0 seconds', 'formatTimePeriod() rounding (<60s)' ),
36 array( 119.55, false, false, '2m 0s', 'formatTimePeriod() rounding (<1h)' ),
37 array( 119.55, false, 'noabbrevs', '2 minutes 0 seconds', 'formatTimePeriod() rounding (<1h)' ),
38 array( 3599.55, false, false, '1h 0m 0s', 'formatTimePeriod() rounding (<1h)' ),
39 array( 3599.55, false, 'noabbrevs', '1 hour 0 minutes 0 seconds', 'formatTimePeriod() rounding (<1h)' ),
40 array( 7199.55, false, false, '2h 0m 0s', 'formatTimePeriod() rounding (>=1h)' ),
41 array( 7199.55, false, 'noabbrevs', '2 hours 0 minutes 0 seconds', 'formatTimePeriod() rounding (>=1h)' ),
42 array( 7199.55, 'avoidseconds', false, '2h 0m', 'formatTimePeriod() rounding (>=1h), avoidseconds' ),
43 array( 7199.55, 'avoidseconds', 'noabbrevs', '2 hours 0 minutes', 'formatTimePeriod() rounding (>=1h), avoidseconds' ),
44 array( 7199.55, 'avoidminutes', false, '2h 0m', 'formatTimePeriod() rounding (>=1h), avoidminutes' ),
45 array( 7199.55, 'avoidminutes', 'noabbrevs', '2 hours 0 minutes', 'formatTimePeriod() rounding (>=1h), avoidminutes' ),
46 array( 172799.55, 'avoidseconds', false, '48h 0m', 'formatTimePeriod() rounding (=48h), avoidseconds' ),
47 array( 172799.55, 'avoidseconds', 'noabbrevs', '48 hours 0 minutes', 'formatTimePeriod() rounding (=48h), avoidseconds' ),
48 array( 259199.55, 'avoidminutes', false, '3d 0h', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
49 array( 259199.55, 'avoidminutes', 'noabbrevs', '3 days 0 hours', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
50 array( 176399.55, 'avoidseconds', false, '2d 1h 0m', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
51 array( 176399.55, 'avoidseconds', 'noabbrevs', '2 days 1 hour 0 minutes', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
52 array( 176399.55, 'avoidminutes', false, '2d 1h', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
53 array( 176399.55, 'avoidminutes', 'noabbrevs', '2 days 1 hour', 'formatTimePeriod() rounding (>48h), avoidminutes' ),
54 array( 259199.55, 'avoidseconds', false, '3d 0h 0m', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
55 array( 259199.55, 'avoidseconds', 'noabbrevs', '3 days 0 hours 0 minutes', 'formatTimePeriod() rounding (>48h), avoidseconds' ),
56 array( 172801.55, 'avoidseconds', false, '2d 0h 0m', 'formatTimePeriod() rounding, (>48h), avoidseconds' ),
57 array( 172801.55, 'avoidseconds', 'noabbrevs', '2 days 0 hours 0 minutes', 'formatTimePeriod() rounding, (>48h), avoidseconds' ),
58 array( 176460.55, false, false, '2d 1h 1m 1s', 'formatTimePeriod() rounding, recursion, (>48h)' ),
59 array( 176460.55, false, 'noabbrevs', '2 days 1 hour 1 minute 1 second', 'formatTimePeriod() rounding, recursion, (>48h)' ),
60 );
61
62 }
63
64 function testTruncate() {
65 $this->assertEquals(
66 "XXX",
67 $this->lang->truncate( "1234567890", 0, 'XXX' ),
68 'truncate prefix, len 0, small ellipsis'
69 );
70
71 $this->assertEquals(
72 "12345XXX",
73 $this->lang->truncate( "1234567890", 8, 'XXX' ),
74 'truncate prefix, small ellipsis'
75 );
76
77 $this->assertEquals(
78 "123456789",
79 $this->lang->truncate( "123456789", 5, 'XXXXXXXXXXXXXXX' ),
80 'truncate prefix, large ellipsis'
81 );
82
83 $this->assertEquals(
84 "XXX67890",
85 $this->lang->truncate( "1234567890", -8, 'XXX' ),
86 'truncate suffix, small ellipsis'
87 );
88
89 $this->assertEquals(
90 "123456789",
91 $this->lang->truncate( "123456789", -5, 'XXXXXXXXXXXXXXX' ),
92 'truncate suffix, large ellipsis'
93 );
94 }
95
96 /**
97 * @dataProvider provideHTMLTruncateData()
98 */
99 function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
100 // Actual HTML...
101 $this->assertEquals(
102 $expected,
103 $this->lang->truncateHTML( $input, $len, $ellipsis )
104 );
105 }
106
107 /**
108 * Array format is ($len, $ellipsis, $input, $expected)
109 */
110 function provideHTMLTruncateData() {
111 return array(
112 array( 0, 'XXX', "1234567890", "XXX" ),
113 array( 8, 'XXX', "1234567890", "12345XXX" ),
114 array( 5, 'XXXXXXXXXXXXXXX', '1234567890', "1234567890" ),
115 array( 2, '***',
116 '<p><span style="font-weight:bold;"></span></p>',
117 '<p><span style="font-weight:bold;"></span></p>',
118 ),
119 array( 2, '***',
120 '<p><span style="font-weight:bold;">123456789</span></p>',
121 '<p><span style="font-weight:bold;">***</span></p>',
122 ),
123 array( 2, '***',
124 '<p><span style="font-weight:bold;">&nbsp;23456789</span></p>',
125 '<p><span style="font-weight:bold;">***</span></p>',
126 ),
127 array( 3, '***',
128 '<p><span style="font-weight:bold;">123456789</span></p>',
129 '<p><span style="font-weight:bold;">***</span></p>',
130 ),
131 array( 4, '***',
132 '<p><span style="font-weight:bold;">123456789</span></p>',
133 '<p><span style="font-weight:bold;">1***</span></p>',
134 ),
135 array( 5, '***',
136 '<tt><span style="font-weight:bold;">123456789</span></tt>',
137 '<tt><span style="font-weight:bold;">12***</span></tt>',
138 ),
139 array( 6, '***',
140 '<p><a href="www.mediawiki.org">123456789</a></p>',
141 '<p><a href="www.mediawiki.org">123***</a></p>',
142 ),
143 array( 6, '***',
144 '<p><a href="www.mediawiki.org">12&nbsp;456789</a></p>',
145 '<p><a href="www.mediawiki.org">12&nbsp;***</a></p>',
146 ),
147 array( 7, '***',
148 '<small><span style="font-weight:bold;">123<p id="#moo">456</p>789</span></small>',
149 '<small><span style="font-weight:bold;">123<p id="#moo">4***</p></span></small>',
150 ),
151 array( 8, '***',
152 '<div><span style="font-weight:bold;">123<span>4</span>56789</span></div>',
153 '<div><span style="font-weight:bold;">123<span>4</span>5***</span></div>',
154 ),
155 array( 9, '***',
156 '<p><table style="font-weight:bold;"><tr><td>123456789</td></tr></table></p>',
157 '<p><table style="font-weight:bold;"><tr><td>123456789</td></tr></table></p>',
158 ),
159 array( 10, '***',
160 '<p><font style="font-weight:bold;">123456789</font></p>',
161 '<p><font style="font-weight:bold;">123456789</font></p>',
162 ),
163 );
164 }
165
166 /**
167 * Test Language::isValidBuiltInCode()
168 * @dataProvider provideLanguageCodes
169 */
170 function testBuiltInCodeValidation( $code, $message = '' ) {
171 $this->assertTrue(
172 (bool) Language::isValidBuiltInCode( $code ),
173 "validating code $code $message"
174 );
175 }
176
177 function testBuiltInCodeValidationRejectUnderscore() {
178 $this->assertFalse(
179 (bool) Language::isValidBuiltInCode( 'be_tarask' ),
180 "reject underscore in language code"
181 );
182 }
183
184 function provideLanguageCodes() {
185 return array(
186 array( 'fr' , 'Two letters, minor case' ),
187 array( 'EN' , 'Two letters, upper case' ),
188 array( 'tyv' , 'Three letters' ),
189 array( 'tokipona' , 'long language code' ),
190 array( 'be-tarask', 'With dash' ),
191 array( 'Zh-classical', 'Begin with upper case, dash' ),
192 array( 'Be-x-old', 'With extension (two dashes)' ),
193 );
194 }
195 }