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