xref: /dokuwiki/_test/tests/inc/parser/parser_lists.test.php (revision 853aa1550199223a46b55e9563790b9ef6a1d234)
1<?php
2require_once 'parser.inc.php';
3
4class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
5
6    function testUnorderedList() {
7        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
8        $this->P->parse('
9  *A
10    * B
11  * C
12');
13        $calls = array (
14            array('document_start',array()),
15            array('listu_open',array()),
16            array('listitem_open',array(1)),
17            array('listcontent_open',array()),
18            array('cdata',array("A")),
19            array('listcontent_close',array()),
20            array('listu_open',array()),
21            array('listitem_open',array(2)),
22            array('listcontent_open',array()),
23            array('cdata',array(' B')),
24            array('listcontent_close',array()),
25            array('listitem_close',array()),
26            array('listu_close',array()),
27            array('listitem_close',array()),
28            array('listitem_open',array(1)),
29            array('listcontent_open',array()),
30            array('cdata',array(' C')),
31            array('listcontent_close',array()),
32            array('listitem_close',array()),
33            array('listu_close',array()),
34            array('document_end',array()),
35        );
36        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
37    }
38
39    function testOrderedList() {
40        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
41        $this->P->parse('
42  -A
43    - B
44  - C
45');
46        $calls = array (
47            array('document_start',array()),
48            array('listo_open',array()),
49            array('listitem_open',array(1)),
50            array('listcontent_open',array()),
51            array('cdata',array("A")),
52            array('listcontent_close',array()),
53            array('listo_open',array()),
54            array('listitem_open',array(2)),
55            array('listcontent_open',array()),
56            array('cdata',array(' B')),
57            array('listcontent_close',array()),
58            array('listitem_close',array()),
59            array('listo_close',array()),
60            array('listitem_close',array()),
61            array('listitem_open',array(1)),
62            array('listcontent_open',array()),
63            array('cdata',array(' C')),
64            array('listcontent_close',array()),
65            array('listitem_close',array()),
66            array('listo_close',array()),
67            array('document_end',array()),
68        );
69        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
70    }
71
72
73    function testMixedList() {
74        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
75        $this->P->parse('
76  -A
77    * B
78  - C
79');
80        $calls = array (
81            array('document_start',array()),
82            array('listo_open',array()),
83            array('listitem_open',array(1)),
84            array('listcontent_open',array()),
85            array('cdata',array("A")),
86            array('listcontent_close',array()),
87            array('listu_open',array()),
88            array('listitem_open',array(2)),
89            array('listcontent_open',array()),
90            array('cdata',array(' B')),
91            array('listcontent_close',array()),
92            array('listitem_close',array()),
93            array('listu_close',array()),
94            array('listitem_close',array()),
95            array('listitem_open',array(1)),
96            array('listcontent_open',array()),
97            array('cdata',array(' C')),
98            array('listcontent_close',array()),
99            array('listitem_close',array()),
100            array('listo_close',array()),
101            array('document_end',array()),
102        );
103        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
104    }
105
106    function testUnorderedListWinEOL() {
107        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
108        $this->P->parse("\r\n  *A\r\n    * B\r\n  * C\r\n");
109        $calls = array (
110            array('document_start',array()),
111            array('listu_open',array()),
112            array('listitem_open',array(1)),
113            array('listcontent_open',array()),
114            array('cdata',array("A")),
115            array('listcontent_close',array()),
116            array('listu_open',array()),
117            array('listitem_open',array(2)),
118            array('listcontent_open',array()),
119            array('cdata',array(' B')),
120            array('listcontent_close',array()),
121            array('listitem_close',array()),
122            array('listu_close',array()),
123            array('listitem_close',array()),
124            array('listitem_open',array(1)),
125            array('listcontent_open',array()),
126            array('cdata',array(' C')),
127            array('listcontent_close',array()),
128            array('listitem_close',array()),
129            array('listu_close',array()),
130            array('document_end',array()),
131        );
132        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
133    }
134
135    function testOrderedListWinEOL() {
136        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
137        $this->P->parse("\r\n  -A\r\n    - B\r\n  - C\r\n");
138        $calls = array (
139            array('document_start',array()),
140            array('listo_open',array()),
141            array('listitem_open',array(1)),
142            array('listcontent_open',array()),
143            array('cdata',array("A")),
144            array('listcontent_close',array()),
145            array('listo_open',array()),
146            array('listitem_open',array(2)),
147            array('listcontent_open',array()),
148            array('cdata',array(' B')),
149            array('listcontent_close',array()),
150            array('listitem_close',array()),
151            array('listo_close',array()),
152            array('listitem_close',array()),
153            array('listitem_open',array(1)),
154            array('listcontent_open',array()),
155            array('cdata',array(' C')),
156            array('listcontent_close',array()),
157            array('listitem_close',array()),
158            array('listo_close',array()),
159            array('document_end',array()),
160        );
161        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
162    }
163
164    function testNotAList() {
165        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
166        $this->P->parse("Foo  -bar  *foo Bar");
167        $calls = array (
168            array('document_start',array()),
169            array('p_open',array()),
170            array('cdata',array("\nFoo  -bar  *foo Bar")),
171            array('p_close',array()),
172            array('document_end',array()),
173        );
174        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
175    }
176
177    function testUnorderedListParagraph() {
178        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
179        $this->P->addMode('eol',new Doku_Parser_Mode_Eol());
180        $this->P->parse('Foo
181  *A
182    * B
183  * C
184Bar');
185        $calls = array (
186            array('document_start',array()),
187            array('p_open',array()),
188            array('cdata',array("Foo")),
189            array('p_close',array()),
190            array('listu_open',array()),
191            array('listitem_open',array(1)),
192            array('listcontent_open',array()),
193            array('cdata',array("A")),
194            array('listcontent_close',array()),
195            array('listu_open',array()),
196            array('listitem_open',array(2)),
197            array('listcontent_open',array()),
198            array('cdata',array(' B')),
199            array('listcontent_close',array()),
200            array('listitem_close',array()),
201            array('listu_close',array()),
202            array('listitem_close',array()),
203            array('listitem_open',array(1)),
204            array('listcontent_open',array()),
205            array('cdata',array(' C')),
206            array('listcontent_close',array()),
207            array('listitem_close',array()),
208            array('listu_close',array()),
209            array('p_open',array()),
210            array('cdata',array("Bar")),
211            array('p_close',array()),
212            array('document_end',array()),
213        );
214        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
215    }
216
217    // This is really a failing test - formatting able to spread across list items
218    // Problem is fixing it would mean a major rewrite of lists
219    function testUnorderedListStrong() {
220        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
221        $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong'));
222        $this->P->parse('
223  ***A**
224    *** B
225  * C**
226');
227        $calls = array (
228            array('document_start',array()),
229            array('listu_open',array()),
230            array('listitem_open',array(1)),
231            array('listcontent_open',array()),
232            array('strong_open',array()),
233            array('cdata',array("A")),
234            array('strong_close',array()),
235            array('listcontent_close',array()),
236            array('listu_open',array()),
237            array('listitem_open',array(2)),
238            array('listcontent_open',array()),
239            array('strong_open',array()),
240            array('cdata',array(" B\n  * C")),
241            array('strong_close',array()),
242            array('listcontent_close',array()),
243            array('listitem_close',array()),
244            array('listu_close',array()),
245            array('listitem_close',array()),
246            array('listu_close',array()),
247            array('document_end',array()),
248        );
249        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
250    }
251
252    // This is really a failing test - unformatted able to spread across list items
253    // Problem is fixing it would mean a major rewrite of lists
254    function testUnorderedListUnformatted() {
255        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
256        $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted());
257        $this->P->parse('
258  *%%A%%
259    *%% B
260  * C%%
261');
262        $calls = array (
263            array('document_start',array()),
264            array('listu_open',array()),
265            array('listitem_open',array(1)),
266            array('listcontent_open',array()),
267            array('unformatted',array("A")),
268            array('listcontent_close',array()),
269            array('listu_open',array()),
270            array('listitem_open',array(2)),
271            array('listcontent_open',array()),
272            array('unformatted',array(" B\n  * C")),
273            array('listcontent_close',array()),
274            array('listitem_close',array()),
275            array('listu_close',array()),
276            array('listitem_close',array()),
277            array('listu_close',array()),
278            array('document_end',array()),
279        );
280        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
281    }
282
283    function testUnorderedListLinebreak() {
284        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
285        $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
286        $this->P->parse('
287  *A\\\\ D
288    * B
289  * C
290');
291        $calls = array (
292            array('document_start',array()),
293            array('listu_open',array()),
294            array('listitem_open',array(1)),
295            array('listcontent_open',array()),
296            array('cdata',array("A")),
297            array('linebreak',array()),
298            array('cdata',array("D")),
299            array('listcontent_close',array()),
300            array('listu_open',array()),
301            array('listitem_open',array(2)),
302            array('listcontent_open',array()),
303            array('cdata',array(' B')),
304            array('listcontent_close',array()),
305            array('listitem_close',array()),
306            array('listu_close',array()),
307            array('listitem_close',array()),
308            array('listitem_open',array(1)),
309            array('listcontent_open',array()),
310            array('cdata',array(' C')),
311            array('listcontent_close',array()),
312            array('listitem_close',array()),
313            array('listu_close',array()),
314            array('document_end',array()),
315        );
316        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
317    }
318
319    function testUnorderedListLinebreak2() {
320        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
321        $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak());
322        $this->P->parse('
323  *A\\\\
324  * B
325');
326        $calls = array (
327            array('document_start',array()),
328            array('listu_open',array()),
329            array('listitem_open',array(1)),
330            array('listcontent_open',array()),
331            array('cdata',array("A")),
332            array('linebreak',array()),
333            array('listcontent_close',array()),
334            array('listitem_close',array()),
335            array('listitem_open',array(1)),
336            array('listcontent_open',array()),
337            array('cdata',array(' B')),
338            array('listcontent_close',array()),
339            array('listitem_close',array()),
340            array('listu_close',array()),
341            array('document_end',array()),
342        );
343        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
344    }
345
346    function testUnorderedListFootnote() {
347        $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock());
348        $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
349        $this->P->parse('
350  *((A))
351    *(( B
352  * C ))
353
354');
355        $calls = array (
356            array('document_start',array()),
357            array('listu_open',array()),
358            array('listitem_open',array(1)),
359            array('listcontent_open',array()),
360            array('nest', array( array(
361                array('footnote_open',array()),
362                array('cdata',array("A")),
363                array('footnote_close',array())
364            ))),
365            array('listcontent_close',array()),
366            array('listu_open',array()),
367            array('listitem_open',array(2)),
368            array('listcontent_open',array()),
369            array('nest', array( array(
370                array('footnote_open',array()),
371                array('cdata',array(" B")),
372                array('listu_open',array()),
373                array('listitem_open',array(1)),
374                array('listcontent_open',array()),
375                array('cdata',array(" C )) ")),
376                array('listcontent_close',array()),
377                array('listitem_close',array()),
378                array('listu_close',array()),
379                array('cdata',array("\n\n")),
380                array('footnote_close',array())
381            ))),
382            array('listcontent_close',array()),
383            array('listitem_close',array()),
384            array('listu_close',array()),
385            array('listitem_close',array()),
386            array('listu_close',array()),
387            array('document_end',array())
388        );
389
390        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
391    }
392}
393
394