xref: /dokuwiki/_test/tests/Parsing/ParserMode/CodeTest.php (revision 884caed926ca0aa0af6ce3f34ae3aa7317a3361a)
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        // `[unknown=...]` contains no recognised option, so the options
120        // slot stays absent — the call shape is the 3-arg default rather
121        // than a 4-arg call with a null options slot.
122        $this->P->parse('Foo <code C [unknown="I will be deleted/ignored!"]>Test</code> Bar');
123        $calls = [
124            ['document_start',[]],
125            ['p_open',[]],
126            ['cdata',["\n".'Foo ']],
127            ['p_close',[]],
128            ['code',['Test','C', null]],
129            ['p_open',[]],
130            ['cdata',['Bar']],
131            ['p_close',[]],
132            ['document_end',[]],
133        ];
134        $this->assertCalls($calls, $this->H->calls);
135    }
136
137    function testCodeOptionsArray_EnableLineNumbers1() {
138        $this->P->parse('Foo <code C [enable_line_numbers]>Test</code> Bar');
139        $calls = [
140            ['document_start',[]],
141            ['p_open',[]],
142            ['cdata',["\n".'Foo ']],
143            ['p_close',[]],
144            ['code',['Test','C', null,
145                               ['enable_line_numbers' => true]
146                               ]],
147            ['p_open',[]],
148            ['cdata',['Bar']],
149            ['p_close',[]],
150            ['document_end',[]],
151        ];
152        $this->assertCalls($calls, $this->H->calls);
153    }
154
155    function testCodeOptionsArray_EnableLineNumbers2() {
156        $this->P->parse('Foo <code C [enable_line_numbers="1"]>Test</code> Bar');
157        $calls = [
158            ['document_start',[]],
159            ['p_open',[]],
160            ['cdata',["\n".'Foo ']],
161            ['p_close',[]],
162            ['code',['Test','C', null,
163                               ['enable_line_numbers' => true]
164                               ]],
165            ['p_open',[]],
166            ['cdata',['Bar']],
167            ['p_close',[]],
168            ['document_end',[]],
169        ];
170        $this->assertCalls($calls, $this->H->calls);
171    }
172
173    function testCodeOptionsArray_EnableLineNumbers3() {
174        $this->P->parse('Foo <code C [enable_line_numbers="0"]>Test</code> Bar');
175        $calls = [
176            ['document_start',[]],
177            ['p_open',[]],
178            ['cdata',["\n".'Foo ']],
179            ['p_close',[]],
180            ['code',['Test','C', null,
181                               ['enable_line_numbers' => false]
182                               ]],
183            ['p_open',[]],
184            ['cdata',['Bar']],
185            ['p_close',[]],
186            ['document_end',[]],
187        ];
188        $this->assertCalls($calls, $this->H->calls);
189    }
190
191    function testCodeOptionsArray_EnableLineNumbers4() {
192        $this->P->parse('Foo <code C [enable_line_numbers=""]>Test</code> Bar');
193        $calls = [
194            ['document_start',[]],
195            ['p_open',[]],
196            ['cdata',["\n".'Foo ']],
197            ['p_close',[]],
198            ['code',['Test','C', null,
199                               ['enable_line_numbers' => true]
200                               ]],
201            ['p_open',[]],
202            ['cdata',['Bar']],
203            ['p_close',[]],
204            ['document_end',[]],
205        ];
206        $this->assertCalls($calls, $this->H->calls);
207    }
208
209    function testCodeOptionsArray_HighlightLinesExtra1() {
210        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra="42, 123, 456, 789"]>Test</code> Bar');
211        $calls = [
212            ['document_start',[]],
213            ['p_open',[]],
214            ['cdata',["\n".'Foo ']],
215            ['p_close',[]],
216            ['code',['Test','C', null,
217                               ['enable_line_numbers' => true,
218                                     'highlight_lines_extra' => [42, 123, 456, 789]
219                               ]]],
220            ['p_open',[]],
221            ['cdata',['Bar']],
222            ['p_close',[]],
223            ['document_end',[]],
224        ];
225        $this->assertCalls($calls, $this->H->calls);
226    }
227
228    function testCodeOptionsArray_HighlightLinesExtra2() {
229        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra]>Test</code> Bar');
230        $calls = [
231            ['document_start',[]],
232            ['p_open',[]],
233            ['cdata',["\n".'Foo ']],
234            ['p_close',[]],
235            ['code',['Test','C', null,
236                               ['enable_line_numbers' => true,
237                                     'highlight_lines_extra' => [1]]
238                               ]],
239            ['p_open',[]],
240            ['cdata',['Bar']],
241            ['p_close',[]],
242            ['document_end',[]],
243        ];
244        $this->assertCalls($calls, $this->H->calls);
245    }
246
247    function testCodeOptionsArray_HighlightLinesExtra3() {
248        $this->P->parse('Foo <code C [enable_line_numbers highlight_lines_extra=""]>Test</code> Bar');
249        $calls = [
250            ['document_start',[]],
251            ['p_open',[]],
252            ['cdata',["\n".'Foo ']],
253            ['p_close',[]],
254            ['code',['Test','C', null,
255                               ['enable_line_numbers' => true,
256                                     'highlight_lines_extra' => [1]]
257                               ]],
258            ['p_open',[]],
259            ['cdata',['Bar']],
260            ['p_close',[]],
261            ['document_end',[]],
262        ];
263        $this->assertCalls($calls, $this->H->calls);
264    }
265
266    function testCodeOptionsArray_StartLineNumbersAt1() {
267        $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at="42"]]>Test</code> Bar');
268        $calls = [
269            ['document_start',[]],
270            ['p_open',[]],
271            ['cdata',["\n".'Foo ']],
272            ['p_close',[]],
273            ['code',['Test','C', null,
274                               ['enable_line_numbers' => true,
275                                     'start_line_numbers_at' => 42]
276                               ]],
277            ['p_open',[]],
278            ['cdata',['Bar']],
279            ['p_close',[]],
280            ['document_end',[]],
281        ];
282        $this->assertCalls($calls, $this->H->calls);
283    }
284
285    function testCodeOptionsArray_StartLineNumbersAt2() {
286        $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at]]>Test</code> Bar');
287        $calls = [
288            ['document_start',[]],
289            ['p_open',[]],
290            ['cdata',["\n".'Foo ']],
291            ['p_close',[]],
292            ['code',['Test','C', null,
293                               ['enable_line_numbers' => true,
294                                     'start_line_numbers_at' => 1]
295                               ]],
296            ['p_open',[]],
297            ['cdata',['Bar']],
298            ['p_close',[]],
299            ['document_end',[]],
300        ];
301        $this->assertCalls($calls, $this->H->calls);
302    }
303
304    function testCodeOptionsArray_StartLineNumbersAt3() {
305        $this->P->parse('Foo <code C [enable_line_numbers [enable_line_numbers start_line_numbers_at=""]]>Test</code> Bar');
306        $calls = [
307            ['document_start',[]],
308            ['p_open',[]],
309            ['cdata',["\n".'Foo ']],
310            ['p_close',[]],
311            ['code',['Test','C', null,
312                               ['enable_line_numbers' => true,
313                                     'start_line_numbers_at' => 1]
314                               ]],
315            ['p_open',[]],
316            ['cdata',['Bar']],
317            ['p_close',[]],
318            ['document_end',[]],
319        ];
320        $this->assertCalls($calls, $this->H->calls);
321    }
322
323    function testCodeOptionsArray_EnableKeywordLinks1() {
324        $this->P->parse('Foo <code C [enable_keyword_links="false"]>Test</code> Bar');
325        $calls = [
326            ['document_start',[]],
327            ['p_open',[]],
328            ['cdata',["\n".'Foo ']],
329            ['p_close',[]],
330            ['code',['Test','C', null,
331                               ['enable_keyword_links' => false]
332                               ]],
333            ['p_open',[]],
334            ['cdata',['Bar']],
335            ['p_close',[]],
336            ['document_end',[]],
337        ];
338        $this->assertCalls($calls, $this->H->calls);
339    }
340
341    function testCodeOptionsArray_EnableKeywordLinks2() {
342        $this->P->parse('Foo <code C [enable_keyword_links="true"]>Test</code> Bar');
343        $calls = [
344            ['document_start',[]],
345            ['p_open',[]],
346            ['cdata',["\n".'Foo ']],
347            ['p_close',[]],
348            ['code',['Test','C', null,
349                               ['enable_keyword_links' => true]
350                               ]],
351            ['p_open',[]],
352            ['cdata',['Bar']],
353            ['p_close',[]],
354            ['document_end',[]],
355        ];
356        $this->assertCalls($calls, $this->H->calls);
357    }
358
359}
360