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