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