MediaWiki REL1_31
ParserOutputTest.php
Go to the documentation of this file.
1<?php
2
8
9 public static function provideIsLinkInternal() {
10 return [
11 // Different domains
12 [ false, 'http://example.org', 'http://mediawiki.org' ],
13 // Same domains
14 [ true, 'http://example.org', 'http://example.org' ],
15 [ true, 'https://example.org', 'https://example.org' ],
16 [ true, '//example.org', '//example.org' ],
17 // Same domain different cases
18 [ true, 'http://example.org', 'http://EXAMPLE.ORG' ],
19 // Paths, queries, and fragments are not relevant
20 [ true, 'http://example.org', 'http://example.org/wiki/Main_Page' ],
21 [ true, 'http://example.org', 'http://example.org?my=query' ],
22 [ true, 'http://example.org', 'http://example.org#its-a-fragment' ],
23 // Different protocols
24 [ false, 'http://example.org', 'https://example.org' ],
25 [ false, 'https://example.org', 'http://example.org' ],
26 // Protocol relative servers always match http and https links
27 [ true, '//example.org', 'http://example.org' ],
28 [ true, '//example.org', 'https://example.org' ],
29 // But they don't match strange things like this
30 [ false, '//example.org', 'irc://example.org' ],
31 ];
32 }
33
39 public function testIsLinkInternal( $shouldMatch, $server, $url ) {
40 $this->assertEquals( $shouldMatch, ParserOutput::isLinkInternal( $server, $url ) );
41 }
42
47 public function testExtensionData() {
48 $po = new ParserOutput();
49
50 $po->setExtensionData( "one", "Foo" );
51
52 $this->assertEquals( "Foo", $po->getExtensionData( "one" ) );
53 $this->assertNull( $po->getExtensionData( "spam" ) );
54
55 $po->setExtensionData( "two", "Bar" );
56 $this->assertEquals( "Foo", $po->getExtensionData( "one" ) );
57 $this->assertEquals( "Bar", $po->getExtensionData( "two" ) );
58
59 $po->setExtensionData( "one", null );
60 $this->assertNull( $po->getExtensionData( "one" ) );
61 $this->assertEquals( "Bar", $po->getExtensionData( "two" ) );
62 }
63
70 public function testProperties() {
71 $po = new ParserOutput();
72
73 $po->setProperty( 'foo', 'val' );
74
75 $properties = $po->getProperties();
76 $this->assertEquals( $po->getProperty( 'foo' ), 'val' );
77 $this->assertEquals( $properties['foo'], 'val' );
78
79 $po->setProperty( 'foo', 'second val' );
80
81 $properties = $po->getProperties();
82 $this->assertEquals( $po->getProperty( 'foo' ), 'second val' );
83 $this->assertEquals( $properties['foo'], 'second val' );
84
85 $po->unsetProperty( 'foo' );
86
87 $properties = $po->getProperties();
88 $this->assertEquals( $po->getProperty( 'foo' ), false );
89 $this->assertArrayNotHasKey( 'foo', $properties );
90 }
91
99 public function testGetText( $options, $text, $expect ) {
100 $this->setMwGlobals( [
101 'wgArticlePath' => '/wiki/$1',
102 'wgScriptPath' => '/w',
103 'wgScript' => '/w/index.php',
104 ] );
105
106 $po = new ParserOutput( $text );
107 $actual = $po->getText( $options );
108 $this->assertSame( $expect, $actual );
109 }
110
111 public static function provideGetText() {
112 // phpcs:disable Generic.Files.LineLength
113 $text = <<<EOF
114<div class="mw-parser-output"><p>Test document.
115</p>
116<mw:toc><div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
117<ul>
118<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
119<li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
120<ul>
121<li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
122</ul>
123</li>
124<li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
125</ul>
126</div>
127</mw:toc>
128<h2><span class="mw-headline" id="Section_1">Section 1</span><mw:editsection page="Test Page" section="1">Section 1</mw:editsection></h2>
129<p>One
130</p>
131<h2><span class="mw-headline" id="Section_2">Section 2</span><mw:editsection page="Test Page" section="2">Section 2</mw:editsection></h2>
132<p>Two
133</p>
134<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><mw:editsection page="Test Page" section="3">Section 2.1</mw:editsection></h3>
135<p>Two point one
136</p>
137<h2><span class="mw-headline" id="Section_3">Section 3</span><mw:editsection page="Test Page" section="4">Section 3</mw:editsection></h2>
138<p>Three
139</p></div>
140EOF;
141
142 $dedupText = <<<EOF
143<p>This is a test document.</p>
144<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
145<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
146<style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
147<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
148<style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
149<style data-mw-not-deduplicate="duplicate1">.Duplicate1 {}</style>
150<style data-mw-deduplicate="duplicate1">.Same-attribute-different-content {}</style>
151<style data-mw-deduplicate="duplicate3">.Duplicate1 {}</style>
152<style>.Duplicate1 {}</style>
153EOF;
154
155 return [
156 'No options' => [
157 [], $text, <<<EOF
158<div class="mw-parser-output"><p>Test document.
159</p>
160<div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
161<ul>
162<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
163<li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
164<ul>
165<li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
166</ul>
167</li>
168<li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
169</ul>
170</div>
171
172<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
173<p>One
174</p>
175<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
176<p>Two
177</p>
178<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
179<p>Two point one
180</p>
181<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
182<p>Three
183</p></div>
184EOF
185 ],
186 'Disable section edit links' => [
187 [ 'enableSectionEditLinks' => false ], $text, <<<EOF
188<div class="mw-parser-output"><p>Test document.
189</p>
190<div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
191<ul>
192<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
193<li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
194<ul>
195<li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
196</ul>
197</li>
198<li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
199</ul>
200</div>
201
202<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
203<p>One
204</p>
205<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
206<p>Two
207</p>
208<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span></h3>
209<p>Two point one
210</p>
211<h2><span class="mw-headline" id="Section_3">Section 3</span></h2>
212<p>Three
213</p></div>
214EOF
215 ],
216 'Disable TOC' => [
217 [ 'allowTOC' => false ], $text, <<<EOF
218<div class="mw-parser-output"><p>Test document.
219</p>
220
221<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
222<p>One
223</p>
224<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
225<p>Two
226</p>
227<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
228<p>Two point one
229</p>
230<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
231<p>Three
232</p></div>
233EOF
234 ],
235 'Unwrap text' => [
236 [ 'unwrap' => true ], $text, <<<EOF
237<p>Test document.
238</p>
239<div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
240<ul>
241<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a></li>
242<li class="toclevel-1 tocsection-2"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a>
243<ul>
244<li class="toclevel-2 tocsection-3"><a href="#Section_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Section 2.1</span></a></li>
245</ul>
246</li>
247<li class="toclevel-1 tocsection-4"><a href="#Section_3"><span class="tocnumber">3</span> <span class="toctext">Section 3</span></a></li>
248</ul>
249</div>
250
251<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
252<p>One
253</p>
254<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
255<p>Two
256</p>
257<h3><span class="mw-headline" id="Section_2.1">Section 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=3" title="Edit section: Section 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
258<p>Two point one
259</p>
260<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Test_Page&amp;action=edit&amp;section=4" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
261<p>Three
262</p>
263EOF
264 ],
265 'Unwrap without a mw-parser-output wrapper' => [
266 [ 'unwrap' => true ], '<div class="foobar">Content</div>', '<div class="foobar">Content</div>'
267 ],
268 'Unwrap with extra comment at end' => [
269 [ 'unwrap' => true ], '<div class="mw-parser-output"><p>Test document.</p></div>
270<!-- Saved in parser cache... -->', '<p>Test document.</p>
271<!-- Saved in parser cache... -->'
272 ],
273 'Style deduplication' => [
274 [], $dedupText, <<<EOF
275<p>This is a test document.</p>
276<style data-mw-deduplicate="duplicate1">.Duplicate1 {}</style>
277<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
278<style data-mw-deduplicate="duplicate2">.Duplicate2 {}</style>
279<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
280<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate2"/>
281<style data-mw-not-deduplicate="duplicate1">.Duplicate1 {}</style>
282<link rel="mw-deduplicated-inline-style" href="mw-data:duplicate1"/>
283<style data-mw-deduplicate="duplicate3">.Duplicate1 {}</style>
284<style>.Duplicate1 {}</style>
285EOF
286 ],
287 'Style deduplication disabled' => [
288 [ 'deduplicateStyles' => false ], $dedupText, $dedupText
289 ],
290 ];
291 // phpcs:enable
292 }
293
294}
shown</td >< td > a href
GNU GENERAL PUBLIC LICENSE June Free Software Franklin Fifth MA USA Everyone is permitted to copy and distribute verbatim copies of this license document
ID=zero for broken.
Definition COPYING.txt:7
it is up to the author donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License If the distribution and or use of the Program is restricted in certain countries either by patents or by copyrighted the original copyright holder who places the Program under this License may add an geographical distribution limitation excluding those so that distribution is permitted only in or among countries not thus excluded In such this License incorporates the limitation as if written in the body of this License The Free Software Foundation may publish revised and or new versions of the General Public License from time to time Such new versions will be similar in spirit to the present but may differ in detail to address new problems or concerns Each version is given a distinguishing version number If the Program specifies a version number of this License which applies to it and any later you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation If the Program does not specify a version number of this you may choose any version ever published by the Free Software Foundation If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different
Definition COPYING.txt:251
setMwGlobals( $pairs, $value=null)
Sets a global, maintaining a stashed version of the previous global to be restored in tearDown.
Database ^— trigger DB shadowing because we are using Title magic.
testGetText( $options, $text, $expect)
ParserOutput::getText provideGetText.
testProperties()
ParserOutput::setProperty ParserOutput::getProperty ParserOutput::unsetProperty ParserOutput::getProp...
static provideIsLinkInternal()
testExtensionData()
ParserOutput::setExtensionData ParserOutput::getExtensionData.
testIsLinkInternal( $shouldMatch, $server, $url)
Test to make sure ParserOutput::isLinkInternal behaves properly provideIsLinkInternal ParserOutput::i...
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped & $options
Definition hooks.txt:2001
usually copyright or history_copyright This message must be in HTML not wikitext if the section is included from a template to be included in the link
Definition hooks.txt:3023
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Definition hooks.txt:2006
processing should stop and the error should be shown to the user * false
Definition hooks.txt:187
</source > ! result< div id="foo" class="bar mw-highlight mw-content-rtl" dir="rtl" style="font-size: larger;">< pre >< span ></span >< span class="kd"> var</span >< span class="nx"> a</span >< span class="p"></span ></pre ></div > !end !test Inline attribute(inline code) !!input Text< source lang
Bar style