xref: /dokuwiki/_test/tests/Parsing/ParserMode/CodeTest.php (revision 504c13e8df88563c11b3720b317991bc38835a35)
1<?php
2
3namespace dokuwiki\test\Parsing\ParserMode;
4
5use dokuwiki\Parsing\ParserMode\Code;
6
7/**
8 * Tests to ensure functionality of the <code> syntax tag.
9 *
10 * @group parser_code
11 */
12class CodeTest extends ParserTestBase
13{
14
15    function setUp() : void {
16        parent::setUp();
17        $this->P->addMode('code',new Code());
18    }
19
20    function testCode() {
21        $this->P->parse('Foo <code>Test</code> Bar');
22        $calls = [
23            ['document_start',[]],
24            ['p_open',[]],
25            ['cdata',["\n".'Foo ']],
26            ['p_close',[]],
27            ['code',['Test',null,null]],
28            ['p_open',[]],
29            ['cdata',[' Bar']],
30            ['p_close',[]],
31            ['document_end',[]],
32        ];
33        $this->assertCalls($calls, $this->H->calls);
34    }
35
36    function testCodeBash() {
37        $this->P->parse('Foo <code bash>Test</code> Bar');
38        $calls = [
39            ['document_start',[]],
40            ['p_open',[]],
41            ['cdata',["\n".'Foo ']],
42            ['p_close',[]],
43            ['code',['Test','bash',null]],
44            ['p_open',[]],
45            ['cdata',[' Bar']],
46            ['p_close',[]],
47            ['document_end',[]],
48        ];
49        $this->assertCalls($calls, $this->H->calls);
50    }
51
52    function testCodeDownload() {
53        $this->P->parse('Foo <code bash script.sh>Test</code> Bar');
54        $calls = [
55            ['document_start',[]],
56            ['p_open',[]],
57            ['cdata',["\n".'Foo ']],
58            ['p_close',[]],
59            ['code',['Test','bash','script.sh']],
60            ['p_open',[]],
61            ['cdata',[' Bar']],
62            ['p_close',[]],
63            ['document_end',[]],
64        ];
65        $this->assertCalls($calls, $this->H->calls);
66    }
67
68    function testCodeToken() {
69        $this->P->parse('Foo <code2>Bar</code2><code>Test</code>');
70        $calls = [
71            ['document_start',[]],
72            ['p_open',[]],
73            ['cdata',["\n".'Foo <code2>Bar</code2>']],
74            ['p_close',[]],
75            ['code',['Test',null,null]],
76            ['document_end',[]],
77        ];
78        $this->assertCalls($calls, $this->H->calls);
79    }
80
81    function testCodeOptionsArray_OneOption() {
82        $this->P->parse('Foo <code C [enable_line_numbers]>Test</code> Bar');
83        $calls = [
84            ['document_start',[]],
85            ['p_open',[]],
86            ['cdata',["\n".'Foo ']],
87            ['p_close',[]],
88            ['code',['Test','C', null,
89                               ['enable_line_numbers' => 1]
90                               ]],
91            ['p_open',[]],
92            ['cdata',[' Bar']],
93            ['p_close',[]],
94            ['document_end',[]],
95        ];
96        $this->assertCalls($calls, $this->H->calls);
97    }
98
99    function testCodeOptionsArray_TwoOptions() {
100        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="3"]>Test</code> Bar');
101        $calls = [
102            ['document_start',[]],
103            ['p_open',[]],
104            ['cdata',["\n".'Foo ']],
105            ['p_close',[]],
106            ['code',['Test','C', null,
107                               ['enable_line_numbers' => true,
108                                     'highlight_lines_extra' => [3]
109                               ]]],
110            ['p_open',[]],
111            ['cdata',[' Bar']],
112            ['p_close',[]],
113            ['document_end',[]],
114        ];
115        $this->assertCalls($calls, $this->H->calls);
116    }
117
118    function testCodeOptionsArray_UnknownOption() {
119        $this->P->parse('Foo <code C [unknown="I will be deleted/ignored!"]>Test</code> Bar');
120        $calls = [
121            ['document_start',[]],
122            ['p_open',[]],
123            ['cdata',["\n".'Foo ']],
124            ['p_close',[]],
125            ['code',['Test','C', null, null]],
126            ['p_open',[]],
127            ['cdata',[' Bar']],
128            ['p_close',[]],
129            ['document_end',[]],
130        ];
131        $this->assertCalls($calls, $this->H->calls);
132    }
133
134    function testCodeOptionsArray_EnableLineNumbers1() {
135        $this->P->parse('Foo <code C [enable_line_numbers]>Test</code> Bar');
136        $calls = [
137            ['document_start',[]],
138            ['p_open',[]],
139            ['cdata',["\n".'Foo ']],
140            ['p_close',[]],
141            ['code',['Test','C', null,
142                               ['enable_line_numbers' => true]
143                               ]],
144            ['p_open',[]],
145            ['cdata',[' Bar']],
146            ['p_close',[]],
147            ['document_end',[]],
148        ];
149        $this->assertCalls($calls, $this->H->calls);
150    }
151
152    function testCodeOptionsArray_EnableLineNumbers2() {
153        $this->P->parse('Foo <code C [enable_line_numbers="1"]>Test</code> Bar');
154        $calls = [
155            ['document_start',[]],
156            ['p_open',[]],
157            ['cdata',["\n".'Foo ']],
158            ['p_close',[]],
159            ['code',['Test','C', null,
160                               ['enable_line_numbers' => true]
161                               ]],
162            ['p_open',[]],
163            ['cdata',[' Bar']],
164            ['p_close',[]],
165            ['document_end',[]],
166        ];
167        $this->assertCalls($calls, $this->H->calls);
168    }
169
170    function testCodeOptionsArray_EnableLineNumbers3() {
171        $this->P->parse('Foo <code C [enable_line_numbers="0"]>Test</code> Bar');
172        $calls = [
173            ['document_start',[]],
174            ['p_open',[]],
175            ['cdata',["\n".'Foo ']],
176            ['p_close',[]],
177            ['code',['Test','C', null,
178                               ['enable_line_numbers' => false]
179                               ]],
180            ['p_open',[]],
181            ['cdata',[' Bar']],
182            ['p_close',[]],
183            ['document_end',[]],
184        ];
185        $this->assertCalls($calls, $this->H->calls);
186    }
187
188    function testCodeOptionsArray_EnableLineNumbers4() {
189        $this->P->parse('Foo <code C [enable_line_numbers=""]>Test</code> Bar');
190        $calls = [
191            ['document_start',[]],
192            ['p_open',[]],
193            ['cdata',["\n".'Foo ']],
194            ['p_close',[]],
195            ['code',['Test','C', null,
196                               ['enable_line_numbers' => true]
197                               ]],
198            ['p_open',[]],
199            ['cdata',[' Bar']],
200            ['p_close',[]],
201            ['document_end',[]],
202        ];
203        $this->assertCalls($calls, $this->H->calls);
204    }
205
206    function testCodeOptionsArray_HighlightLinesExtra1() {
207        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="42, 123, 456, 789"]>Test</code> Bar');
208        $calls = [
209            ['document_start',[]],
210            ['p_open',[]],
211            ['cdata',["\n".'Foo ']],
212            ['p_close',[]],
213            ['code',['Test','C', null,
214                               ['enable_line_numbers' => true,
215                                     'highlight_lines_extra' => [42, 123, 456, 789]
216                               ]]],
217            ['p_open',[]],
218            ['cdata',[' Bar']],
219            ['p_close',[]],
220            ['document_end',[]],
221        ];
222        $this->assertCalls($calls, $this->H->calls);
223    }
224
225    function testCodeOptionsArray_HighlightLinesExtra2() {
226        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra]>Test</code> Bar');
227        $calls = [
228            ['document_start',[]],
229            ['p_open',[]],
230            ['cdata',["\n".'Foo ']],
231            ['p_close',[]],
232            ['code',['Test','C', null,
233                               ['enable_line_numbers' => true,
234                                     'highlight_lines_extra' => [1]]
235                               ]],
236            ['p_open',[]],
237            ['cdata',[' Bar']],
238            ['p_close',[]],
239            ['document_end',[]],
240        ];
241        $this->assertCalls($calls, $this->H->calls);
242    }
243
244    function testCodeOptionsArray_HighlightLinesExtra3() {
245        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra=""]>Test</code> Bar');
246        $calls = [
247            ['document_start',[]],
248            ['p_open',[]],
249            ['cdata',["\n".'Foo ']],
250            ['p_close',[]],
251            ['code',['Test','C', null,
252                               ['enable_line_numbers' => true,
253                                     'highlight_lines_extra' => [1]]
254                               ]],
255            ['p_open',[]],
256            ['cdata',[' Bar']],
257            ['p_close',[]],
258            ['document_end',[]],
259        ];
260        $this->assertCalls($calls, $this->H->calls);
261    }
262
263    function testCodeOptionsArray_StartLineNumbersAt1() {
264        $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at="42"]]>Test</code> Bar');
265        $calls = [
266            ['document_start',[]],
267            ['p_open',[]],
268            ['cdata',["\n".'Foo ']],
269            ['p_close',[]],
270            ['code',['Test','C', null,
271                               ['enable_line_numbers' => true,
272                                     'start_line_numbers_at' => 42]
273                               ]],
274            ['p_open',[]],
275            ['cdata',[' Bar']],
276            ['p_close',[]],
277            ['document_end',[]],
278        ];
279        $this->assertCalls($calls, $this->H->calls);
280    }
281
282    function testCodeOptionsArray_StartLineNumbersAt2() {
283        $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at]]>Test</code> Bar');
284        $calls = [
285            ['document_start',[]],
286            ['p_open',[]],
287            ['cdata',["\n".'Foo ']],
288            ['p_close',[]],
289            ['code',['Test','C', null,
290                               ['enable_line_numbers' => true,
291                                     'start_line_numbers_at' => 1]
292                               ]],
293            ['p_open',[]],
294            ['cdata',[' Bar']],
295            ['p_close',[]],
296            ['document_end',[]],
297        ];
298        $this->assertCalls($calls, $this->H->calls);
299    }
300
301    function testCodeOptionsArray_StartLineNumbersAt3() {
302        $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at=""]]>Test</code> Bar');
303        $calls = [
304            ['document_start',[]],
305            ['p_open',[]],
306            ['cdata',["\n".'Foo ']],
307            ['p_close',[]],
308            ['code',['Test','C', null,
309                               ['enable_line_numbers' => true,
310                                     'start_line_numbers_at' => 1]
311                               ]],
312            ['p_open',[]],
313            ['cdata',[' Bar']],
314            ['p_close',[]],
315            ['document_end',[]],
316        ];
317        $this->assertCalls($calls, $this->H->calls);
318    }
319
320    function testCodeOptionsArray_EnableKeywordLinks1() {
321        $this->P->parse('Foo <code C [enable_keyword_links="false"]>Test</code> Bar');
322        $calls = [
323            ['document_start',[]],
324            ['p_open',[]],
325            ['cdata',["\n".'Foo ']],
326            ['p_close',[]],
327            ['code',['Test','C', null,
328                               ['enable_keyword_links' => false]
329                               ]],
330            ['p_open',[]],
331            ['cdata',[' Bar']],
332            ['p_close',[]],
333            ['document_end',[]],
334        ];
335        $this->assertCalls($calls, $this->H->calls);
336    }
337
338    function testCodeOptionsArray_EnableKeywordLinks2() {
339        $this->P->parse('Foo <code C [enable_keyword_links="true"]>Test</code> Bar');
340        $calls = [
341            ['document_start',[]],
342            ['p_open',[]],
343            ['cdata',["\n".'Foo ']],
344            ['p_close',[]],
345            ['code',['Test','C', null,
346                               ['enable_keyword_links' => true]
347                               ]],
348            ['p_open',[]],
349            ['cdata',[' Bar']],
350            ['p_close',[]],
351            ['document_end',[]],
352        ];
353        $this->assertCalls($calls, $this->H->calls);
354    }
355
356    public function highlightOptionsProvider() {
357        return [
358            ['', null],
359            ['something weird', null],
360            ['enable_line_numbers', ['enable_line_numbers' => true]],
361            ['enable_line_numbers=1', ['enable_line_numbers' => true]],
362            ['enable_line_numbers="1"', ['enable_line_numbers' => true]],
363            ['enable_line_numbers=0', ['enable_line_numbers' => false]],
364            ['enable_line_numbers="0"', ['enable_line_numbers' => false]],
365            ['enable_line_numbers=false', ['enable_line_numbers' => false]],
366            ['enable_line_numbers="false"', ['enable_line_numbers' => false]],
367            ['highlight_lines_extra', ['highlight_lines_extra' => [1]]],
368            ['highlight_lines_extra=17', ['highlight_lines_extra' => [17]]],
369            ['highlight_lines_extra=17,19', ['highlight_lines_extra' => [17, 19]]],
370            ['highlight_lines_extra="17,19"', ['highlight_lines_extra' => [17, 19]]],
371            ['highlight_lines_extra="17,19,17"', ['highlight_lines_extra' => [17, 19]]],
372            ['start_line_numbers_at', ['start_line_numbers_at' => 1]],
373            ['start_line_numbers_at=12', ['start_line_numbers_at' => 12]],
374            ['start_line_numbers_at="12"', ['start_line_numbers_at' => 12]],
375            ['enable_keyword_links', ['enable_keyword_links' => true]],
376            ['enable_keyword_links=1', ['enable_keyword_links' => true]],
377            ['enable_keyword_links="1"', ['enable_keyword_links' => true]],
378            ['enable_keyword_links=0', ['enable_keyword_links' => false]],
379            ['enable_keyword_links="0"', ['enable_keyword_links' => false]],
380            ['enable_keyword_links=false', ['enable_keyword_links' => false]],
381            ['enable_keyword_links="false"', ['enable_keyword_links' => false]],
382            [
383                'enable_line_numbers weird nothing highlight_lines_extra=17,19 start_line_numbers_at="12" enable_keyword_links=false',
384                [
385                    'enable_line_numbers' => true,
386                    'highlight_lines_extra' => [17, 19],
387                    'start_line_numbers_at' => 12,
388                    'enable_keyword_links' => false
389                ]
390            ],
391        ];
392    }
393
394    /**
395     * @dataProvider highlightOptionsProvider
396     * @param string $input options to parse
397     * @param array|null $expect expected outcome
398     */
399    public function testHighlightOptionParser($input, $expect) {
400        $code = new Code();
401        $output = $this->callInaccessibleMethod($code, 'parseHighlightOptions', [$input]);
402        $this->assertEquals($expect, $output);
403    }
404}
405