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