1<?php 2 3use dokuwiki\ParserMode\Code; 4use dokuwiki\ParserMode\Eol; 5use dokuwiki\ParserMode\Footnote; 6use dokuwiki\ParserMode\Formatting; 7use dokuwiki\ParserMode\Hr; 8use dokuwiki\ParserMode\Listblock; 9use dokuwiki\ParserMode\Preformatted; 10use dokuwiki\ParserMode\Quote; 11use dokuwiki\ParserMode\Table; 12use dokuwiki\ParserMode\Unformatted; 13 14require_once 'parser.inc.php'; 15 16class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser { 17 18 function setUp() { 19 parent::setUp(); 20 $this->P->addMode('footnote',new Footnote()); 21 } 22 23 function testFootnote() { 24 $this->P->parse('Foo (( testing )) Bar'); 25 $calls = array ( 26 array('document_start',array()), 27 array('p_open',array()), 28 array('cdata',array("\n".'Foo ')), 29 array('nest', array ( array ( 30 array('footnote_open',array()), 31 array('cdata',array(' testing ')), 32 array('footnote_close',array()), 33 ))), 34 array('cdata',array(' Bar')), 35 array('p_close',array()), 36 array('document_end',array()), 37 ); 38 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 39 } 40 41 function testNotAFootnote() { 42 $this->P->parse("Foo (( testing\n Bar"); 43 $calls = array ( 44 array('document_start',array()), 45 array('p_open',array()), 46 array('cdata',array("\nFoo (( testing\n Bar")), 47 array('p_close',array()), 48 array('document_end',array()), 49 ); 50 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 51 } 52 53 function testFootnoteLinefeed() { 54 $this->P->addMode('eol',new Eol()); 55 $this->P->parse("Foo (( testing\ntesting )) Bar"); 56 $calls = array ( 57 array('document_start',array()), 58 array('p_open',array()), 59 array('cdata',array('Foo ')), 60 array('nest', array ( array ( 61 array('footnote_open',array()), 62 array('cdata',array(" testing\ntesting ")), 63 array('footnote_close',array()), 64 ))), 65 array('cdata',array(' Bar')), 66 array('p_close',array()), 67 array('document_end',array()), 68 ); 69 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 70 } 71 72 function testFootnoteNested() { 73 $this->P->parse('Foo (( x((y))z )) Bar'); 74 $calls = array ( 75 array('document_start',array()), 76 array('p_open',array()), 77 array('cdata',array("\n".'Foo ')), 78 array('nest', array ( array ( 79 array('footnote_open',array()), 80 array('cdata',array(' x((y')), 81 array('footnote_close',array()), 82 ))), 83 array('cdata',array('z )) Bar')), 84 array('p_close',array()), 85 array('document_end',array()), 86 ); 87 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 88 } 89 90 function testFootnoteEol() { 91 $this->P->addMode('eol',new Eol()); 92 $this->P->parse("Foo \nX(( test\ning ))Y\n Bar"); 93 $calls = array ( 94 array('document_start',array()), 95 array('p_open',array()), 96 array('cdata',array('Foo '.DOKU_PARSER_EOL.'X')), 97 array('nest', array ( array ( 98 array('footnote_open',array()), 99 array('cdata',array(" test\ning ")), 100 array('footnote_close',array()), 101 ))), 102 array('cdata',array('Y'.DOKU_PARSER_EOL.' Bar')), 103 array('p_close',array()), 104 array('document_end',array()), 105 ); 106 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 107 } 108 109 function testFootnoteStrong() { 110 $this->P->addMode('strong',new Formatting('strong')); 111 $this->P->parse('Foo (( **testing** )) Bar'); 112 $calls = array ( 113 array('document_start',array()), 114 array('p_open',array()), 115 array('cdata',array("\n".'Foo ')), 116 array('nest', array ( array ( 117 array('footnote_open',array()), 118 array('cdata',array(' ')), 119 array('strong_open',array()), 120 array('cdata',array('testing')), 121 array('strong_close',array()), 122 array('cdata',array(' ')), 123 array('footnote_close',array()), 124 ))), 125 array('cdata',array(' Bar')), 126 array('p_close',array()), 127 array('document_end',array()), 128 ); 129 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 130 } 131 132 function testFootnoteHr() { 133 $this->P->addMode('hr',new Hr()); 134 $this->P->parse("Foo (( \n ---- \n )) Bar"); 135 $calls = array ( 136 array('document_start',array()), 137 array('p_open',array()), 138 array('cdata',array("\n".'Foo ')), 139 array('nest', array ( array ( 140 array('footnote_open',array()), 141 array('cdata',array(' ')), 142 array('hr',array()), 143 array('cdata',array("\n ")), 144 array('footnote_close',array()), 145 ))), 146 array('cdata',array(' Bar')), 147 array('p_close',array()), 148 array('document_end',array()), 149 ); 150 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 151 } 152 153 function testFootnoteCode() { 154 $this->P->addMode('code',new Code()); 155 $this->P->parse("Foo (( <code>Test</code> )) Bar"); 156 $calls = array ( 157 array('document_start',array()), 158 array('p_open',array()), 159 array('cdata',array("\n".'Foo ')), 160 array('nest', array ( array ( 161 array('footnote_open',array()), 162 array('cdata',array(' ')), 163 array('code',array('Test',null,null)), 164 array('cdata',array(' ')), 165 array('footnote_close',array()), 166 ))), 167 array('cdata',array(' Bar')), 168 array('p_close',array()), 169 array('document_end',array()), 170 ); 171 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 172 } 173 174 function testFootnotePreformatted() { 175 $this->P->addMode('preformatted',new Preformatted()); 176 $this->P->parse("Foo (( \n Test\n )) Bar"); 177 $calls = array ( 178 array('document_start',array()), 179 array('p_open',array()), 180 array('cdata',array("\n".'Foo ')), 181 array('nest', array ( array ( 182 array('footnote_open',array()), 183 array('cdata',array(' ')), 184 array('preformatted',array('Test')), 185 array('cdata',array(' ')), 186 array('footnote_close',array()), 187 ))), 188 array('cdata',array(' Bar')), 189 array('p_close',array()), 190 array('document_end',array()), 191 ); 192 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 193 } 194 195 function testFootnotePreformattedEol() { 196 $this->P->addMode('preformatted',new Preformatted()); 197 $this->P->addMode('eol',new Eol()); 198 $this->P->parse("Foo (( \n Test\n )) Bar"); 199 $calls = array ( 200 array('document_start',array()), 201 array('p_open',array()), 202 array('cdata',array('Foo ')), 203 array('nest', array ( array ( 204 array('footnote_open',array()), 205 array('cdata',array(' ')), 206 array('preformatted',array('Test')), 207 array('cdata',array(' ')), 208 array('footnote_close',array()), 209 ))), 210 array('cdata',array(' Bar')), 211 array('p_close',array()), 212 array('document_end',array()), 213 ); 214 215 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 216 } 217 218 function testFootnoteUnformatted() { 219 $this->P->addMode('unformatted',new Unformatted()); 220 $this->P->parse("Foo (( <nowiki>Test</nowiki> )) Bar"); 221 $calls = array ( 222 array('document_start',array()), 223 array('p_open',array()), 224 array('cdata',array("\n".'Foo ')), 225 array('nest', array ( array ( 226 array('footnote_open',array()), 227 array('cdata',array(' ')), 228 array('unformatted',array('Test')), 229 array('cdata',array(' ')), 230 array('footnote_close',array()), 231 ))), 232 array('cdata',array(' Bar')), 233 array('p_close',array()), 234 array('document_end',array()), 235 ); 236 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 237 } 238 239 function testFootnoteNotHeader() { 240 $this->P->addMode('unformatted',new Unformatted()); 241 $this->P->parse("Foo (( \n====Test====\n )) Bar"); 242 $calls = array ( 243 array('document_start',array()), 244 array('p_open',array()), 245 array('cdata',array("\n".'Foo ')), 246 array('nest', array ( array ( 247 array('footnote_open',array()), 248 array('cdata',array(" \n====Test====\n ")), 249 array('footnote_close',array()), 250 ))), 251 array('cdata',array(' Bar')), 252 array('p_close',array()), 253 array('document_end',array()), 254 ); 255 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 256 } 257 258 function testFootnoteTable() { 259 $this->P->addMode('table',new Table()); 260 $this->P->parse("Foo (( 261| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | 262| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 263 )) Bar"); 264 $calls = array ( 265 array('document_start',array()), 266 array('p_open',array()), 267 array('cdata',array("\n".'Foo ')), 268 array('nest', array ( array ( 269 array('footnote_open',array()), 270 array('table_open',array(3, 2, 8)), 271 array('tablerow_open',array()), 272 array('tablecell_open',array(1,'left',1)), 273 array('cdata',array(' Row 0 Col 1 ')), 274 array('tablecell_close',array()), 275 array('tablecell_open',array(1,'left',1)), 276 array('cdata',array(' Row 0 Col 2 ')), 277 array('tablecell_close',array()), 278 array('tablecell_open',array(1,'left',1)), 279 array('cdata',array(' Row 0 Col 3 ')), 280 array('tablecell_close',array()), 281 array('tablerow_close',array()), 282 array('tablerow_open',array()), 283 array('tablecell_open',array(1,'left',1)), 284 array('cdata',array(' Row 1 Col 1 ')), 285 array('tablecell_close',array()), 286 array('tablecell_open',array(1,'left',1)), 287 array('cdata',array(' Row 1 Col 2 ')), 288 array('tablecell_close',array()), 289 array('tablecell_open',array(1,'left',1)), 290 array('cdata',array(' Row 1 Col 3 ')), 291 array('tablecell_close',array()), 292 array('tablerow_close',array()), 293 array('table_close',array(123)), 294 array('cdata',array(' ')), 295 array('footnote_close',array()), 296 ))), 297 array('cdata',array(' Bar')), 298 array('p_close',array()), 299 array('document_end',array()), 300 ); 301 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 302 } 303 304 function testFootnoteList() { 305 $this->P->addMode('listblock',new ListBlock()); 306 $this->P->parse("Foo (( 307 *A 308 * B 309 * C 310 )) Bar"); 311 $calls = array ( 312 array('document_start',array()), 313 array('p_open',array()), 314 array('cdata',array("\n".'Foo ')), 315 array('nest', array ( array ( 316 array('footnote_open',array()), 317 array('listu_open',array()), 318 array('listitem_open',array(1,Doku_Handler_List::NODE)), 319 array('listcontent_open',array()), 320 array('cdata',array("A")), 321 array('listcontent_close',array()), 322 array('listu_open',array()), 323 array('listitem_open',array(2)), 324 array('listcontent_open',array()), 325 array('cdata',array(' B')), 326 array('listcontent_close',array()), 327 array('listitem_close',array()), 328 array('listu_close',array()), 329 array('listitem_close',array()), 330 array('listitem_open',array(1)), 331 array('listcontent_open',array()), 332 array('cdata',array(' C')), 333 array('listcontent_close',array()), 334 array('listitem_close',array()), 335 array('listu_close',array()), 336 array('cdata',array(' ')), 337 array('footnote_close',array()), 338 ))), 339 array('cdata',array(' Bar')), 340 array('p_close',array()), 341 array('document_end',array()), 342 ); 343 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 344 } 345 346 function testFootnoteQuote() { 347 $this->P->addMode('quote',new Quote()); 348 $this->P->parse("Foo (( 349> def 350>>ghi 351 )) Bar"); 352 $calls = array ( 353 array('document_start',array()), 354 array('p_open',array()), 355 array('cdata',array("\n".'Foo ')), 356 array('nest', array ( array ( 357 array('footnote_open',array()), 358 array('quote_open',array()), 359 array('cdata',array(" def")), 360 array('quote_open',array()), 361 array('cdata',array("ghi")), 362 array('quote_close',array()), 363 array('quote_close',array()), 364 array('cdata',array(' ')), 365 array('footnote_close',array()), 366 ))), 367 array('cdata',array(' Bar')), 368 array('p_close',array()), 369 array('document_end',array()), 370 ); 371 372 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 373 } 374 375 function testFootnoteNesting() { 376 $this->P->addMode('strong',new Formatting('strong')); 377 $this->P->parse("(( a ** (( b )) ** c ))"); 378 379 $calls = array( 380 array('document_start',array()), 381 array('p_open',array()), 382 array('cdata',array("\n")), 383 array('nest', array ( array ( 384 array('footnote_open',array()), 385 array('cdata',array(' a ')), 386 array('strong_open',array()), 387 array('cdata',array(' (( b ')), 388 array('footnote_close',array()), 389 ))), 390 array('cdata',array(" ")), 391 array('strong_close',array()), 392 array('cdata',array(" c ))")), 393 array('p_close',array()), 394 array('document_end',array()), 395 ); 396 397 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 398 } 399} 400 401