MediaWiki  1.28.0
XmlTest.php
Go to the documentation of this file.
1 <?php
2 
6 class XmlTest extends MediaWikiTestCase {
7 
8  protected function setUp() {
9  parent::setUp();
10 
11  $langObj = Language::factory( 'en' );
12  $langObj->setNamespaces( [
13  -2 => 'Media',
14  -1 => 'Special',
15  0 => '',
16  1 => 'Talk',
17  2 => 'User',
18  3 => 'User_talk',
19  4 => 'MyWiki',
20  5 => 'MyWiki_Talk',
21  6 => 'File',
22  7 => 'File_talk',
23  8 => 'MediaWiki',
24  9 => 'MediaWiki_talk',
25  10 => 'Template',
26  11 => 'Template_talk',
27  100 => 'Custom',
28  101 => 'Custom_talk',
29  ] );
30 
31  $this->setMwGlobals( [
32  'wgLang' => $langObj,
33  'wgUseMediaWikiUIEverywhere' => false,
34  ] );
35  }
36 
40  public function testExpandAttributes() {
41  $this->assertNull( Xml::expandAttributes( null ),
42  'Converting a null list of attributes'
43  );
44  $this->assertEquals( '', Xml::expandAttributes( [] ),
45  'Converting an empty list of attributes'
46  );
47  }
48 
52  public function testExpandAttributesException() {
53  $this->setExpectedException( 'MWException' );
54  Xml::expandAttributes( 'string' );
55  }
56 
60  public function testElementOpen() {
61  $this->assertEquals(
62  '<element>',
63  Xml::element( 'element', null, null ),
64  'Opening element with no attributes'
65  );
66  }
67 
71  public function testElementEmpty() {
72  $this->assertEquals(
73  '<element />',
74  Xml::element( 'element', null, '' ),
75  'Terminated empty element'
76  );
77  }
78 
83  $this->assertEquals(
84  '<input name="name" value="0" />',
85  Xml::input( 'name', false, 0 ),
86  'Input with a value of 0 (bug 23797)'
87  );
88  }
89 
93  public function testElementEscaping() {
94  $this->assertEquals(
95  '<element>hello &lt;there&gt; you &amp; you</element>',
96  Xml::element( 'element', null, 'hello <there> you & you' ),
97  'Element with no attributes and content that needs escaping'
98  );
99  }
100 
104  public function testEscapeTagsOnly() {
105  $this->assertEquals( '&quot;&gt;&lt;', Xml::escapeTagsOnly( '"><' ),
106  'replace " > and < with their HTML entitites'
107  );
108  }
109 
113  public function testElementAttributes() {
114  $this->assertEquals(
115  '<element key="value" <>="&lt;&gt;">',
116  Xml::element( 'element', [ 'key' => 'value', '<>' => '<>' ], null ),
117  'Element attributes, keys are not escaped'
118  );
119  }
120 
124  public function testOpenElement() {
125  $this->assertEquals(
126  '<element k="v">',
127  Xml::openElement( 'element', [ 'k' => 'v' ] ),
128  'openElement() shortcut'
129  );
130  }
131 
135  public function testCloseElement() {
136  $this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
137  }
138 
142  public function testDateMenu() {
143  $curYear = intval( gmdate( 'Y' ) );
144  $prevYear = $curYear - 1;
145 
146  $curMonth = intval( gmdate( 'n' ) );
147 
148  $nextMonth = $curMonth + 1;
149  if ( $nextMonth == 13 ) {
150  $nextMonth = 1;
151  }
152 
153  $this->assertEquals(
154  '<label for="year">From year (and earlier):</label> ' .
155  '<input id="year" maxlength="4" size="7" type="number" value="2011" name="year"/> ' .
156  '<label for="month">From month (and earlier):</label> ' .
157  '<select name="month" id="month" class="mw-month-selector">' .
158  '<option value="-1">all</option>' . "\n" .
159  '<option value="1">January</option>' . "\n" .
160  '<option value="2" selected="">February</option>' . "\n" .
161  '<option value="3">March</option>' . "\n" .
162  '<option value="4">April</option>' . "\n" .
163  '<option value="5">May</option>' . "\n" .
164  '<option value="6">June</option>' . "\n" .
165  '<option value="7">July</option>' . "\n" .
166  '<option value="8">August</option>' . "\n" .
167  '<option value="9">September</option>' . "\n" .
168  '<option value="10">October</option>' . "\n" .
169  '<option value="11">November</option>' . "\n" .
170  '<option value="12">December</option></select>',
171  Xml::dateMenu( 2011, 02 ),
172  "Date menu for february 2011"
173  );
174  $this->assertEquals(
175  '<label for="year">From year (and earlier):</label> ' .
176  '<input id="year" maxlength="4" size="7" type="number" value="2011" name="year"/> ' .
177  '<label for="month">From month (and earlier):</label> ' .
178  '<select name="month" id="month" class="mw-month-selector">' .
179  '<option value="-1">all</option>' . "\n" .
180  '<option value="1">January</option>' . "\n" .
181  '<option value="2">February</option>' . "\n" .
182  '<option value="3">March</option>' . "\n" .
183  '<option value="4">April</option>' . "\n" .
184  '<option value="5">May</option>' . "\n" .
185  '<option value="6">June</option>' . "\n" .
186  '<option value="7">July</option>' . "\n" .
187  '<option value="8">August</option>' . "\n" .
188  '<option value="9">September</option>' . "\n" .
189  '<option value="10">October</option>' . "\n" .
190  '<option value="11">November</option>' . "\n" .
191  '<option value="12">December</option></select>',
192  Xml::dateMenu( 2011, -1 ),
193  "Date menu with negative month for 'All'"
194  );
195  $this->assertEquals(
196  Xml::dateMenu( $curYear, $curMonth ),
197  Xml::dateMenu( '', $curMonth ),
198  "Date menu year is the current one when not specified"
199  );
200 
201  $wantedYear = $nextMonth == 1 ? $curYear : $prevYear;
202  $this->assertEquals(
203  Xml::dateMenu( $wantedYear, $nextMonth ),
204  Xml::dateMenu( '', $nextMonth ),
205  "Date menu next month is 11 months ago"
206  );
207 
208  $this->assertEquals(
209  '<label for="year">From year (and earlier):</label> ' .
210  '<input id="year" maxlength="4" size="7" type="number" name="year"/> ' .
211  '<label for="month">From month (and earlier):</label> ' .
212  '<select name="month" id="month" class="mw-month-selector">' .
213  '<option value="-1">all</option>' . "\n" .
214  '<option value="1">January</option>' . "\n" .
215  '<option value="2">February</option>' . "\n" .
216  '<option value="3">March</option>' . "\n" .
217  '<option value="4">April</option>' . "\n" .
218  '<option value="5">May</option>' . "\n" .
219  '<option value="6">June</option>' . "\n" .
220  '<option value="7">July</option>' . "\n" .
221  '<option value="8">August</option>' . "\n" .
222  '<option value="9">September</option>' . "\n" .
223  '<option value="10">October</option>' . "\n" .
224  '<option value="11">November</option>' . "\n" .
225  '<option value="12">December</option></select>',
226  Xml::dateMenu( '', '' ),
227  "Date menu with neither year or month"
228  );
229  }
230 
234  public function testTextareaNoContent() {
235  $this->assertEquals(
236  '<textarea name="name" id="name" cols="40" rows="5"></textarea>',
237  Xml::textarea( 'name', '' ),
238  'textarea() with not content'
239  );
240  }
241 
245  public function testTextareaAttribs() {
246  $this->assertEquals(
247  '<textarea name="name" id="name" cols="20" rows="10">&lt;txt&gt;</textarea>',
248  Xml::textarea( 'name', '<txt>', 20, 10 ),
249  'textarea() with custom attribs'
250  );
251  }
252 
256  public function testLabelCreation() {
257  $this->assertEquals(
258  '<label for="id">name</label>',
259  Xml::label( 'name', 'id' ),
260  'label() with no attribs'
261  );
262  }
263 
268  $this->assertEquals(
269  '<label for="id">name</label>',
270  Xml::label( 'name', 'id', [ 'generated' => true ] ),
271  'label() can not be given a generated attribute'
272  );
273  $this->assertEquals(
274  '<label for="id" class="nice">name</label>',
275  Xml::label( 'name', 'id', [ 'class' => 'nice' ] ),
276  'label() can get a class attribute'
277  );
278  $this->assertEquals(
279  '<label for="id" title="nice tooltip">name</label>',
280  Xml::label( 'name', 'id', [ 'title' => 'nice tooltip' ] ),
281  'label() can get a title attribute'
282  );
283  $this->assertEquals(
284  '<label for="id" class="nice" title="nice tooltip">name</label>',
285  Xml::label( 'name', 'id', [
286  'generated' => true,
287  'class' => 'nice',
288  'title' => 'nice tooltip',
289  'anotherattr' => 'value',
290  ]
291  ),
292  'label() skip all attributes but "class" and "title"'
293  );
294  }
295 
299  public function testLanguageSelector() {
300  $select = Xml::languageSelector( 'en', true, null,
301  [ 'id' => 'testlang' ], wfMessage( 'yourlanguage' ) );
302  $this->assertEquals(
303  '<label for="testlang">Language:</label>',
304  $select[0]
305  );
306  }
307 
311  public function testEscapeJsStringSpecialChars() {
312  $this->assertEquals(
313  '\\\\\r\n',
314  Xml::escapeJsString( "\\\r\n" ),
315  'escapeJsString() with special characters'
316  );
317  }
318 
322  public function testEncodeJsVarBoolean() {
323  $this->assertEquals(
324  'true',
325  Xml::encodeJsVar( true ),
326  'encodeJsVar() with boolean'
327  );
328  }
329 
333  public function testEncodeJsVarNull() {
334  $this->assertEquals(
335  'null',
336  Xml::encodeJsVar( null ),
337  'encodeJsVar() with null'
338  );
339  }
340 
344  public function testEncodeJsVarArray() {
345  $this->assertEquals(
346  '["a",1]',
347  Xml::encodeJsVar( [ 'a', 1 ] ),
348  'encodeJsVar() with array'
349  );
350  $this->assertEquals(
351  '{"a":"a","b":1}',
352  Xml::encodeJsVar( [ 'a' => 'a', 'b' => 1 ] ),
353  'encodeJsVar() with associative array'
354  );
355  }
356 
360  public function testEncodeJsVarObject() {
361  $this->assertEquals(
362  '{"a":"a","b":1}',
363  Xml::encodeJsVar( (object)[ 'a' => 'a', 'b' => 1 ] ),
364  'encodeJsVar() with object'
365  );
366  }
367 
371  public function testEncodeJsVarInt() {
372  $this->assertEquals(
373  '123456',
374  Xml::encodeJsVar( 123456 ),
375  'encodeJsVar() with int'
376  );
377  }
378 
382  public function testEncodeJsVarFloat() {
383  $this->assertEquals(
384  '1.23456',
385  Xml::encodeJsVar( 1.23456 ),
386  'encodeJsVar() with float'
387  );
388  }
389 
393  public function testEncodeJsVarIntString() {
394  $this->assertEquals(
395  '"123456"',
396  Xml::encodeJsVar( '123456' ),
397  'encodeJsVar() with int-like string'
398  );
399  }
400 
404  public function testEncodeJsVarFloatString() {
405  $this->assertEquals(
406  '"1.23456"',
407  Xml::encodeJsVar( '1.23456' ),
408  'encodeJsVar() with float-like string'
409  );
410  }
411 }
testEncodeJsVarNull()
Xml::encodeJsVar.
Definition: XmlTest.php:333
testEscapeJsStringSpecialChars()
Xml::escapeJsString.
Definition: XmlTest.php:311
static element($element, $attribs=null, $contents= '', $allowShortTag=true)
Format an XML element with given attributes and, optionally, text content.
Definition: Xml.php:39
testTextareaAttribs()
Xml::textarea.
Definition: XmlTest.php:245
testEncodeJsVarObject()
Xml::encodeJsVar.
Definition: XmlTest.php:360
static expandAttributes($attribs)
Given an array of ('attributename' => 'value'), it generates the code to set the XML attributes : att...
Definition: Xml.php:67
testLabelAttributeCanOnlyBeClassOrTitle()
Xml::label.
Definition: XmlTest.php:267
static input($name, $size=false, $value=false, $attribs=[])
Convenience function to build an HTML text input field.
Definition: Xml.php:275
testEncodeJsVarFloatString()
Xml::encodeJsVar.
Definition: XmlTest.php:404
Xml.
Definition: XmlTest.php:6
testEncodeJsVarArray()
Xml::encodeJsVar.
Definition: XmlTest.php:344
testElementEscaping()
Xml::element.
Definition: XmlTest.php:93
testTextareaNoContent()
Xml::textarea.
Definition: XmlTest.php:234
static label($label, $id, $attribs=[])
Convenience function to build an HTML form label.
Definition: Xml.php:359
testExpandAttributes()
Xml::expandAttributes.
Definition: XmlTest.php:40
testLabelCreation()
Xml::label.
Definition: XmlTest.php:256
static closeElement($element)
Shortcut to close an XML element.
Definition: Xml.php:118
testExpandAttributesException()
Xml::expandAttributes.
Definition: XmlTest.php:52
testElementAttributes()
Xml::element.
Definition: XmlTest.php:113
testEncodeJsVarIntString()
Xml::encodeJsVar.
Definition: XmlTest.php:393
either a unescaped string or a HtmlArmor object after in associative array form externallinks including delete and has completed for all link tables whether this was an auto creation default is conds Array Extra conditions for the No matching items in log is displayed if loglist is empty msgKey Array If you want a nice box with a set this to the key of the message First element is the message additional optional elements are parameters for the key that are processed with wfMessage() -> params() ->parseAsBlock()-offset Set to overwrite offset parameter in $wgRequest set to ''to unsetoffset-wrap String Wrap the message in html(usually something like"&lt
testOpenElement()
Xml::openElement.
Definition: XmlTest.php:124
static languageSelector($selected, $customisedOnly=true, $inLanguage=null, $overrideAttrs=[], Message $msg=null)
Construct a language selector appropriate for use in a form or preferences.
Definition: Xml.php:204
static openElement($element, $attribs=null)
This opens an XML element.
Definition: Xml.php:109
static dateMenu($year, $month)
Definition: Xml.php:167
static escapeJsString($string)
Returns an escaped string suitable for inclusion in a string literal for JavaScript source code...
Definition: Xml.php:626
testElementOpen()
Xml::element.
Definition: XmlTest.php:60
testEncodeJsVarFloat()
Xml::encodeJsVar.
Definition: XmlTest.php:382
testEncodeJsVarBoolean()
Xml::encodeJsVar.
Definition: XmlTest.php:322
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition: injection.txt:35
testElementEmpty()
Xml::element.
Definition: XmlTest.php:71
setUp()
Definition: XmlTest.php:8
static encodeJsVar($value, $pretty=false)
Encode a variable of arbitrary type to JavaScript.
Definition: Xml.php:664
static textarea($name, $content, $cols=40, $rows=5, $attribs=[])
Shortcut for creating textareas.
Definition: Xml.php:604
testEscapeTagsOnly()
Xml::escapeTagsOnly.
Definition: XmlTest.php:104
testElementInputCanHaveAValueOfZero()
Xml::input.
Definition: XmlTest.php:82
testDateMenu()
Xml::dateMenu.
Definition: XmlTest.php:142
testLanguageSelector()
Xml::languageSelector.
Definition: XmlTest.php:299
static factory($code)
Get a cached or new language object for a given language code.
Definition: Language.php:181
setMwGlobals($pairs, $value=null)
static escapeTagsOnly($in)
Replace " > and < with their respective HTML entities ( ", >, <)
Definition: Xml.php:752
testCloseElement()
Xml::closeElement.
Definition: XmlTest.php:135
testEncodeJsVarInt()
Xml::encodeJsVar.
Definition: XmlTest.php:371