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