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