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