1<?php 2require_once 'parser.inc.php'; 3 4class TestOfDoku_Parser_Table extends TestOfDoku_Parser { 5 6 function testTable() { 7 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 8 $this->P->parse(' 9abc 10| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | 11| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 12def'); 13 $calls = array ( 14 array('document_start',array()), 15 array('p_open',array()), 16 array('cdata',array("\n\nabc")), 17 array('p_close',array()), 18 array('table_open',array(3, 2, 6)), 19 array('tablerow_open',array()), 20 array('tablecell_open',array(1,'left',1)), 21 array('cdata',array(' Row 0 Col 1 ')), 22 array('tablecell_close',array()), 23 array('tablecell_open',array(1,'left',1)), 24 array('cdata',array(' Row 0 Col 2 ')), 25 array('tablecell_close',array()), 26 array('tablecell_open',array(1,'left',1)), 27 array('cdata',array(' Row 0 Col 3 ')), 28 array('tablecell_close',array()), 29 array('tablerow_close',array()), 30 array('tablerow_open',array()), 31 array('tablecell_open',array(1,'left',1)), 32 array('cdata',array(' Row 1 Col 1 ')), 33 array('tablecell_close',array()), 34 array('tablecell_open',array(1,'left',1)), 35 array('cdata',array(' Row 1 Col 2 ')), 36 array('tablecell_close',array()), 37 array('tablecell_open',array(1,'left',1)), 38 array('cdata',array(' Row 1 Col 3 ')), 39 array('tablecell_close',array()), 40 array('tablerow_close',array()), 41 array('table_close',array(121)), 42 array('p_open',array()), 43 array('cdata',array('def')), 44 array('p_close',array()), 45 array('document_end',array()), 46 ); 47 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 48 } 49 50 function testTableWinEOL() { 51 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 52 $this->P->parse("\r\nabc\r\n| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |\r\n| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |\r\ndef"); 53 $calls = array ( 54 array('document_start',array()), 55 array('p_open',array()), 56 array('cdata',array("\n\nabc")), 57 array('p_close',array()), 58 array('table_open',array(3, 2, 6)), 59 array('tablerow_open',array()), 60 array('tablecell_open',array(1,'left',1)), 61 array('cdata',array(' Row 0 Col 1 ')), 62 array('tablecell_close',array()), 63 array('tablecell_open',array(1,'left',1)), 64 array('cdata',array(' Row 0 Col 2 ')), 65 array('tablecell_close',array()), 66 array('tablecell_open',array(1,'left',1)), 67 array('cdata',array(' Row 0 Col 3 ')), 68 array('tablecell_close',array()), 69 array('tablerow_close',array()), 70 array('tablerow_open',array()), 71 array('tablecell_open',array(1,'left',1)), 72 array('cdata',array(' Row 1 Col 1 ')), 73 array('tablecell_close',array()), 74 array('tablecell_open',array(1,'left',1)), 75 array('cdata',array(' Row 1 Col 2 ')), 76 array('tablecell_close',array()), 77 array('tablecell_open',array(1,'left',1)), 78 array('cdata',array(' Row 1 Col 3 ')), 79 array('tablecell_close',array()), 80 array('tablerow_close',array()), 81 array('table_close',array(121)), 82 array('p_open',array()), 83 array('cdata',array('def')), 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 testEmptyTable() { 91 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 92 $this->P->parse(' 93abc 94| 95def'); 96 97 $calls = array ( 98 array('document_start',array()), 99 array('p_open',array()), 100 array('cdata',array("\n\nabc")), 101 array('p_close',array()), 102 array('table_open',array(0, 1, 6)), 103 array('tablerow_open',array()), 104 array('tablerow_close',array()), 105 array('table_close',array(7)), 106 array('p_open',array()), 107 array('cdata',array('def')), 108 array('p_close',array()), 109 array('document_end',array()), 110 ); 111 112 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 113 } 114 115 function testTableHeaders() { 116 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 117 $this->P->parse(' 118abc 119^ X | Y ^ Z | 120def'); 121 122 $calls = array ( 123 array('document_start',array()), 124 array('p_open',array()), 125 array('cdata',array("\n\nabc")), 126 array('p_close',array()), 127 array('table_open',array(3, 1, 6)), 128 array('tablerow_open',array()), 129 array('tableheader_open',array(1,NULL,1)), 130 array('cdata',array(' X ')), 131 array('tableheader_close',array()), 132 array('tablecell_open',array(1,NULL,1)), 133 array('cdata',array(' Y ')), 134 array('tablecell_close',array()), 135 array('tableheader_open',array(1,NULL,1)), 136 array('cdata',array(' Z ')), 137 array('tableheader_close',array()), 138 array('tablerow_close',array()), 139 array('table_close',array(19)), 140 array('p_open',array()), 141 array('cdata',array('def')), 142 array('p_close',array()), 143 array('document_end',array()), 144 ); 145 146 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 147 148 } 149 150 function testCellAlignment() { 151 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 152 $this->P->parse(' 153abc 154| X | Y ^ Z | 155def'); 156 157 $calls = array ( 158 array('document_start',array()), 159 array('p_open',array()), 160 array('cdata',array("\n\nabc")), 161 array('p_close',array()), 162 array('table_open',array(3, 1, 6)), 163 array('tablerow_open',array()), 164 array('tablecell_open',array(1,'right',1)), 165 array('cdata',array(' X ')), 166 array('tablecell_close',array()), 167 array('tablecell_open',array(1,'left',1)), 168 array('cdata',array(' Y ')), 169 array('tablecell_close',array()), 170 array('tableheader_open',array(1,'center',1)), 171 array('cdata',array(' Z ')), 172 array('tableheader_close',array()), 173 array('tablerow_close',array()), 174 array('table_close',array(23)), 175 array('p_open',array()), 176 array('cdata',array('def')), 177 array('p_close',array()), 178 array('document_end',array()), 179 ); 180 181 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 182 } 183 184 function testCellSpan() { 185 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 186 $this->P->parse(' 187abc 188| d || e | 189| f ^ ^| 190|||| 191def'); 192 193 $calls = array ( 194 array('document_start',array()), 195 array('p_open',array()), 196 array('cdata',array("\n\nabc")), 197 array('p_close',array()), 198 array('table_open',array(3, 3, 6)), 199 array('tablerow_open',array()), 200 array('tablecell_open',array(2,'right',1)), 201 array('cdata',array(' d ')), 202 array('tablecell_close',array()), 203 array('tablecell_open',array(1,NULL,1)), 204 array('cdata',array(' e ')), 205 array('tablecell_close',array()), 206 array('tablerow_close',array()), 207 array('tablerow_open',array()), 208 array('tablecell_open',array(1,NULL,1)), 209 array('cdata',array(' f ')), 210 array('tablecell_close',array()), 211 array('tableheader_open',array(2,NULL,1)), 212 array('cdata',array(' ')), 213 array('tableheader_close',array()), 214 array('tablerow_close',array()), 215 array('tablerow_open',array()), 216 array('tablerow_close',array()), 217 array('table_close',array(31)), 218 array('p_open',array()), 219 array('cdata',array('def')), 220 array('p_close',array()), 221 array('document_end',array()), 222 ); 223 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 224 } 225 226 function testCellRowSpan() { 227 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 228 $this->P->parse(' 229abc 230| a | c:::|| 231|:::^ d | e| 232|b ^ ::: |:::f| 233def'); 234 235 $calls = array ( 236 array('document_start',array()), 237 array('p_open',array()), 238 array('cdata',array("\n\nabc")), 239 array('p_close',array()), 240 array('table_open',array(3, 3, 6)), 241 array('tablerow_open',array()), 242 array('tablecell_open',array(1,NULL,2)), 243 array('cdata',array(' a ')), 244 array('tablecell_close',array()), 245 array('tablecell_open',array(2,'right',1)), 246 array('cdata',array(' c:::')), 247 array('tablecell_close',array()), 248 array('tablerow_close',array()), 249 array('tablerow_open',array()), 250 array('tableheader_open',array(1,'left',2)), 251 array('cdata',array(' d ')), 252 array('tableheader_close',array()), 253 array('tablecell_open',array(1,NULL,1)), 254 array('cdata',array(' e')), 255 array('tablecell_close',array()), 256 array('tablerow_close',array()), 257 array('tablerow_open',array()), 258 array('tablecell_open',array(1,'left',1)), 259 array('cdata',array('b ')), 260 array('tablecell_close',array()), 261 array('tablecell_open',array(1,NULL,1)), 262 array('cdata',array(':::f')), 263 array('tablecell_close',array()), 264 array('tablerow_close',array()), 265 array('table_close',array(51)), 266 array('p_open',array()), 267 array('cdata',array('def')), 268 array('p_close',array()), 269 array('document_end',array()), 270 ); 271 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 272 } 273 274 function testCellAlignmentFormatting() { 275 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 276 $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); 277 $this->P->parse(' 278abc 279| **X** | Y ^ Z | 280def'); 281 282 $calls = array ( 283 array('document_start',array()), 284 array('p_open',array()), 285 array('cdata',array("\n\nabc")), 286 array('p_close',array()), 287 array('table_open',array(3, 1, 6)), 288 array('tablerow_open',array()), 289 array('tablecell_open',array(1,'right',1)), 290 array('cdata',array(' ')), 291 array('strong_open',array()), 292 array('cdata',array('X')), 293 array('strong_close',array()), 294 array('cdata',array(' ')), 295 array('tablecell_close',array()), 296 array('tablecell_open',array(1,'left',1)), 297 array('cdata',array(' Y ')), 298 array('tablecell_close',array()), 299 array('tableheader_open',array(1,'center',1)), 300 array('cdata',array(' Z ')), 301 array('tableheader_close',array()), 302 array('tablerow_close',array()), 303 array('table_close',array(27)), 304 array('p_open',array()), 305 array('cdata',array('def')), 306 array('p_close',array()), 307 array('document_end',array()), 308 ); 309 310 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 311 312 } 313 314 function testTableEol() { 315 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 316 $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); 317 $this->P->parse(' 318abc 319| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | 320| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 321def'); 322 $calls = array ( 323 array('document_start',array()), 324 array('p_open',array()), 325 array('cdata',array("abc")), 326 array('p_close',array()), 327 array('table_open',array(3, 2, 6)), 328 array('tablerow_open',array()), 329 array('tablecell_open',array(1,'left',1)), 330 array('cdata',array(' Row 0 Col 1 ')), 331 array('tablecell_close',array()), 332 array('tablecell_open',array(1,'left',1)), 333 array('cdata',array(' Row 0 Col 2 ')), 334 array('tablecell_close',array()), 335 array('tablecell_open',array(1,'left',1)), 336 array('cdata',array(' Row 0 Col 3 ')), 337 array('tablecell_close',array()), 338 array('tablerow_close',array()), 339 array('tablerow_open',array()), 340 array('tablecell_open',array(1,'left',1)), 341 array('cdata',array(' Row 1 Col 1 ')), 342 array('tablecell_close',array()), 343 array('tablecell_open',array(1,'left',1)), 344 array('cdata',array(' Row 1 Col 2 ')), 345 array('tablecell_close',array()), 346 array('tablecell_open',array(1,'left',1)), 347 array('cdata',array(' Row 1 Col 3 ')), 348 array('tablecell_close',array()), 349 array('tablerow_close',array()), 350 array('table_close',array(121)), 351 array('p_open',array()), 352 array('cdata',array('def')), 353 array('p_close',array()), 354 array('document_end',array()), 355 ); 356 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 357 } 358 359 // This is really a failing test - formatting able to spread across cols 360 // Problem is fixing it would mean a major rewrite of table handling 361 function testTableStrong() { 362 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 363 $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); 364 $this->P->parse(' 365abc 366| **Row 0 Col 1** | **Row 0 Col 2 | Row 0 Col 3** | 367| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 368def'); 369 $calls = array ( 370 array('document_start',array()), 371 array('p_open',array()), 372 array('cdata',array("\n\nabc")), 373 array('p_close',array()), 374 array('table_open',array(3, 2, 6)), 375 array('tablerow_open',array()), 376 array('tablecell_open',array(1,'left',1)), 377 array('cdata',array(' ')), 378 array('strong_open',array()), 379 array('cdata',array('Row 0 Col 1')), 380 array('strong_close',array()), 381 array('cdata',array(' ')), 382 array('tablecell_close',array()), 383 array('tablecell_open',array(1,'left',1)), 384 array('cdata',array(' ')), 385 array('strong_open',array()), 386 array('cdata',array('Row 0 Col 2 | Row 0 Col 3')), 387 array('strong_close',array()), 388 array('cdata',array(' ')), 389 array('tablecell_close',array()), 390 array('tablecell_open',array(1,null,1)), 391 array('cdata',array('')), 392 array('tablecell_close',array()), 393 array('tablerow_close',array()), 394 array('tablerow_open',array()), 395 array('tablecell_open',array(1,'left',1)), 396 array('cdata',array(' Row 1 Col 1 ')), 397 array('tablecell_close',array()), 398 array('tablecell_open',array(1,'left',1)), 399 array('cdata',array(' Row 1 Col 2 ')), 400 array('tablecell_close',array()), 401 array('tablecell_open',array(1,'left',1)), 402 array('cdata',array(' Row 1 Col 3 ')), 403 array('tablecell_close',array()), 404 array('tablerow_close',array()), 405 array('table_close',array(129)), 406 array('p_open',array()), 407 array('cdata',array('def')), 408 array('p_close',array()), 409 array('document_end',array()), 410 ); 411 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 412 } 413 414 // This is really a failing test - unformatted able to spread across cols 415 // Problem is fixing it would mean a major rewrite of table handling 416 function testTableUnformatted() { 417 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 418 $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); 419 $this->P->parse(' 420abc 421| <nowiki>Row 0 Col 1</nowiki> | <nowiki>Row 0 Col 2 | Row 0 Col 3</nowiki> | 422| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 423def'); 424 $calls = array ( 425 array('document_start',array()), 426 array('p_open',array()), 427 array('cdata',array("\n\nabc")), 428 array('p_close',array()), 429 array('table_open',array(3, 2, 6)), 430 array('tablerow_open',array()), 431 array('tablecell_open',array(1,'left',1)), 432 array('cdata',array(' ')), 433 array('unformatted',array('Row 0 Col 1')), 434 array('cdata',array(' ')), 435 array('tablecell_close',array()), 436 array('tablecell_open',array(1,'left',1)), 437 array('cdata',array(' ')), 438 array('unformatted',array('Row 0 Col 2 | Row 0 Col 3')), 439 array('cdata',array(' ')), 440 array('tablecell_close',array()), 441 array('tablecell_open',array(1,null,1)), 442 array('cdata',array('')), 443 array('tablecell_close',array()), 444 array('tablerow_close',array()), 445 array('tablerow_open',array()), 446 array('tablecell_open',array(1,'left',1)), 447 array('cdata',array(' Row 1 Col 1 ')), 448 array('tablecell_close',array()), 449 array('tablecell_open',array(1,'left',1)), 450 array('cdata',array(' Row 1 Col 2 ')), 451 array('tablecell_close',array()), 452 array('tablecell_open',array(1,'left',1)), 453 array('cdata',array(' Row 1 Col 3 ')), 454 array('tablecell_close',array()), 455 array('tablerow_close',array()), 456 array('table_close',array(155)), 457 array('p_open',array()), 458 array('cdata',array('def')), 459 array('p_close',array()), 460 array('document_end',array()), 461 ); 462 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 463 } 464 465 function testTableLinebreak() { 466 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 467 $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); 468 $this->P->parse(' 469abc 470| Row 0\\\\ Col 1 | Row 0 Col 2 | Row 0 Col 3 | 471| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 472def'); 473 $calls = array ( 474 array('document_start',array()), 475 array('p_open',array()), 476 array('cdata',array("\n\nabc")), 477 array('p_close',array()), 478 array('table_open',array(3, 2, 6)), 479 array('tablerow_open',array()), 480 array('tablecell_open',array(1,'left',1)), 481 array('cdata',array(' Row 0')), 482 array('linebreak',array()), 483 array('cdata',array('Col 1 ')), 484 array('tablecell_close',array()), 485 array('tablecell_open',array(1,'left',1)), 486 array('cdata',array(' Row 0 Col 2 ')), 487 array('tablecell_close',array()), 488 array('tablecell_open',array(1,'left',1)), 489 array('cdata',array(' Row 0 Col 3 ')), 490 array('tablecell_close',array()), 491 array('tablerow_close',array()), 492 array('tablerow_open',array()), 493 array('tablecell_open',array(1,'left',1)), 494 array('cdata',array(' Row 1 Col 1 ')), 495 array('tablecell_close',array()), 496 array('tablecell_open',array(1,'left',1)), 497 array('cdata',array(' Row 1 Col 2 ')), 498 array('tablecell_close',array()), 499 array('tablecell_open',array(1,'left',1)), 500 array('cdata',array(' Row 1 Col 3 ')), 501 array('tablecell_close',array()), 502 array('tablerow_close',array()), 503 array('table_close',array(123)), 504 array('p_open',array()), 505 array('cdata',array('def')), 506 array('p_close',array()), 507 array('document_end',array()), 508 ); 509 510 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 511 } 512 513 // This is really a failing test - footnote able to spread across cols 514 // Problem is fixing it would mean a major rewrite of table handling 515 function testTableFootnote() { 516 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 517 $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote()); 518 $this->P->parse(' 519abc 520| ((Row 0 Col 1)) | ((Row 0 Col 2 | Row 0 Col 3)) | 521| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 522def'); 523 $calls = array ( 524 array('document_start',array()), 525 array('p_open',array()), 526 array('cdata',array("\n\nabc")), 527 array('p_close',array()), 528 array('table_open',array(3, 2, 6)), 529 array('tablerow_open',array()), 530 array('tablecell_open',array(1,'left',1)), 531 array('cdata',array(' ')), 532 array('nest', array ( array ( 533 array('footnote_open',array()), 534 array('cdata',array('Row 0 Col 1')), 535 array('footnote_close',array()), 536 ))), 537 array('cdata',array(' ')), 538 array('tablecell_close',array()), 539 array('tablecell_open',array(1,'left',1)), 540 array('cdata',array(' ')), 541 array('nest', array ( array ( 542 array('footnote_open',array()), 543 array('cdata',array('Row 0 Col 2 | Row 0 Col 3')), 544 array('footnote_close',array()), 545 ))), 546 array('cdata',array(' ')), 547 array('tablecell_close',array()), 548 array('tablecell_open',array(1,null,1)), 549 array('cdata',array('')), 550 array('tablecell_close',array()), 551 array('tablerow_close',array()), 552 array('tablerow_open',array()), 553 array('tablecell_open',array(1,'left',1)), 554 array('cdata',array(' Row 1 Col 1 ')), 555 array('tablecell_close',array()), 556 array('tablecell_open',array(1,'left',1)), 557 array('cdata',array(' Row 1 Col 2 ')), 558 array('tablecell_close',array()), 559 array('tablecell_open',array(1,'left',1)), 560 array('cdata',array(' Row 1 Col 3 ')), 561 array('tablecell_close',array()), 562 array('tablerow_close',array()), 563 array('table_close',array(129)), 564 array('p_open',array()), 565 array('cdata',array('def')), 566 array('p_close',array()), 567 array('document_end',array()), 568 ); 569 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 570 } 571} 572 573