2011-01-15 08:35:56 +00:00
< ? php
class PreprocessorTest extends MediaWikiTestCase {
var $mTitle = 'Page title' ;
var $mPPNodeCount = 0 ;
var $mOptions ;
function setUp () {
global $wgParserConf ;
$this -> mOptions = new ParserOptions ();
$name = isset ( $wgParserConf [ 'preprocessorClass' ] ) ? $wgParserConf [ 'preprocessorClass' ] : 'Preprocessor_DOM' ;
$this -> mPreprocessor = new $name ( $this );
}
function getStripList () {
2011-01-17 19:54:44 +00:00
return array ( 'gallery' , 'display map' /* Used by Maps, see r80025 CR */ , '/foo' );
2011-01-15 08:35:56 +00:00
}
function provideCases () {
return array (
array ( " Foo " , " <root>Foo</root> " ),
array ( " <!-- Foo --> " , " <root><comment><!-- Foo --></comment></root> " ),
array ( " <!-- Foo --><!-- Bar --> " , " <root><comment><!-- Foo --></comment><comment><!-- Bar --></comment></root> " ),
array ( " <!-- Foo --> <!-- Bar --> " , " <root><comment><!-- Foo --></comment> <comment><!-- Bar --></comment></root> " ),
array ( " <!-- Foo --> \n <!-- Bar --> " , " <root><comment><!-- Foo --></comment> \n <comment><!-- Bar --></comment></root> " ),
array ( " <!-- Foo --> \n <!-- Bar --> \n " , " <root><comment><!-- Foo --></comment> \n <comment> <!-- Bar --> \n </comment></root> " ),
array ( " <!-- Foo --> <!-- Bar --> \n " , " <root><comment><!-- Foo --></comment> <comment><!-- Bar --></comment> \n </root> " ),
array ( " <!-->Bar " , " <root><comment><!-->Bar</comment></root> " ),
array ( " <!-- Comment -- comment " , " <root><comment><!-- Comment -- comment</comment></root> " ),
array ( " == Foo == \n <!-- Bar --> \n == Baz == \n " , " <root><h level= \" 2 \" i= \" 1 \" >== Foo ==</h> \n <comment> <!-- Bar --> \n </comment><h level= \" 2 \" i= \" 2 \" >== Baz ==</h> \n </root> " ),
array ( " <gallery/> " , " <root><ext><name>gallery</name><attr></attr></ext></root> " ),
array ( " Foo <gallery/> Bar " , " <root>Foo <ext><name>gallery</name><attr></attr></ext> Bar</root> " ),
array ( " <gallery></gallery> " , " <root><ext><name>gallery</name><attr></attr><inner></inner><close></gallery></close></ext></root> " ),
array ( " <foo> <gallery></gallery> " , " <root><foo> <ext><name>gallery</name><attr></attr><inner></inner><close></gallery></close></ext></root> " ),
array ( " <foo> <gallery><gallery></gallery> " , " <root><foo> <ext><name>gallery</name><attr></attr><inner><gallery></inner><close></gallery></close></ext></root> " ),
array ( " <noinclude> Foo bar </noinclude> " , " <root><ignore><noinclude></ignore> Foo bar <ignore></noinclude></ignore></root> " ),
2011-01-17 23:12:07 +00:00
array ( " <noinclude> \n { { Foo}} \n </noinclude> " , " <root><ignore><noinclude></ignore> \n <template lineStart= \" 1 \" ><title>Foo</title></template> \n <ignore></noinclude></ignore></root> " ),
array ( " <noinclude> \n { { Foo}} \n </noinclude> \n " , " <root><ignore><noinclude></ignore> \n <template lineStart= \" 1 \" ><title>Foo</title></template> \n <ignore></noinclude></ignore> \n </root> " ),
2011-01-15 08:35:56 +00:00
array ( " <gallery>foo bar " , " <root><ext><name>gallery</name><attr></attr><inner>foo bar</inner></ext></root> " ),
array ( " <gallery></gallery</gallery> " , " <root><ext><name>gallery</name><attr></attr><inner></gallery</inner><close></gallery></close></ext></root> " ),
array ( " === Foo === " , " <root><h level= \" 3 \" i= \" 1 \" >=== Foo === </h></root> " ),
array ( " ==<!-- -->= Foo === " , " <root><h level= \" 2 \" i= \" 1 \" >==<comment><!-- --></comment>= Foo === </h></root> " ),
array ( " === Foo ==<!-- -->= " , " <root><h level= \" 1 \" i= \" 1 \" >=== Foo ==<comment><!-- --></comment>= </h></root> " ),
array ( " === Foo ===<!-- --> \n " , " <root><h level= \" 3 \" i= \" 1 \" >=== Foo ===<comment><!-- --></comment></h> \n </root> " ),
array ( " === Foo ===<!-- --> <!-- --> \n " , " <root><h level= \" 3 \" i= \" 1 \" >=== Foo ===<comment><!-- --></comment> <comment><!-- --></comment></h> \n </root> " ),
array ( " == Foo == \n == Bar == \n " , " <root><h level= \" 2 \" i= \" 1 \" >== Foo ==</h> \n <h level= \" 2 \" i= \" 2 \" >== Bar == </h> \n </root> " ),
array ( " =========== " , " <root><h level= \" 5 \" i= \" 1 \" >===========</h></root> " ),
2011-04-23 21:18:22 +00:00
array ( " Foo \n = \n == \n = \n " , " <root>Foo \n = \n == \n = \n </root> " ),
2011-04-19 18:39:37 +00:00
array ( " { { Foo}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title></template></root> " ),
2011-01-15 08:35:56 +00:00
array ( " \n { { Foo}} " , " <root> \n <template lineStart= \" 1 \" ><title>Foo</title></template></root> " ),
2011-04-23 21:18:22 +00:00
array ( " { { Foo|bar}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value>bar</value></part></template></root> " ),
array ( " { { Foo|bar}}a " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value>bar</value></part></template>a</root> " ),
array ( " { { Foo|bar|baz}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value>bar</value></part><part><name index= \" 2 \" /><value>baz</value></part></template></root> " ),
2011-04-19 18:39:37 +00:00
array ( " { { Foo|1=bar}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name>1</name>=<value>bar</value></part></template></root> " ),
array ( " { { Foo|=bar}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name></name>=<value>bar</value></part></template></root> " ),
2011-04-23 21:18:22 +00:00
array ( " { { Foo|bar=baz}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name>bar</name>=<value>baz</value></part></template></root> " ),
array ( " { { Foo|1=bar|baz}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name index= \" 1 \" /><value>baz</value></part></template></root> " ),
array ( " { { Foo|bar|foo=baz}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value>bar</value></part><part><name>foo</name>=<value>baz</value></part></template></root> " ),
2011-04-19 18:39:37 +00:00
array ( " { { { 1}}} " , " <root><tplarg lineStart= \" 1 \" ><title>1</title></tplarg></root> " ),
array ( " { { { 1|}}} " , " <root><tplarg lineStart= \" 1 \" ><title>1</title><part><name index= \" 1 \" /><value></value></part></tplarg></root> " ),
array ( " { { { Foo}}} " , " <root><tplarg lineStart= \" 1 \" ><title>Foo</title></tplarg></root> " ),
array ( " { { { Foo|}}} " , " <root><tplarg lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value></value></part></tplarg></root> " ),
array ( " { { { Foo|bar|baz}}} " , " <root><tplarg lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value>bar</value></part><part><name index= \" 2 \" /><value>baz</value></part></tplarg></root> " ),
2011-01-15 08:35:56 +00:00
array ( " { <!-- --> { Foo}} " , " <root> { <comment><!-- --></comment> { Foo}}</root> " ),
2011-04-23 21:18:22 +00:00
array ( " { { { { Foobar}}}} " , " <root> { <tplarg><title>Foobar</title></tplarg>}</root> " ),
2011-04-19 18:39:37 +00:00
array ( " { { { { { Foo}} }}} " , " <root><tplarg lineStart= \" 1 \" ><title> <template><title>Foo</title></template> </title></tplarg></root> " ),
array ( " { { { { { Foo}}} }} " , " <root><template lineStart= \" 1 \" ><title> <tplarg><title>Foo</title></tplarg> </title></template></root> " ),
array ( " { { { { { Foo}}}}} " , " <root><template lineStart= \" 1 \" ><title><tplarg><title>Foo</title></tplarg></title></template></root> " ),
array ( " { { { { { Foo}} }}} " , " <root><tplarg lineStart= \" 1 \" ><title><template><title>Foo</title></template> </title></tplarg></root> " ),
array ( " { { { { { { Foo}}}}}} " , " <root><tplarg lineStart= \" 1 \" ><title><tplarg><title>Foo</title></tplarg></title></tplarg></root> " ),
2011-01-15 08:35:56 +00:00
array ( " { { { { { { Foo}}}}} " , " <root> { <template><title><tplarg><title>Foo</title></tplarg></title></template></root> " ),
array ( " [[[Foo]] " , " <root>[[[Foo]]</root> " ),
2011-04-19 18:39:37 +00:00
array ( " { { Foo|[[[[bar]]|baz]]}} " , " <root><template lineStart= \" 1 \" ><title>Foo</title><part><name index= \" 1 \" /><value>[[[[bar]]|baz]]</value></part></template></root> " ), // This test is important, since it means the difference between having the [[ rule stacked or not
2011-01-16 18:20:44 +00:00
array ( " { { Foo|[[[[bar]|baz]]}} " , " <root> { { Foo|[[[[bar]|baz]]}}</root> " ),
2011-01-17 19:54:44 +00:00
array ( " { { Foo|Foo [[[[bar]|baz]]}} " , " <root> { { Foo|Foo [[[[bar]|baz]]}}</root> " ),
array ( " Foo <display map>Bar</display map >Baz " , " <root>Foo <ext><name>display map</name><attr></attr><inner>Bar</inner><close></display map ></close></ext>Baz</root> " ),
array ( " Foo <display map foo>Bar</display map >Baz " , " <root>Foo <ext><name>display map</name><attr> foo</attr><inner>Bar</inner><close></display map ></close></ext>Baz</root> " ),
array ( " Foo <gallery bar= \" baz \" /> " , " <root>Foo <ext><name>gallery</name><attr> bar="baz" </attr></ext></root> " ),
array ( " </foo>Foo<//foo> " , " <root><ext><name>/foo</name><attr></attr><inner>Foo</inner><close><//foo></close></ext></root> " ), # Worth blacklisting IMHO
2011-04-19 18:39:37 +00:00
array ( " { { #ifexpr: ( { { { 1|1}}} = 2) | Foo | Bar }} " , " <root><template lineStart= \" 1 \" ><title>#ifexpr: (<tplarg><title>1</title><part><name index= \" 1 \" /><value>1</value></part></tplarg> = 2) </title><part><name index= \" 1 \" /><value> Foo </value></part><part><name index= \" 2 \" /><value> Bar </value></part></template></root> " ),
array ( " { { #if: { { { 1|}}} | Foo | { { Bar}} }} " , " <root><template lineStart= \" 1 \" ><title>#if: <tplarg><title>1</title><part><name index= \" 1 \" /><value></value></part></tplarg> </title><part><name index= \" 1 \" /><value> Foo </value></part><part><name index= \" 2 \" /><value> <template><title>Bar</title></template> </value></part></template></root> " ),
array ( " { { #if: { { { 1|}}} | Foo | [[Bar]] }} " , " <root><template lineStart= \" 1 \" ><title>#if: <tplarg><title>1</title><part><name index= \" 1 \" /><value></value></part></tplarg> </title><part><name index= \" 1 \" /><value> Foo </value></part><part><name index= \" 2 \" /><value> [[Bar]] </value></part></template></root> " ),
array ( " { { #if: { { { 1|}}} | [[Foo]] | Bar }} " , " <root><template lineStart= \" 1 \" ><title>#if: <tplarg><title>1</title><part><name index= \" 1 \" /><value></value></part></tplarg> </title><part><name index= \" 1 \" /><value> [[Foo]] </value></part><part><name index= \" 2 \" /><value> Bar </value></part></template></root> " ),
array ( " { { #if: { { { 1|}}} | 1 | { { #if: { { { 1|}}} | 2 | 3 }} }} " , " <root><template lineStart= \" 1 \" ><title>#if: <tplarg><title>1</title><part><name index= \" 1 \" /><value></value></part></tplarg> </title><part><name index= \" 1 \" /><value> 1 </value></part><part><name index= \" 2 \" /><value> <template><title>#if: <tplarg><title>1</title><part><name index= \" 1 \" /><value></value></part></tplarg> </title><part><name index= \" 1 \" /><value> 2 </value></part><part><name index= \" 2 \" /><value> 3 </value></part></template> </value></part></template></root> " ),
2011-01-21 22:00:07 +00:00
array ( " { { { { Foo}} " , " <root> { { <template><title>Foo</title></template></root> " ),
array ( " { { Foobar { { Foo}} { { Bar}} { { Baz}} " , " <root> { { Foobar <template><title>Foo</title></template> <template><title>Bar</title></template> <template><title>Baz</title></template> </root> " ),
2011-01-22 16:34:14 +00:00
array ( " [[Foo]] | " , " <root>[[Foo]] |</root> " ),
2011-01-24 19:40:25 +00:00
array ( " { { Foo|Bar| " , " <root> { { Foo|Bar|</root> " ),
2011-01-24 22:10:22 +00:00
array ( " [[Foo] " , " <root>[[Foo]</root> " ),
array ( " [[Foo|Bar] " , " <root>[[Foo|Bar]</root> " ),
array ( " { { Foo| [[Bar] }} " , " <root> { { Foo| [[Bar] }}</root> " ),
array ( " { { Foo| [[Bar|Baz] }} " , " <root> { { Foo| [[Bar|Baz] }}</root> " ),
array ( " { { Foo|bar=[[baz]}} " , " <root> { { Foo|bar=[[baz]}}</root> " ),
2011-02-05 20:05:00 +00:00
array ( " { { foo| " , " <root> { { foo|</root> " ),
array ( " { { foo|} " , " <root> { { foo|}</root> " ),
2011-04-19 18:39:37 +00:00
array ( " { { foo|} }} " , " <root><template lineStart= \" 1 \" ><title>foo</title><part><name index= \" 1 \" /><value>} </value></part></template></root> " ),
2011-02-05 20:05:00 +00:00
array ( " { { foo|bar=|} " , " <root> { { foo|bar=|}</root> " ),
2011-01-15 08:35:56 +00:00
/* array( file_get_contents( dirname( __FILE__ ) . '/QuoteQuran.txt' ), file_get_contents( dirname( __FILE__ ) . '/QuoteQuranExpanded.txt' ) ), */
);
}
/**
* @ dataProvider provideCases
*/
function testPreprocessorOutput ( $wikiText , $expectedXml ) {
$this -> assertEquals ( $expectedXml , $this -> mPreprocessor -> preprocessToXml ( $wikiText ) );
}
2011-01-21 23:03:33 +00:00
/**
* These are more complex test cases taken out of wiki articles .
*/
function provideFiles () {
return array (
array ( " QuoteQuran " ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC-BY-SA by Striver
array ( " Factorial " ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium
array ( " All_system_messages " ), # http://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki
2011-01-22 16:34:14 +00:00
array ( " Fundraising " ), # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC-BY-SA, copied there by Sky Harbor.
2011-01-21 23:03:33 +00:00
);
}
/**
* @ dataProvider provideFiles
*/
function testPreprocessorOutputFiles ( $filename ) {
$folder = dirname ( __FILE__ ) . " /../../../parser/preprocess " ;
$wikiText = file_get_contents ( " $folder / $filename .txt " );
$output = $this -> mPreprocessor -> preprocessToXml ( $wikiText );
$expectedFilename = " $folder / $filename .expected " ;
if ( file_exists ( $expectedFilename ) ) {
$expectedXml = file_get_contents ( $expectedFilename );
$this -> assertEquals ( $expectedXml , $output );
} else {
$tempFilename = tempnam ( $folder , " $filename . " );
file_put_contents ( $tempFilename , $output );
2011-04-23 21:18:22 +00:00
$this -> markTestIncomplete ( " File $expectedFilename missing. Output stored as $tempFilename " );
2011-01-21 23:03:33 +00:00
}
}
2011-01-15 08:35:56 +00:00
}