2 /** tests for includes/Html.php */
4 class HtmlTest
extends MediaWikiTestCase
{
5 private static $oldLang;
6 private static $oldContLang;
7 private static $oldLanguageCode;
8 private static $oldNamespaces;
9 private static $oldHTML5;
11 public function setUp() {
12 global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
15 self
::$oldLang = $wgLang;
16 self
::$oldContLang = $wgContLang;
17 self
::$oldNamespaces = $wgContLang->getNamespaces();
18 self
::$oldLanguageCode = $wgLanguageCode;
19 self
::$oldHTML5 = $wgHTML5;
21 $wgLanguageCode = 'en';
22 $wgContLang = $wgLang = Language
::factory( $wgLanguageCode );
24 // Hardcode namespaces during test runs,
25 // so that html output based on existing namespaces
26 // can be properly evaluated.
27 $wgContLang->setNamespaces( array(
39 9 => 'MediaWiki_talk',
41 11 => 'Template_talk',
43 15 => 'Category_talk',
49 public function tearDown() {
50 global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
53 $wgContLang->setNamespaces( self
::$oldNamespaces );
54 $wgLang = self
::$oldLang;
55 $wgContLang = self
::$oldContLang;
56 $wgLanguageCode = self
::$oldLanguageCode;
57 $wgHTML5 = self
::$oldHTML5;
61 * Wrapper to easily set $wgHTML5 = true.
62 * Original value will be restored after test completion.
63 * @todo Move to MediaWikiTestCase
65 public function enableHTML5() {
70 * Wrapper to easily set $wgHTML5 = false
71 * Original value will be restored after test completion.
72 * @todo Move to MediaWikiTestCase
74 public function disableHTML5() {
79 public function testExpandAttributesSkipsNullAndFalse() {
83 Html
::expandAttributes( array( 'foo' => null ) ),
84 'skip keys with null value'
87 Html
::expandAttributes( array( 'foo' => false ) ),
88 'skip keys with false value'
90 $this->AssertNotEmpty(
91 Html
::expandAttributes( array( 'foo' => '' ) ),
92 'keep keys with an empty string'
96 public function testExpandAttributesForBooleans() {
100 Html
::expandAttributes( array( 'selected' => false ) ),
101 'Boolean attributes do not generates output when value is false'
105 Html
::expandAttributes( array( 'selected' => null ) ),
106 'Boolean attributes do not generates output when value is null'
110 $wgHtml5 ?
' selected=""' : ' selected="selected"',
111 Html
::expandAttributes( array( 'selected' => true ) ),
112 'Boolean attributes skip value output'
115 $wgHtml5 ?
' selected=""' : ' selected="selected"',
116 Html
::expandAttributes( array( 'selected' ) ),
117 'Boolean attributes (ex: selected) do not need a value'
122 * Test for Html::expandAttributes()
123 * Please note it output a string prefixed with a space!
125 public function testExpandAttributesVariousExpansions() {
129 Html
::expandAttributes( array( 'empty_string' => '' ) ),
130 'Value with an empty string'
134 Html
::expandAttributes( array( 'key' => 'value' ) ),
139 Html
::expandAttributes( array( 'one' => 1 ) ),
140 'Value is a numeric one'
144 Html
::expandAttributes( array( 'zero' => 0 ) ),
145 'Value is a numeric zero'
150 * Html::expandAttributes has special features for HTML
151 * attributes that use space separated lists and also
152 * allows arrays to be used as values.
154 public function testExpandAttributesListValueAttributes() {
157 ' class="redundant spaces here"',
158 Html
::expandAttributes( array( 'class' => ' redundant spaces here ' ) ),
159 'Normalization should strip redundant spaces'
163 Html
::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
164 'Normalization should remove duplicates in string-lists'
166 ### "EMPTY" ARRAY VALUES
169 Html
::expandAttributes( array( 'class' => array() ) ),
170 'Value with an empty array'
174 Html
::expandAttributes( array( 'class' => array( null, '', ' ', ' ' ) ) ),
175 'Array with null, empty string and spaces'
177 ### NON-EMPTY ARRAY VALUES
180 Html
::expandAttributes( array( 'class' => array(
187 'Normalization should remove duplicates in the array'
191 Html
::expandAttributes( array( 'class' => array(
197 'Normalization should remove duplicates in string-lists in the array'
202 * Test feature added by r96188, let pass attributes values as
203 * a PHP array. Restricted to class,rel, accesskey.
205 function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
207 ' class="booltrue one"',
208 Html
::expandAttributes( array( 'class' => array(
212 # Method use isset() internally, make sure we do discard
213 # attributes values which have been assigned well known values
215 'boolfalse' => false,
223 * How do we handle duplicate keys in HTML attributes expansion?
224 * We could pass a "class" the values: 'GREEN' and array( 'GREEN' => false )
225 * The later will take precedence.
227 * Feature added by r96188
229 function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
232 Html
::expandAttributes( array( 'class' => array(
240 function testNamespaceSelector() {
243 '<option value="0">(Main)</option>' . "\n" .
244 '<option value="1">Talk</option>' . "\n" .
245 '<option value="2">User</option>' . "\n" .
246 '<option value="3">User talk</option>' . "\n" .
247 '<option value="4">MyWiki</option>' . "\n" .
248 '<option value="5">MyWiki Talk</option>' . "\n" .
249 '<option value="6">File</option>' . "\n" .
250 '<option value="7">File talk</option>' . "\n" .
251 '<option value="8">MediaWiki</option>' . "\n" .
252 '<option value="9">MediaWiki talk</option>' . "\n" .
253 '<option value="10">Template</option>' . "\n" .
254 '<option value="11">Template talk</option>' . "\n" .
255 '<option value="14">Category</option>' . "\n" .
256 '<option value="15">Category talk</option>' . "\n" .
257 '<option value="100">Custom</option>' . "\n" .
258 '<option value="101">Custom talk</option>' . "\n" .
260 Html
::namespaceSelector(),
261 'Basic namespace selector without custom options'
265 '<label for="mw-test-namespace">Select a namespace:</label> ' .
266 '<select id="mw-test-namespace" name="wpNamespace">' . "\n" .
267 '<option value="all">all</option>' . "\n" .
268 '<option value="0">(Main)</option>' . "\n" .
269 '<option value="1">Talk</option>' . "\n" .
270 '<option value="2" selected="">User</option>' . "\n" .
271 '<option value="3">User talk</option>' . "\n" .
272 '<option value="4">MyWiki</option>' . "\n" .
273 '<option value="5">MyWiki Talk</option>' . "\n" .
274 '<option value="6">File</option>' . "\n" .
275 '<option value="7">File talk</option>' . "\n" .
276 '<option value="8">MediaWiki</option>' . "\n" .
277 '<option value="9">MediaWiki talk</option>' . "\n" .
278 '<option value="10">Template</option>' . "\n" .
279 '<option value="11">Template talk</option>' . "\n" .
280 '<option value="14">Category</option>' . "\n" .
281 '<option value="15">Category talk</option>' . "\n" .
282 '<option value="100">Custom</option>' . "\n" .
283 '<option value="101">Custom talk</option>' . "\n" .
285 Html
::namespaceSelector(
286 array( 'selected' => '2', 'all' => 'all', 'label' => 'Select a namespace:' ),
287 array( 'name' => 'wpNamespace', 'id' => 'mw-test-namespace' )
289 'Basic namespace selector with custom values'
293 '<label>Select a namespace:</label> ' .
295 '<option value="0">(Main)</option>' . "\n" .
296 '<option value="1">Talk</option>' . "\n" .
297 '<option value="2">User</option>' . "\n" .
298 '<option value="3">User talk</option>' . "\n" .
299 '<option value="4">MyWiki</option>' . "\n" .
300 '<option value="5">MyWiki Talk</option>' . "\n" .
301 '<option value="6">File</option>' . "\n" .
302 '<option value="7">File talk</option>' . "\n" .
303 '<option value="8">MediaWiki</option>' . "\n" .
304 '<option value="9">MediaWiki talk</option>' . "\n" .
305 '<option value="10">Template</option>' . "\n" .
306 '<option value="11">Template talk</option>' . "\n" .
307 '<option value="14">Category</option>' . "\n" .
308 '<option value="15">Category talk</option>' . "\n" .
309 '<option value="100">Custom</option>' . "\n" .
310 '<option value="101">Custom talk</option>' . "\n" .
312 Html
::namespaceSelector(
313 array( 'label' => 'Select a namespace:' )
315 'Basic namespace selector with a custom label but no id attribtue for the <select>'
319 function testCanFilterOutNamespaces() {
322 '<option value="2">User</option>' . "\n" .
323 '<option value="4">MyWiki</option>' . "\n" .
324 '<option value="5">MyWiki Talk</option>' . "\n" .
325 '<option value="6">File</option>' . "\n" .
326 '<option value="7">File talk</option>' . "\n" .
327 '<option value="8">MediaWiki</option>' . "\n" .
328 '<option value="9">MediaWiki talk</option>' . "\n" .
329 '<option value="10">Template</option>' . "\n" .
330 '<option value="11">Template talk</option>' . "\n" .
331 '<option value="14">Category</option>' . "\n" .
332 '<option value="15">Category talk</option>' . "\n" .
334 Html
::namespaceSelector(
335 array( 'exclude' => array( 0, 1, 3, 100, 101 ) )
337 'Namespace selector namespace filtering.'
341 function testCanDisableANamespaces() {
344 '<option disabled="" value="0">(Main)</option>' . "\n" .
345 '<option disabled="" value="1">Talk</option>' . "\n" .
346 '<option disabled="" value="2">User</option>' . "\n" .
347 '<option disabled="" value="3">User talk</option>' . "\n" .
348 '<option disabled="" value="4">MyWiki</option>' . "\n" .
349 '<option value="5">MyWiki Talk</option>' . "\n" .
350 '<option value="6">File</option>' . "\n" .
351 '<option value="7">File talk</option>' . "\n" .
352 '<option value="8">MediaWiki</option>' . "\n" .
353 '<option value="9">MediaWiki talk</option>' . "\n" .
354 '<option value="10">Template</option>' . "\n" .
355 '<option value="11">Template talk</option>' . "\n" .
356 '<option value="14">Category</option>' . "\n" .
357 '<option value="15">Category talk</option>' . "\n" .
358 '<option value="100">Custom</option>' . "\n" .
359 '<option value="101">Custom talk</option>' . "\n" .
361 Html
::namespaceSelector( array(
362 'disable' => array( 0, 1, 2, 3, 4 )
364 'Namespace selector namespace disabling'