1<?php
2
3use dokuwiki\Parsing\ParserMode\Eol;
4use dokuwiki\Parsing\ParserMode\Footnote;
5use dokuwiki\Parsing\ParserMode\Formatting;
6use dokuwiki\Parsing\ParserMode\Linebreak;
7use dokuwiki\Parsing\ParserMode\Table;
8use dokuwiki\Parsing\ParserMode\Unformatted;
9
10require_once 'parser.inc.php';
11
12class TestOfDoku_Parser_Table extends TestOfDoku_Parser {
13
14    function testTable() {
15        $this->P->addMode('table',new Table());
16        $this->P->parse('
17abc
18| Row 0 Col 1    | Row 0 Col 2     | Row 0 Col 3        |
19| Row 1 Col 1    | Row 1 Col 2     | Row 1 Col 3        |
20def');
21        $calls = array (
22            array('document_start',array()),
23            array('p_open',array()),
24            array('cdata',array("\n\nabc")),
25            array('p_close',array()),
26            array('table_open',array(3, 2, 6)),
27            array('tablerow_open',array()),
28            array('tablecell_open',array(1,'left',1)),
29            array('cdata',array(' Row 0 Col 1    ')),
30            array('tablecell_close',array()),
31            array('tablecell_open',array(1,'left',1)),
32            array('cdata',array(' Row 0 Col 2     ')),
33            array('tablecell_close',array()),
34            array('tablecell_open',array(1,'left',1)),
35            array('cdata',array(' Row 0 Col 3        ')),
36            array('tablecell_close',array()),
37            array('tablerow_close',array()),
38            array('tablerow_open',array()),
39            array('tablecell_open',array(1,'left',1)),
40            array('cdata',array(' Row 1 Col 1    ')),
41            array('tablecell_close',array()),
42            array('tablecell_open',array(1,'left',1)),
43            array('cdata',array(' Row 1 Col 2     ')),
44            array('tablecell_close',array()),
45            array('tablecell_open',array(1,'left',1)),
46            array('cdata',array(' Row 1 Col 3        ')),
47            array('tablecell_close',array()),
48            array('tablerow_close',array()),
49            array('table_close',array(121)),
50            array('p_open',array()),
51            array('cdata',array('def')),
52            array('p_close',array()),
53            array('document_end',array()),
54        );
55        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
56    }
57
58    function testTableWinEOL() {
59        $this->P->addMode('table',new Table());
60        $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");
61        $calls = array (
62            array('document_start',array()),
63            array('p_open',array()),
64            array('cdata',array("\n\nabc")),
65            array('p_close',array()),
66            array('table_open',array(3, 2, 6)),
67            array('tablerow_open',array()),
68            array('tablecell_open',array(1,'left',1)),
69            array('cdata',array(' Row 0 Col 1    ')),
70            array('tablecell_close',array()),
71            array('tablecell_open',array(1,'left',1)),
72            array('cdata',array(' Row 0 Col 2     ')),
73            array('tablecell_close',array()),
74            array('tablecell_open',array(1,'left',1)),
75            array('cdata',array(' Row 0 Col 3        ')),
76            array('tablecell_close',array()),
77            array('tablerow_close',array()),
78            array('tablerow_open',array()),
79            array('tablecell_open',array(1,'left',1)),
80            array('cdata',array(' Row 1 Col 1    ')),
81            array('tablecell_close',array()),
82            array('tablecell_open',array(1,'left',1)),
83            array('cdata',array(' Row 1 Col 2     ')),
84            array('tablecell_close',array()),
85            array('tablecell_open',array(1,'left',1)),
86            array('cdata',array(' Row 1 Col 3        ')),
87            array('tablecell_close',array()),
88            array('tablerow_close',array()),
89            array('table_close',array(121)),
90            array('p_open',array()),
91            array('cdata',array('def')),
92            array('p_close',array()),
93            array('document_end',array()),
94        );
95        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
96    }
97
98    function testEmptyTable() {
99        $this->P->addMode('table',new Table());
100        $this->P->parse('
101abc
102|
103def');
104
105        $calls = array (
106            array('document_start',array()),
107            array('p_open',array()),
108            array('cdata',array("\n\nabc")),
109            array('p_close',array()),
110            array('table_open',array(0, 1, 6)),
111            array('tablerow_open',array()),
112            array('tablerow_close',array()),
113            array('table_close',array(7)),
114            array('p_open',array()),
115            array('cdata',array('def')),
116            array('p_close',array()),
117            array('document_end',array()),
118        );
119
120        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
121    }
122
123    function testTableHeaders() {
124        $this->P->addMode('table',new Table());
125        $this->P->parse('
126abc
127^ X | Y ^ Z |
128def');
129
130        $calls = array (
131            array('document_start',array()),
132            array('p_open',array()),
133            array('cdata',array("\n\nabc")),
134            array('p_close',array()),
135            array('table_open',array(3, 1, 6)),
136            array('tablerow_open',array()),
137            array('tableheader_open',array(1,NULL,1)),
138            array('cdata',array(' X ')),
139            array('tableheader_close',array()),
140            array('tablecell_open',array(1,NULL,1)),
141            array('cdata',array(' Y ')),
142            array('tablecell_close',array()),
143            array('tableheader_open',array(1,NULL,1)),
144            array('cdata',array(' Z ')),
145            array('tableheader_close',array()),
146            array('tablerow_close',array()),
147            array('table_close',array(19)),
148            array('p_open',array()),
149            array('cdata',array('def')),
150            array('p_close',array()),
151            array('document_end',array()),
152        );
153
154        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
155
156    }
157
158    function testTableHead() {
159        $this->P->addMode('table',new Table());
160        $this->P->parse('
161abc
162^ X ^ Y ^ Z ^
163| x | y | z |
164def');
165
166        $calls = array (
167            array('document_start',array()),
168            array('p_open',array()),
169            array('cdata',array("\n\nabc")),
170            array('p_close',array()),
171            array('table_open',array(3, 2, 6)),
172            array('tablethead_open',array()),
173            array('tablerow_open',array()),
174            array('tableheader_open',array(1,NULL,1)),
175            array('cdata',array(' X ')),
176            array('tableheader_close',array()),
177            array('tableheader_open',array(1,NULL,1)),
178            array('cdata',array(' Y ')),
179            array('tableheader_close',array()),
180            array('tableheader_open',array(1,NULL,1)),
181            array('cdata',array(' Z ')),
182            array('tableheader_close',array()),
183            array('tablerow_close',array()),
184            array('tablethead_close',array()),
185            array('tablerow_open',array()),
186            array('tablecell_open',array(1,NULL,1)),
187            array('cdata',array(' x ')),
188            array('tablecell_close',array()),
189            array('tablecell_open',array(1,NULL,1)),
190            array('cdata',array(' y ')),
191            array('tablecell_close',array()),
192            array('tablecell_open',array(1,NULL,1)),
193            array('cdata',array(' z ')),
194            array('tablecell_close',array()),
195            array('tablerow_close',array()),
196            array('table_close',array(33)),
197            array('p_open',array()),
198            array('cdata',array('def')),
199            array('p_close',array()),
200            array('document_end',array()),
201        );
202
203        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
204
205    }
206
207    function testTableHeadOneRowTable() {
208        $this->P->addMode('table',new Table());
209        $this->P->parse('
210abc
211^ X ^ Y ^ Z ^
212def');
213
214        $calls = array (
215            array('document_start',array()),
216            array('p_open',array()),
217            array('cdata',array("\n\nabc")),
218            array('p_close',array()),
219            array('table_open',array(3, 1, 6)),
220            array('tablerow_open',array()),
221            array('tableheader_open',array(1,NULL,1)),
222            array('cdata',array(' X ')),
223            array('tableheader_close',array()),
224            array('tableheader_open',array(1,NULL,1)),
225            array('cdata',array(' Y ')),
226            array('tableheader_close',array()),
227            array('tableheader_open',array(1,NULL,1)),
228            array('cdata',array(' Z ')),
229            array('tableheader_close',array()),
230            array('tablerow_close',array()),
231            array('table_close',array(19)),
232            array('p_open',array()),
233            array('cdata',array('def')),
234            array('p_close',array()),
235            array('document_end',array()),
236        );
237
238        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
239
240    }
241
242    function testTableHeadMultiline() {
243        $this->P->addMode('table',new Table());
244        $this->P->parse('
245abc
246^ X1 ^ Y1 ^ Z1 ^
247^ X2 ^ Y2 ^ Z2 ^
248| A | B | C |
249def');
250
251        $calls = array (
252            array('document_start',array()),
253            array('p_open',array()),
254            array('cdata',array("\n\nabc")),
255            array('p_close',array()),
256            array('table_open',array(3, 3, 6)),
257            array('tablethead_open',array()),
258            array('tablerow_open',array()),
259            array('tableheader_open',array(1,NULL,1)),
260            array('cdata',array(' X1 ')),
261            array('tableheader_close',array()),
262            array('tableheader_open',array(1,NULL,1)),
263            array('cdata',array(' Y1 ')),
264            array('tableheader_close',array()),
265            array('tableheader_open',array(1,NULL,1)),
266            array('cdata',array(' Z1 ')),
267            array('tableheader_close',array()),
268            array('tablerow_close',array()),
269            array('tablerow_open',array()),
270            array('tableheader_open',array(1,NULL,1)),
271            array('cdata',array(' X2 ')),
272            array('tableheader_close',array()),
273            array('tableheader_open',array(1,NULL,1)),
274            array('cdata',array(' Y2 ')),
275            array('tableheader_close',array()),
276            array('tableheader_open',array(1,NULL,1)),
277            array('cdata',array(' Z2 ')),
278            array('tableheader_close',array()),
279            array('tablerow_close',array()),
280            array('tablethead_close',array()),
281            array('tablerow_open',array()),
282            array('tablecell_open',array(1,NULL,1)),
283            array('cdata',array(' A ')),
284            array('tablecell_close',array()),
285            array('tablecell_open',array(1,NULL,1)),
286            array('cdata',array(' B ')),
287            array('tablecell_close',array()),
288            array('tablecell_open',array(1,NULL,1)),
289            array('cdata',array(' C ')),
290            array('tablecell_close',array()),
291            array('tablerow_close',array()),
292            array('table_close',array(53)),
293            array('p_open',array()),
294            array('cdata',array('def')),
295            array('p_close',array()),
296            array('document_end',array()),
297        );
298
299        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
300
301    }
302
303    function testCellAlignment() {
304        $this->P->addMode('table',new Table());
305        $this->P->parse('
306abc
307|  X | Y  ^  Z  |
308def');
309
310        $calls = array (
311            array('document_start',array()),
312            array('p_open',array()),
313            array('cdata',array("\n\nabc")),
314            array('p_close',array()),
315            array('table_open',array(3, 1, 6)),
316            array('tablerow_open',array()),
317            array('tablecell_open',array(1,'right',1)),
318            array('cdata',array('  X ')),
319            array('tablecell_close',array()),
320            array('tablecell_open',array(1,'left',1)),
321            array('cdata',array(' Y  ')),
322            array('tablecell_close',array()),
323            array('tableheader_open',array(1,'center',1)),
324            array('cdata',array('  Z  ')),
325            array('tableheader_close',array()),
326            array('tablerow_close',array()),
327            array('table_close',array(23)),
328            array('p_open',array()),
329            array('cdata',array('def')),
330            array('p_close',array()),
331            array('document_end',array()),
332        );
333
334        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
335    }
336
337    function testCellSpan() {
338        $this->P->addMode('table',new Table());
339        $this->P->parse('
340abc
341|  d || e |
342| f ^ ^|
343||||
344def');
345
346        $calls = array (
347            array('document_start',array()),
348            array('p_open',array()),
349            array('cdata',array("\n\nabc")),
350            array('p_close',array()),
351            array('table_open',array(3, 3, 6)),
352            array('tablerow_open',array()),
353            array('tablecell_open',array(2,'right',1)),
354            array('cdata',array('  d ')),
355            array('tablecell_close',array()),
356            array('tablecell_open',array(1,NULL,1)),
357            array('cdata',array(' e ')),
358            array('tablecell_close',array()),
359            array('tablerow_close',array()),
360            array('tablerow_open',array()),
361            array('tablecell_open',array(1,NULL,1)),
362            array('cdata',array(' f ')),
363            array('tablecell_close',array()),
364            array('tableheader_open',array(2,NULL,1)),
365            array('cdata',array(' ')),
366            array('tableheader_close',array()),
367            array('tablerow_close',array()),
368            array('tablerow_open',array()),
369            array('tablerow_close',array()),
370            array('table_close',array(31)),
371            array('p_open',array()),
372            array('cdata',array('def')),
373            array('p_close',array()),
374            array('document_end',array()),
375        );
376        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
377    }
378
379    function testCellRowSpan() {
380        $this->P->addMode('table',new Table());
381        $this->P->parse('
382abc
383| a |  c:::||
384|:::^ d  | e|
385|b  ^  ::: |:::f|
386def');
387
388        $calls = array (
389            array('document_start',array()),
390            array('p_open',array()),
391            array('cdata',array("\n\nabc")),
392            array('p_close',array()),
393            array('table_open',array(3, 3, 6)),
394            array('tablerow_open',array()),
395            array('tablecell_open',array(1,NULL,2)),
396            array('cdata',array(' a ')),
397            array('tablecell_close',array()),
398            array('tablecell_open',array(2,'right',1)),
399            array('cdata',array('  c:::')),
400            array('tablecell_close',array()),
401            array('tablerow_close',array()),
402            array('tablerow_open',array()),
403            array('tableheader_open',array(1,'left',2)),
404            array('cdata',array(' d  ')),
405            array('tableheader_close',array()),
406            array('tablecell_open',array(1,NULL,1)),
407            array('cdata',array(' e')),
408            array('tablecell_close',array()),
409            array('tablerow_close',array()),
410            array('tablerow_open',array()),
411            array('tablecell_open',array(1,'left',1)),
412            array('cdata',array('b  ')),
413            array('tablecell_close',array()),
414            array('tablecell_open',array(1,NULL,1)),
415            array('cdata',array(':::f')),
416            array('tablecell_close',array()),
417            array('tablerow_close',array()),
418            array('table_close',array(51)),
419            array('p_open',array()),
420            array('cdata',array('def')),
421            array('p_close',array()),
422            array('document_end',array()),
423        );
424        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
425    }
426
427    function testCellRowSpanFirstRow() {
428        $this->P->addMode('table',new Table());
429        $this->P->parse('
430abc
431|::: ^  d:::^:::|  :::  |
432| b ^ e  | | ::: |
433|c  ^  ::: | |:::|
434def');
435
436        $calls = array (
437            array('document_start',array()),
438            array('p_open',array()),
439            array('cdata',array("\n\nabc")),
440            array('p_close',array()),
441            array('table_open',array(4, 3, 6)),
442            array('tablerow_open',array()),
443            array('tablecell_open',array(1,NULL,1)),
444            array('cdata',array('')),
445            array('tablecell_close',array()),
446            array('tableheader_open',array(1,'right',1)),
447            array('cdata',array('  d:::')),
448            array('tableheader_close',array()),
449            array('tableheader_open',array(1,NULL,1)),
450            array('cdata',array('')),
451            array('tableheader_close',array()),
452            array('tablecell_open',array(1,NULL,3)),
453            array('cdata',array('')),
454            array('tablecell_close',array()),
455            array('tablerow_close',array()),
456            array('tablerow_open',array()),
457            array('tablecell_open',array(1,NULL,1)),
458            array('cdata',array(' b ')),
459            array('tablecell_close',array()),
460            array('tableheader_open',array(1,'left',2)),
461            array('cdata',array(' e  ')),
462            array('tableheader_close',array()),
463            array('tablecell_open',array(1,NULL,1)),
464            array('cdata',array(' ')),
465            array('tablecell_close',array()),
466            array('tablerow_close',array()),
467            array('tablerow_open',array()),
468            array('tablecell_open',array(1,'left',1)),
469            array('cdata',array('c  ')),
470            array('tablecell_close',array()),
471            array('tablecell_open',array(1,NULL,1)),
472            array('cdata',array(' ')),
473            array('tablecell_close',array()),
474            array('tablerow_close',array()),
475
476            array('table_close',array(69)),
477            array('p_open',array()),
478            array('cdata',array('def')),
479            array('p_close',array()),
480            array('document_end',array()),
481        );
482        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
483    }
484
485    function testRowSpanTableHead() {
486        $this->P->addMode('table',new Table());
487        $this->P->parse('
488abc
489^ X1 ^ Y1 ^ Z1 ^
490^ X2 ^ ::: ^ Z2 ^
491| A3 | B3 | C3 |
492def');
493
494        $calls = array (
495            array('document_start',array()),
496            array('p_open',array()),
497            array('cdata',array("\n\nabc")),
498            array('p_close',array()),
499            array('table_open',array(3, 3, 6)),
500            array('tablethead_open',array()),
501            array('tablerow_open',array()),
502            array('tableheader_open',array(1,NULL,1)),
503            array('cdata',array(' X1 ')),
504            array('tableheader_close',array()),
505            array('tableheader_open',array(1,NULL,2)),
506            array('cdata',array(' Y1 ')),
507            array('tableheader_close',array()),
508            array('tableheader_open',array(1,NULL,1)),
509            array('cdata',array(' Z1 ')),
510            array('tableheader_close',array()),
511            array('tablerow_close',array()),
512            array('tablerow_open',array()),
513            array('tableheader_open',array(1,NULL,1)),
514            array('cdata',array(' X2 ')),
515            array('tableheader_close',array()),
516            array('tableheader_open',array(1,NULL,1)),
517            array('cdata',array(' Z2 ')),
518            array('tableheader_close',array()),
519            array('tablerow_close',array()),
520            array('tablethead_close',array()),
521            array('tablerow_open',array()),
522            array('tablecell_open',array(1,NULL,1)),
523            array('cdata',array(' A3 ')),
524            array('tablecell_close',array()),
525            array('tablecell_open',array(1,NULL,1)),
526            array('cdata',array(' B3 ')),
527            array('tablecell_close',array()),
528            array('tablecell_open',array(1,NULL,1)),
529            array('cdata',array(' C3 ')),
530            array('tablecell_close',array()),
531            array('tablerow_close',array()),
532            array('table_close',array(57)),
533            array('p_open',array()),
534            array('cdata',array('def')),
535            array('p_close',array()),
536            array('document_end',array()),
537        );
538
539        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
540
541    }
542
543    function testRowSpanAcrossTableHeadBoundary() {
544        $this->P->addMode('table',new Table());
545        $this->P->parse('
546abc
547^ X1 ^ Y1 ^ Z1 ^
548^ X2 ^ ::: ^ Z2 ^
549| A3 | ::: | C3 |
550| A4 | ::: | C4 |
551def');
552
553        $calls = array (
554            array('document_start',array()),
555            array('p_open',array()),
556            array('cdata',array("\n\nabc")),
557            array('p_close',array()),
558            array('table_open',array(3, 4, 6)),
559            array('tablethead_open',array()),
560            array('tablerow_open',array()),
561            array('tableheader_open',array(1,NULL,1)),
562            array('cdata',array(' X1 ')),
563            array('tableheader_close',array()),
564            array('tableheader_open',array(1,NULL,2)),
565            array('cdata',array(' Y1 ')),
566            array('tableheader_close',array()),
567            array('tableheader_open',array(1,NULL,1)),
568            array('cdata',array(' Z1 ')),
569            array('tableheader_close',array()),
570            array('tablerow_close',array()),
571            array('tablerow_open',array()),
572            array('tableheader_open',array(1,NULL,1)),
573            array('cdata',array(' X2 ')),
574            array('tableheader_close',array()),
575            array('tableheader_open',array(1,NULL,1)),
576            array('cdata',array(' Z2 ')),
577            array('tableheader_close',array()),
578            array('tablerow_close',array()),
579            array('tablethead_close',array()),
580            array('tablerow_open',array()),
581            array('tablecell_open',array(1,NULL,1)),
582            array('cdata',array(' A3 ')),
583            array('tablecell_close',array()),
584            array('tablecell_open',array(1,NULL,2)),
585            array('cdata',array('')),
586            array('tablecell_close',array()),
587            array('tablecell_open',array(1,NULL,1)),
588            array('cdata',array(' C3 ')),
589            array('tablecell_close',array()),
590            array('tablerow_close',array()),
591            array('tablerow_open',array()),
592            array('tablecell_open',array(1,NULL,1)),
593            array('cdata',array(' A4 ')),
594            array('tablecell_close',array()),
595            array('tablecell_open',array(1,NULL,1)),
596            array('cdata',array(' C4 ')),
597            array('tablecell_close',array()),
598            array('tablerow_close',array()),
599            array('table_close',array(76)),
600            array('p_open',array()),
601            array('cdata',array('def')),
602            array('p_close',array()),
603            array('document_end',array()),
604        );
605
606        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
607
608    }
609
610    function testCellAlignmentFormatting() {
611        $this->P->addMode('table',new Table());
612        $this->P->addMode('strong',new Formatting('strong'));
613        $this->P->parse('
614abc
615|  **X** | Y  ^  Z  |
616def');
617
618        $calls = array (
619            array('document_start',array()),
620            array('p_open',array()),
621            array('cdata',array("\n\nabc")),
622            array('p_close',array()),
623            array('table_open',array(3, 1, 6)),
624            array('tablerow_open',array()),
625            array('tablecell_open',array(1,'right',1)),
626            array('cdata',array('  ')),
627            array('strong_open',array()),
628            array('cdata',array('X')),
629            array('strong_close',array()),
630            array('cdata',array(' ')),
631            array('tablecell_close',array()),
632            array('tablecell_open',array(1,'left',1)),
633            array('cdata',array(' Y  ')),
634            array('tablecell_close',array()),
635            array('tableheader_open',array(1,'center',1)),
636            array('cdata',array('  Z  ')),
637            array('tableheader_close',array()),
638            array('tablerow_close',array()),
639            array('table_close',array(27)),
640            array('p_open',array()),
641            array('cdata',array('def')),
642            array('p_close',array()),
643            array('document_end',array()),
644        );
645
646        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
647
648    }
649
650    function testTableEol() {
651        $this->P->addMode('table',new Table());
652        $this->P->addMode('eol',new Eol());
653        $this->P->parse('
654abc
655| Row 0 Col 1    | Row 0 Col 2     | Row 0 Col 3        |
656| Row 1 Col 1    | Row 1 Col 2     | Row 1 Col 3        |
657def');
658        $calls = array (
659            array('document_start',array()),
660            array('p_open',array()),
661            array('cdata',array("abc")),
662            array('p_close',array()),
663            array('table_open',array(3, 2, 6)),
664            array('tablerow_open',array()),
665            array('tablecell_open',array(1,'left',1)),
666            array('cdata',array(' Row 0 Col 1    ')),
667            array('tablecell_close',array()),
668            array('tablecell_open',array(1,'left',1)),
669            array('cdata',array(' Row 0 Col 2     ')),
670            array('tablecell_close',array()),
671            array('tablecell_open',array(1,'left',1)),
672            array('cdata',array(' Row 0 Col 3        ')),
673            array('tablecell_close',array()),
674            array('tablerow_close',array()),
675            array('tablerow_open',array()),
676            array('tablecell_open',array(1,'left',1)),
677            array('cdata',array(' Row 1 Col 1    ')),
678            array('tablecell_close',array()),
679            array('tablecell_open',array(1,'left',1)),
680            array('cdata',array(' Row 1 Col 2     ')),
681            array('tablecell_close',array()),
682            array('tablecell_open',array(1,'left',1)),
683            array('cdata',array(' Row 1 Col 3        ')),
684            array('tablecell_close',array()),
685            array('tablerow_close',array()),
686            array('table_close',array(121)),
687            array('p_open',array()),
688            array('cdata',array('def')),
689            array('p_close',array()),
690            array('document_end',array()),
691        );
692        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
693    }
694
695    // This is really a failing test - formatting able to spread across cols
696    // Problem is fixing it would mean a major rewrite of table handling
697    function testTableStrong() {
698        $this->P->addMode('table',new Table());
699        $this->P->addMode('strong',new Formatting('strong'));
700        $this->P->parse('
701abc
702| **Row 0 Col 1**    | **Row 0 Col 2     | Row 0 Col 3**        |
703| Row 1 Col 1    | Row 1 Col 2     | Row 1 Col 3        |
704def');
705        $calls = array (
706            array('document_start',array()),
707            array('p_open',array()),
708            array('cdata',array("\n\nabc")),
709            array('p_close',array()),
710            array('table_open',array(3, 2, 6)),
711            array('tablerow_open',array()),
712            array('tablecell_open',array(1,'left',1)),
713            array('cdata',array(' ')),
714            array('strong_open',array()),
715            array('cdata',array('Row 0 Col 1')),
716            array('strong_close',array()),
717            array('cdata',array('    ')),
718            array('tablecell_close',array()),
719            array('tablecell_open',array(1,'left',1)),
720            array('cdata',array(' ')),
721            array('strong_open',array()),
722            array('cdata',array('Row 0 Col 2     | Row 0 Col 3')),
723            array('strong_close',array()),
724            array('cdata',array('        ')),
725            array('tablecell_close',array()),
726            array('tablecell_open',array(1,null,1)),
727            array('cdata',array('')),
728            array('tablecell_close',array()),
729            array('tablerow_close',array()),
730            array('tablerow_open',array()),
731            array('tablecell_open',array(1,'left',1)),
732            array('cdata',array(' Row 1 Col 1    ')),
733            array('tablecell_close',array()),
734            array('tablecell_open',array(1,'left',1)),
735            array('cdata',array(' Row 1 Col 2     ')),
736            array('tablecell_close',array()),
737            array('tablecell_open',array(1,'left',1)),
738            array('cdata',array(' Row 1 Col 3        ')),
739            array('tablecell_close',array()),
740            array('tablerow_close',array()),
741            array('table_close',array(129)),
742            array('p_open',array()),
743            array('cdata',array('def')),
744            array('p_close',array()),
745            array('document_end',array()),
746        );
747        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
748    }
749
750    // This is really a failing test - unformatted able to spread across cols
751    // Problem is fixing it would mean a major rewrite of table handling
752    function testTableUnformatted() {
753        $this->P->addMode('table',new Table());
754        $this->P->addMode('unformatted',new Unformatted());
755        $this->P->parse('
756abc
757| <nowiki>Row 0 Col 1</nowiki>    | <nowiki>Row 0 Col 2     | Row 0 Col 3</nowiki>        |
758| Row 1 Col 1    | Row 1 Col 2     | Row 1 Col 3        |
759def');
760        $calls = array (
761            array('document_start',array()),
762            array('p_open',array()),
763            array('cdata',array("\n\nabc")),
764            array('p_close',array()),
765            array('table_open',array(3, 2, 6)),
766            array('tablerow_open',array()),
767            array('tablecell_open',array(1,'left',1)),
768            array('cdata',array(' ')),
769            array('unformatted',array('Row 0 Col 1')),
770            array('cdata',array('    ')),
771            array('tablecell_close',array()),
772            array('tablecell_open',array(1,'left',1)),
773            array('cdata',array(' ')),
774            array('unformatted',array('Row 0 Col 2     | Row 0 Col 3')),
775            array('cdata',array('        ')),
776            array('tablecell_close',array()),
777            array('tablecell_open',array(1,null,1)),
778            array('cdata',array('')),
779            array('tablecell_close',array()),
780            array('tablerow_close',array()),
781            array('tablerow_open',array()),
782            array('tablecell_open',array(1,'left',1)),
783            array('cdata',array(' Row 1 Col 1    ')),
784            array('tablecell_close',array()),
785            array('tablecell_open',array(1,'left',1)),
786            array('cdata',array(' Row 1 Col 2     ')),
787            array('tablecell_close',array()),
788            array('tablecell_open',array(1,'left',1)),
789            array('cdata',array(' Row 1 Col 3        ')),
790            array('tablecell_close',array()),
791            array('tablerow_close',array()),
792            array('table_close',array(155)),
793            array('p_open',array()),
794            array('cdata',array('def')),
795            array('p_close',array()),
796            array('document_end',array()),
797        );
798        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
799    }
800
801    function testTableLinebreak() {
802        $this->P->addMode('table',new Table());
803        $this->P->addMode('linebreak',new Linebreak());
804        $this->P->parse('
805abc
806| Row 0\\\\ Col 1    | Row 0 Col 2     | Row 0 Col 3        |
807| Row 1 Col 1    | Row 1 Col 2     | Row 1 Col 3        |
808def');
809        $calls = array (
810            array('document_start',array()),
811            array('p_open',array()),
812            array('cdata',array("\n\nabc")),
813            array('p_close',array()),
814            array('table_open',array(3, 2, 6)),
815            array('tablerow_open',array()),
816            array('tablecell_open',array(1,'left',1)),
817            array('cdata',array(' Row 0')),
818            array('linebreak',array()),
819            array('cdata',array('Col 1    ')),
820            array('tablecell_close',array()),
821            array('tablecell_open',array(1,'left',1)),
822            array('cdata',array(' Row 0 Col 2     ')),
823            array('tablecell_close',array()),
824            array('tablecell_open',array(1,'left',1)),
825            array('cdata',array(' Row 0 Col 3        ')),
826            array('tablecell_close',array()),
827            array('tablerow_close',array()),
828            array('tablerow_open',array()),
829            array('tablecell_open',array(1,'left',1)),
830            array('cdata',array(' Row 1 Col 1    ')),
831            array('tablecell_close',array()),
832            array('tablecell_open',array(1,'left',1)),
833            array('cdata',array(' Row 1 Col 2     ')),
834            array('tablecell_close',array()),
835            array('tablecell_open',array(1,'left',1)),
836            array('cdata',array(' Row 1 Col 3        ')),
837            array('tablecell_close',array()),
838            array('tablerow_close',array()),
839            array('table_close',array(123)),
840            array('p_open',array()),
841            array('cdata',array('def')),
842            array('p_close',array()),
843            array('document_end',array()),
844        );
845
846        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
847    }
848
849    // This is really a failing test - footnote able to spread across cols
850    // Problem is fixing it would mean a major rewrite of table handling
851    function testTableFootnote() {
852        $this->P->addMode('table',new Table());
853        $this->P->addMode('footnote',new Footnote());
854        $this->P->parse('
855abc
856| ((Row 0 Col 1))    | ((Row 0 Col 2     | Row 0 Col 3))        |
857| Row 1 Col 1    | Row 1 Col 2     | Row 1 Col 3        |
858def');
859        $calls = array (
860            array('document_start',array()),
861            array('p_open',array()),
862            array('cdata',array("\n\nabc")),
863            array('p_close',array()),
864            array('table_open',array(3, 2, 6)),
865            array('tablerow_open',array()),
866            array('tablecell_open',array(1,'left',1)),
867            array('cdata',array(' ')),
868            array('nest', array ( array (
869              array('footnote_open',array()),
870              array('cdata',array('Row 0 Col 1')),
871              array('footnote_close',array()),
872            ))),
873            array('cdata',array('    ')),
874            array('tablecell_close',array()),
875            array('tablecell_open',array(1,'left',1)),
876            array('cdata',array(' ')),
877            array('nest', array ( array (
878              array('footnote_open',array()),
879              array('cdata',array('Row 0 Col 2     | Row 0 Col 3')),
880              array('footnote_close',array()),
881            ))),
882            array('cdata',array('        ')),
883            array('tablecell_close',array()),
884            array('tablecell_open',array(1,null,1)),
885            array('cdata',array('')),
886            array('tablecell_close',array()),
887            array('tablerow_close',array()),
888            array('tablerow_open',array()),
889            array('tablecell_open',array(1,'left',1)),
890            array('cdata',array(' Row 1 Col 1    ')),
891            array('tablecell_close',array()),
892            array('tablecell_open',array(1,'left',1)),
893            array('cdata',array(' Row 1 Col 2     ')),
894            array('tablecell_close',array()),
895            array('tablecell_open',array(1,'left',1)),
896            array('cdata',array(' Row 1 Col 3        ')),
897            array('tablecell_close',array()),
898            array('tablerow_close',array()),
899            array('table_close',array(129)),
900            array('p_open',array()),
901            array('cdata',array('def')),
902            array('p_close',array()),
903            array('document_end',array()),
904        );
905        $this->assertEquals($calls,array_map('stripbyteindex',$this->H->calls));
906    }
907
908    function testTable_FS1833() {
909        $syntax = " \n| Row 0 Col 1    |\n";
910        $this->P->addMode('table',new Table());
911        $this->P->parse($syntax);
912        $calls = array (
913            array('document_start',array()),
914            array('table_open',array(1, 1, 2)),
915            array('tablerow_open',array()),
916            array('tablecell_open',array(1,'left',1)),
917            array('cdata',array(' Row 0 Col 1    ')),
918            array('tablecell_close',array()),
919            array('tablerow_close',array()),
920            array('table_close',array(strlen($syntax))),
921            array('document_end',array()),
922        );
923        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
924    }
925
926    /**
927     * missing cells in one row get filled up...
928     */
929    function testTable_CellFix() {
930        $syntax = "\n| r1c1 | r1c2 | r1c3 |\n| r2c1 |\n";
931        $this->P->addMode('table',new Table());
932        $this->P->parse($syntax);
933        $calls = array (
934            array('document_start',array()),
935            array('table_open',array(3, 2, 2)),
936
937            array('tablerow_open',array()),
938            array('tablecell_open',array(1,null,1)),
939            array('cdata',array(' r1c1 ')),
940            array('tablecell_close',array()),
941            array('tablecell_open',array(1,null,1)),
942            array('cdata',array(' r1c2 ')),
943            array('tablecell_close',array()),
944            array('tablecell_open',array(1,null,1)),
945            array('cdata',array(' r1c3 ')),
946            array('tablecell_close',array()),
947            array('tablerow_close',array()),
948
949            array('tablerow_open',array()),
950            array('tablecell_open',array(1,null,1)),
951            array('cdata',array(' r2c1 ')),
952            array('tablecell_close',array()),
953            array('tablecell_open',array(1,null,1)),
954            array('cdata',array('')),
955            array('tablecell_close',array()),
956            array('tablecell_open',array(1,null,1)),
957            array('cdata',array('')),
958            array('tablecell_close',array()),
959            array('tablerow_close',array()),
960
961            array('table_close',array(strlen($syntax))),
962            array('document_end',array()),
963        );
964        $this->assertEquals($calls, array_map('stripbyteindex',$this->H->calls));
965    }
966
967    /**
968     * ... even if the longer row comes later
969     */
970    function testTable_CellFix2() {
971        $syntax = "\n| r1c1 |\n| r2c1 | r2c2 | r2c3 |\n";
972        $this->P->addMode('table',new Table());
973        $this->P->parse($syntax);
974        $calls = array (
975            array('document_start',array()),
976            array('table_open',array(3, 2, 2)),
977
978            array('tablerow_open',array()),
979            array('tablecell_open',array(1,null,1)),
980            array('cdata',array(' r1c1 ')),
981            array('tablecell_close',array()),
982            array('tablecell_open',array(1,null,1)),
983            array('cdata',array('')),
984            array('tablecell_close',array()),
985            array('tablecell_open',array(1,null,1)),
986            array('cdata',array('')),
987            array('tablecell_close',array()),
988            array('tablerow_close',array()),
989
990            array('tablerow_open',array()),
991            array('tablecell_open',array(1,null,1)),
992            array('cdata',array(' r2c1 ')),
993            array('tablecell_close',array()),
994            array('tablecell_open',array(1,null,1)),
995            array('cdata',array(' r2c2 ')),
996            array('tablecell_close',array()),
997            array('tablecell_open',array(1,null,1)),
998            array('cdata',array(' r2c3 ')),
999            array('tablecell_close',array()),
1000            array('tablerow_close',array()),
1001
1002            array('table_close',array(strlen($syntax))),
1003            array('document_end',array()),
1004        );
1005        $this->assertEquals($calls, array_map('stripbyteindex',$this->H->calls));
1006    }
1007}
1008