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 testCellRowSpanFirstRow() { 275 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 276 $this->P->parse(' 277abc 278|::: ^ d:::^:::| ::: | 279| b ^ e | | ::: | 280|c ^ ::: | |:::| 281def'); 282 283 $calls = array ( 284 array('document_start',array()), 285 array('p_open',array()), 286 array('cdata',array("\n\nabc")), 287 array('p_close',array()), 288 array('table_open',array(4, 3, 6)), 289 array('tablerow_open',array()), 290 array('tablecell_open',array(1,NULL,1)), 291 array('cdata',array('')), 292 array('tablecell_close',array()), 293 array('tableheader_open',array(1,'right',1)), 294 array('cdata',array(' d:::')), 295 array('tableheader_close',array()), 296 array('tableheader_open',array(1,NULL,1)), 297 array('cdata',array('')), 298 array('tableheader_close',array()), 299 array('tablecell_open',array(1,NULL,3)), 300 array('cdata',array('')), 301 array('tablecell_close',array()), 302 array('tablerow_close',array()), 303 array('tablerow_open',array()), 304 array('tablecell_open',array(1,NULL,1)), 305 array('cdata',array(' b ')), 306 array('tablecell_close',array()), 307 array('tableheader_open',array(1,'left',2)), 308 array('cdata',array(' e ')), 309 array('tableheader_close',array()), 310 array('tablecell_open',array(1,NULL,1)), 311 array('cdata',array(' ')), 312 array('tablecell_close',array()), 313 array('tablerow_close',array()), 314 array('tablerow_open',array()), 315 array('tablecell_open',array(1,'left',1)), 316 array('cdata',array('c ')), 317 array('tablecell_close',array()), 318 array('tablecell_open',array(1,NULL,1)), 319 array('cdata',array(' ')), 320 array('tablecell_close',array()), 321 array('tablerow_close',array()), 322 323 array('table_close',array(69)), 324 array('p_open',array()), 325 array('cdata',array('def')), 326 array('p_close',array()), 327 array('document_end',array()), 328 ); 329 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 330 } 331 332 function testCellAlignmentFormatting() { 333 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 334 $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); 335 $this->P->parse(' 336abc 337| **X** | Y ^ Z | 338def'); 339 340 $calls = array ( 341 array('document_start',array()), 342 array('p_open',array()), 343 array('cdata',array("\n\nabc")), 344 array('p_close',array()), 345 array('table_open',array(3, 1, 6)), 346 array('tablerow_open',array()), 347 array('tablecell_open',array(1,'right',1)), 348 array('cdata',array(' ')), 349 array('strong_open',array()), 350 array('cdata',array('X')), 351 array('strong_close',array()), 352 array('cdata',array(' ')), 353 array('tablecell_close',array()), 354 array('tablecell_open',array(1,'left',1)), 355 array('cdata',array(' Y ')), 356 array('tablecell_close',array()), 357 array('tableheader_open',array(1,'center',1)), 358 array('cdata',array(' Z ')), 359 array('tableheader_close',array()), 360 array('tablerow_close',array()), 361 array('table_close',array(27)), 362 array('p_open',array()), 363 array('cdata',array('def')), 364 array('p_close',array()), 365 array('document_end',array()), 366 ); 367 368 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 369 370 } 371 372 function testTableEol() { 373 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 374 $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); 375 $this->P->parse(' 376abc 377| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | 378| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 379def'); 380 $calls = array ( 381 array('document_start',array()), 382 array('p_open',array()), 383 array('cdata',array("abc")), 384 array('p_close',array()), 385 array('table_open',array(3, 2, 6)), 386 array('tablerow_open',array()), 387 array('tablecell_open',array(1,'left',1)), 388 array('cdata',array(' Row 0 Col 1 ')), 389 array('tablecell_close',array()), 390 array('tablecell_open',array(1,'left',1)), 391 array('cdata',array(' Row 0 Col 2 ')), 392 array('tablecell_close',array()), 393 array('tablecell_open',array(1,'left',1)), 394 array('cdata',array(' Row 0 Col 3 ')), 395 array('tablecell_close',array()), 396 array('tablerow_close',array()), 397 array('tablerow_open',array()), 398 array('tablecell_open',array(1,'left',1)), 399 array('cdata',array(' Row 1 Col 1 ')), 400 array('tablecell_close',array()), 401 array('tablecell_open',array(1,'left',1)), 402 array('cdata',array(' Row 1 Col 2 ')), 403 array('tablecell_close',array()), 404 array('tablecell_open',array(1,'left',1)), 405 array('cdata',array(' Row 1 Col 3 ')), 406 array('tablecell_close',array()), 407 array('tablerow_close',array()), 408 array('table_close',array(121)), 409 array('p_open',array()), 410 array('cdata',array('def')), 411 array('p_close',array()), 412 array('document_end',array()), 413 ); 414 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 415 } 416 417 // This is really a failing test - formatting able to spread across cols 418 // Problem is fixing it would mean a major rewrite of table handling 419 function testTableStrong() { 420 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 421 $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); 422 $this->P->parse(' 423abc 424| **Row 0 Col 1** | **Row 0 Col 2 | Row 0 Col 3** | 425| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 426def'); 427 $calls = array ( 428 array('document_start',array()), 429 array('p_open',array()), 430 array('cdata',array("\n\nabc")), 431 array('p_close',array()), 432 array('table_open',array(3, 2, 6)), 433 array('tablerow_open',array()), 434 array('tablecell_open',array(1,'left',1)), 435 array('cdata',array(' ')), 436 array('strong_open',array()), 437 array('cdata',array('Row 0 Col 1')), 438 array('strong_close',array()), 439 array('cdata',array(' ')), 440 array('tablecell_close',array()), 441 array('tablecell_open',array(1,'left',1)), 442 array('cdata',array(' ')), 443 array('strong_open',array()), 444 array('cdata',array('Row 0 Col 2 | Row 0 Col 3')), 445 array('strong_close',array()), 446 array('cdata',array(' ')), 447 array('tablecell_close',array()), 448 array('tablecell_open',array(1,null,1)), 449 array('cdata',array('')), 450 array('tablecell_close',array()), 451 array('tablerow_close',array()), 452 array('tablerow_open',array()), 453 array('tablecell_open',array(1,'left',1)), 454 array('cdata',array(' Row 1 Col 1 ')), 455 array('tablecell_close',array()), 456 array('tablecell_open',array(1,'left',1)), 457 array('cdata',array(' Row 1 Col 2 ')), 458 array('tablecell_close',array()), 459 array('tablecell_open',array(1,'left',1)), 460 array('cdata',array(' Row 1 Col 3 ')), 461 array('tablecell_close',array()), 462 array('tablerow_close',array()), 463 array('table_close',array(129)), 464 array('p_open',array()), 465 array('cdata',array('def')), 466 array('p_close',array()), 467 array('document_end',array()), 468 ); 469 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 470 } 471 472 // This is really a failing test - unformatted able to spread across cols 473 // Problem is fixing it would mean a major rewrite of table handling 474 function testTableUnformatted() { 475 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 476 $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); 477 $this->P->parse(' 478abc 479| <nowiki>Row 0 Col 1</nowiki> | <nowiki>Row 0 Col 2 | Row 0 Col 3</nowiki> | 480| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 481def'); 482 $calls = array ( 483 array('document_start',array()), 484 array('p_open',array()), 485 array('cdata',array("\n\nabc")), 486 array('p_close',array()), 487 array('table_open',array(3, 2, 6)), 488 array('tablerow_open',array()), 489 array('tablecell_open',array(1,'left',1)), 490 array('cdata',array(' ')), 491 array('unformatted',array('Row 0 Col 1')), 492 array('cdata',array(' ')), 493 array('tablecell_close',array()), 494 array('tablecell_open',array(1,'left',1)), 495 array('cdata',array(' ')), 496 array('unformatted',array('Row 0 Col 2 | Row 0 Col 3')), 497 array('cdata',array(' ')), 498 array('tablecell_close',array()), 499 array('tablecell_open',array(1,null,1)), 500 array('cdata',array('')), 501 array('tablecell_close',array()), 502 array('tablerow_close',array()), 503 array('tablerow_open',array()), 504 array('tablecell_open',array(1,'left',1)), 505 array('cdata',array(' Row 1 Col 1 ')), 506 array('tablecell_close',array()), 507 array('tablecell_open',array(1,'left',1)), 508 array('cdata',array(' Row 1 Col 2 ')), 509 array('tablecell_close',array()), 510 array('tablecell_open',array(1,'left',1)), 511 array('cdata',array(' Row 1 Col 3 ')), 512 array('tablecell_close',array()), 513 array('tablerow_close',array()), 514 array('table_close',array(155)), 515 array('p_open',array()), 516 array('cdata',array('def')), 517 array('p_close',array()), 518 array('document_end',array()), 519 ); 520 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 521 } 522 523 function testTableLinebreak() { 524 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 525 $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); 526 $this->P->parse(' 527abc 528| Row 0\\\\ Col 1 | Row 0 Col 2 | Row 0 Col 3 | 529| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 530def'); 531 $calls = array ( 532 array('document_start',array()), 533 array('p_open',array()), 534 array('cdata',array("\n\nabc")), 535 array('p_close',array()), 536 array('table_open',array(3, 2, 6)), 537 array('tablerow_open',array()), 538 array('tablecell_open',array(1,'left',1)), 539 array('cdata',array(' Row 0')), 540 array('linebreak',array()), 541 array('cdata',array('Col 1 ')), 542 array('tablecell_close',array()), 543 array('tablecell_open',array(1,'left',1)), 544 array('cdata',array(' Row 0 Col 2 ')), 545 array('tablecell_close',array()), 546 array('tablecell_open',array(1,'left',1)), 547 array('cdata',array(' Row 0 Col 3 ')), 548 array('tablecell_close',array()), 549 array('tablerow_close',array()), 550 array('tablerow_open',array()), 551 array('tablecell_open',array(1,'left',1)), 552 array('cdata',array(' Row 1 Col 1 ')), 553 array('tablecell_close',array()), 554 array('tablecell_open',array(1,'left',1)), 555 array('cdata',array(' Row 1 Col 2 ')), 556 array('tablecell_close',array()), 557 array('tablecell_open',array(1,'left',1)), 558 array('cdata',array(' Row 1 Col 3 ')), 559 array('tablecell_close',array()), 560 array('tablerow_close',array()), 561 array('table_close',array(123)), 562 array('p_open',array()), 563 array('cdata',array('def')), 564 array('p_close',array()), 565 array('document_end',array()), 566 ); 567 568 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 569 } 570 571 // This is really a failing test - footnote able to spread across cols 572 // Problem is fixing it would mean a major rewrite of table handling 573 function testTableFootnote() { 574 $this->P->addMode('table',new Doku_Parser_Mode_Table()); 575 $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote()); 576 $this->P->parse(' 577abc 578| ((Row 0 Col 1)) | ((Row 0 Col 2 | Row 0 Col 3)) | 579| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | 580def'); 581 $calls = array ( 582 array('document_start',array()), 583 array('p_open',array()), 584 array('cdata',array("\n\nabc")), 585 array('p_close',array()), 586 array('table_open',array(3, 2, 6)), 587 array('tablerow_open',array()), 588 array('tablecell_open',array(1,'left',1)), 589 array('cdata',array(' ')), 590 array('nest', array ( array ( 591 array('footnote_open',array()), 592 array('cdata',array('Row 0 Col 1')), 593 array('footnote_close',array()), 594 ))), 595 array('cdata',array(' ')), 596 array('tablecell_close',array()), 597 array('tablecell_open',array(1,'left',1)), 598 array('cdata',array(' ')), 599 array('nest', array ( array ( 600 array('footnote_open',array()), 601 array('cdata',array('Row 0 Col 2 | Row 0 Col 3')), 602 array('footnote_close',array()), 603 ))), 604 array('cdata',array(' ')), 605 array('tablecell_close',array()), 606 array('tablecell_open',array(1,null,1)), 607 array('cdata',array('')), 608 array('tablecell_close',array()), 609 array('tablerow_close',array()), 610 array('tablerow_open',array()), 611 array('tablecell_open',array(1,'left',1)), 612 array('cdata',array(' Row 1 Col 1 ')), 613 array('tablecell_close',array()), 614 array('tablecell_open',array(1,'left',1)), 615 array('cdata',array(' Row 1 Col 2 ')), 616 array('tablecell_close',array()), 617 array('tablecell_open',array(1,'left',1)), 618 array('cdata',array(' Row 1 Col 3 ')), 619 array('tablecell_close',array()), 620 array('tablerow_close',array()), 621 array('table_close',array(129)), 622 array('p_open',array()), 623 array('cdata',array('def')), 624 array('p_close',array()), 625 array('document_end',array()), 626 ); 627 $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls); 628 } 629} 630 631