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