1<?php 2require_once 'parser.inc.php'; 3 4/** 5 * Tests for the implementation of link syntax 6 * 7 * @group parser_links 8*/ 9class TestOfDoku_Parser_Links extends TestOfDoku_Parser { 10 11 function testExternalLinkSimple() { 12 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 13 $this->P->parse("Foo http://www.google.com Bar"); 14 $calls = array ( 15 array('document_start',array()), 16 array('p_open',array()), 17 array('cdata',array("\n".'Foo ')), 18 array('externallink',array('http://www.google.com', NULL)), 19 array('cdata',array(' Bar')), 20 array('p_close',array()), 21 array('document_end',array()), 22 ); 23 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 24 } 25 26 function testExternalLinkCase() { 27 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 28 $this->P->parse("Foo HTTP://WWW.GOOGLE.COM Bar"); 29 $calls = array ( 30 array('document_start',array()), 31 array('p_open',array()), 32 array('cdata',array("\n".'Foo ')), 33 array('externallink',array('HTTP://WWW.GOOGLE.COM', NULL)), 34 array('cdata',array(' Bar')), 35 array('p_close',array()), 36 array('document_end',array()), 37 ); 38 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 39 } 40 41 function testExternalIPv4() { 42 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 43 $this->P->parse("Foo http://123.123.3.21/foo Bar"); 44 $calls = array ( 45 array('document_start',array()), 46 array('p_open',array()), 47 array('cdata',array("\n".'Foo ')), 48 array('externallink',array('http://123.123.3.21/foo', NULL)), 49 array('cdata',array(' Bar')), 50 array('p_close',array()), 51 array('document_end',array()), 52 ); 53 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 54 } 55 56 function testExternalIPv6() { 57 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 58 $this->P->parse("Foo http://[3ffe:2a00:100:7031::1]/foo Bar"); 59 $calls = array ( 60 array('document_start',array()), 61 array('p_open',array()), 62 array('cdata',array("\n".'Foo ')), 63 array('externallink',array('http://[3ffe:2a00:100:7031::1]/foo', NULL)), 64 array('cdata',array(' Bar')), 65 array('p_close',array()), 66 array('document_end',array()), 67 ); 68 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 69 } 70 71 function testExternalMulti(){ 72 $this->teardown(); 73 74 $links = array( 75 'http://www.google.com', 76 'HTTP://WWW.GOOGLE.COM', 77 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html', 78 'http://[1080:0:0:0:8:800:200C:417A]/index.html', 79 'http://[3ffe:2a00:100:7031::1]', 80 'http://[1080::8:800:200C:417A]/foo', 81 'http://[::192.9.5.5]/ipng', 82 'http://[::FFFF:129.144.52.38]:80/index.html', 83 'http://[2010:836B:4179::836B:4179]', 84 ); 85 $titles = array(false,null,'foo bar'); 86 foreach($links as $link){ 87 foreach($titles as $title){ 88 if($title === false){ 89 $source = $link; 90 $name = null; 91 }elseif($title === null){ 92 $source = "[[$link]]"; 93 $name = null; 94 }else{ 95 $source = "[[$link|$title]]"; 96 $name = $title; 97 } 98 $this->setup(); 99 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 100 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 101 $this->P->parse("Foo $source Bar"); 102 $calls = array ( 103 array('document_start',array()), 104 array('p_open',array()), 105 array('cdata',array("\n".'Foo ')), 106 array('externallink',array($link, $name)), 107 array('cdata',array(' Bar')), 108 array('p_close',array()), 109 array('document_end',array()), 110 ); 111 $this->assertEquals(array_map('stripByteIndex',$this->H->calls), $calls, $source); 112 $this->teardown(); 113 } 114 } 115 116 $this->setup(); 117 } 118 119 function testExternalLinkJavascript() { 120 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 121 $this->P->parse("Foo javascript:alert('XSS'); Bar"); 122 $calls = array ( 123 array('document_start',array()), 124 array('p_open',array()), 125 array('cdata',array("\nFoo javascript:alert('XSS'); Bar")), 126 array('p_close',array()), 127 array('document_end',array()), 128 ); 129 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 130 } 131 132 function testExternalWWWLink() { 133 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 134 $this->P->parse("Foo www.google.com Bar"); 135 $calls = array ( 136 array('document_start',array()), 137 array('p_open',array()), 138 array('cdata',array("\n".'Foo ')), 139 array('externallink',array('http://www.google.com', 'www.google.com')), 140 array('cdata',array(' Bar')), 141 array('p_close',array()), 142 array('document_end',array()), 143 ); 144 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 145 } 146 147 function testExternalWWWLinkInPath() { 148 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 149 // See issue #936. Should NOT generate a link! 150 $this->P->parse("Foo /home/subdir/www/www.something.de/somedir/ Bar"); 151 $calls = array ( 152 array('document_start',array()), 153 array('p_open',array()), 154 array('cdata',array("\n".'Foo /home/subdir/www/www.something.de/somedir/ Bar')), 155 array('p_close',array()), 156 array('document_end',array()), 157 ); 158 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 159 } 160 161 function testExternalWWWLinkFollowingPath() { 162 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 163 $this->P->parse("Foo /home/subdir/www/ www.something.de/somedir/ Bar"); 164 $calls = array ( 165 array('document_start',array()), 166 array('p_open',array()), 167 array('cdata',array("\n".'Foo /home/subdir/www/ ')), 168 array('externallink',array('http://www.something.de/somedir/', 'www.something.de/somedir/')), 169 array('cdata',array(' Bar')), 170 array('p_close',array()), 171 array('document_end',array()), 172 ); 173 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 174 } 175 176 function testExternalFTPLink() { 177 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 178 $this->P->parse("Foo ftp.sunsite.com Bar"); 179 $calls = array ( 180 array('document_start',array()), 181 array('p_open',array()), 182 array('cdata',array("\n".'Foo ')), 183 array('externallink',array('ftp://ftp.sunsite.com', 'ftp.sunsite.com')), 184 array('cdata',array(' Bar')), 185 array('p_close',array()), 186 array('document_end',array()), 187 ); 188 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 189 } 190 191 function testExternalFTPLinkInPath() { 192 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 193 // See issue #936. Should NOT generate a link! 194 $this->P->parse("Foo /home/subdir/www/ftp.something.de/somedir/ Bar"); 195 $calls = array ( 196 array('document_start',array()), 197 array('p_open',array()), 198 array('cdata',array("\n".'Foo /home/subdir/www/ftp.something.de/somedir/ Bar')), 199 array('p_close',array()), 200 array('document_end',array()), 201 ); 202 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 203 } 204 205 function testExternalFTPLinkFollowingPath() { 206 $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); 207 $this->P->parse("Foo /home/subdir/www/ ftp.something.de/somedir/ Bar"); 208 $calls = array ( 209 array('document_start',array()), 210 array('p_open',array()), 211 array('cdata',array("\n".'Foo /home/subdir/www/ ')), 212 array('externallink',array('ftp://ftp.something.de/somedir/', 'ftp.something.de/somedir/')), 213 array('cdata',array(' Bar')), 214 array('p_close',array()), 215 array('document_end',array()), 216 ); 217 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 218 } 219 220 function testEmail() { 221 $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink()); 222 $this->P->parse("Foo <bugs@php.net> Bar"); 223 $calls = array ( 224 array('document_start',array()), 225 array('p_open',array()), 226 array('cdata',array("\n".'Foo ')), 227 array('emaillink',array('bugs@php.net', NULL)), 228 array('cdata',array(' Bar')), 229 array('p_close',array()), 230 array('document_end',array()), 231 ); 232 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 233 } 234 235 function testEmailRFC2822() { 236 $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink()); 237 $this->P->parse("Foo <~fix+bug's.for/ev{e}r@php.net> Bar"); 238 $calls = array ( 239 array('document_start',array()), 240 array('p_open',array()), 241 array('cdata',array("\n".'Foo ')), 242 array('emaillink',array("~fix+bug's.for/ev{e}r@php.net", NULL)), 243 array('cdata',array(' Bar')), 244 array('p_close',array()), 245 array('document_end',array()), 246 ); 247 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 248 } 249 250 function testEmailCase() { 251 $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink()); 252 $this->P->parse("Foo <bugs@pHp.net> Bar"); 253 $calls = array ( 254 array('document_start',array()), 255 array('p_open',array()), 256 array('cdata',array("\n".'Foo ')), 257 array('emaillink',array('bugs@pHp.net', NULL)), 258 array('cdata',array(' Bar')), 259 array('p_close',array()), 260 array('document_end',array()), 261 ); 262 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 263 } 264 265 266 function testInternalLinkOneChar() { 267 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 268 $this->P->parse("Foo [[l]] Bar"); 269 $calls = array ( 270 array('document_start',array()), 271 array('p_open',array()), 272 array('cdata',array("\n".'Foo ')), 273 array('internallink',array('l',NULL)), 274 array('cdata',array(' Bar')), 275 array('p_close',array()), 276 array('document_end',array()), 277 ); 278 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 279 } 280 281 function testInternalLinkNoChar() { 282 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 283 $this->P->parse("Foo [[]] Bar"); 284 $calls = array ( 285 array('document_start',array()), 286 array('p_open',array()), 287 array('cdata',array("\n".'Foo ')), 288 array('internallink',array('',NULL)), 289 array('cdata',array(' Bar')), 290 array('p_close',array()), 291 array('document_end',array()), 292 ); 293 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 294 } 295 296 function testInternalLinkNamespaceNoTitle() { 297 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 298 $this->P->parse("Foo [[foo:bar]] Bar"); 299 $calls = array ( 300 array('document_start',array()), 301 array('p_open',array()), 302 array('cdata',array("\n".'Foo ')), 303 array('internallink',array('foo:bar',NULL)), 304 array('cdata',array(' Bar')), 305 array('p_close',array()), 306 array('document_end',array()), 307 ); 308 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 309 } 310 311 function testInternalLinkNamespace() { 312 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 313 $this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar"); 314 $calls = array ( 315 array('document_start',array()), 316 array('p_open',array()), 317 array('cdata',array("\n".'Foo ')), 318 array('internallink',array('x:1:y:foo_bar:z','Test')), 319 array('cdata',array(' Bar')), 320 array('p_close',array()), 321 array('document_end',array()), 322 ); 323 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 324 } 325 326 function testInternalLinkSectionRef() { 327 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 328 $this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar"); 329 $calls = array ( 330 array('document_start',array()), 331 array('p_open',array()), 332 array('cdata',array("\n".'Foo ')), 333 array('internallink',array('wiki:syntax#internal','Syntax')), 334 array('cdata',array(' Bar')), 335 array('p_close',array()), 336 array('document_end',array()), 337 ); 338 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 339 } 340 341 function testInternalLinkCodeFollows() { 342 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 343 $this->P->parse("Foo [[wiki:internal:link|Test]] Bar <code>command [arg1 [arg2 [arg3]]]</code>"); 344 $calls = array ( 345 array('document_start',array()), 346 array('p_open',array()), 347 array('cdata',array("\n".'Foo ')), 348 array('internallink',array('wiki:internal:link','Test')), 349 array('cdata',array(' Bar <code>command [arg1 [arg2 [arg3]]]</code>')), 350 array('p_close',array()), 351 array('document_end',array()), 352 ); 353 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 354 } 355 356 function testInternalLinkCodeFollows2() { 357 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 358 $this->P->parse("Foo [[wiki:internal:link|[Square brackets in title] Test]] Bar <code>command [arg1 [arg2 [arg3]]]</code>"); 359 $calls = array ( 360 array('document_start',array()), 361 array('p_open',array()), 362 array('cdata',array("\n".'Foo ')), 363 array('internallink',array('wiki:internal:link','[Square brackets in title] Test')), 364 array('cdata',array(' Bar <code>command [arg1 [arg2 [arg3]]]</code>')), 365 array('p_close',array()), 366 array('document_end',array()), 367 ); 368 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 369 } 370 371 function testExternalInInternalLink() { 372 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 373 $this->P->parse("Foo [[http://www.google.com|Google]] Bar"); 374 $calls = array ( 375 array('document_start',array()), 376 array('p_open',array()), 377 array('cdata',array("\n".'Foo ')), 378 array('externallink',array('http://www.google.com','Google')), 379 array('cdata',array(' Bar')), 380 array('p_close',array()), 381 array('document_end',array()), 382 ); 383 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 384 } 385 386 function testExternalInInternalLink2() { 387 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 388 $this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar"); 389 $calls = array ( 390 array('document_start',array()), 391 array('p_open',array()), 392 array('cdata',array("\n".'Foo ')), 393 array('externallink',array('http://www.google.com?test[]=squarebracketsinurl','Google')), 394 array('cdata',array(' Bar')), 395 array('p_close',array()), 396 array('document_end',array()), 397 ); 398 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 399 } 400 401 function testExternalInInternalLink2CodeFollows() { 402 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 403 $this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar <code>command [arg1 [arg2 [arg3]]]</code>"); 404 $calls = array ( 405 array('document_start',array()), 406 array('p_open',array()), 407 array('cdata',array("\n".'Foo ')), 408 array('externallink',array('http://www.google.com?test[]=squarebracketsinurl','Google')), 409 array('cdata',array(' Bar <code>command [arg1 [arg2 [arg3]]]</code>')), 410 array('p_close',array()), 411 array('document_end',array()), 412 ); 413 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 414 } 415 416 function testTwoInternalLinks() { 417 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 418 $this->P->parse("Foo [[foo:bar|one]] and [[bar:foo|two]] Bar"); 419 $calls = array ( 420 array('document_start',array()), 421 array('p_open',array()), 422 array('cdata',array("\n".'Foo ')), 423 array('internallink',array('foo:bar','one')), 424 array('cdata',array(' and ')), 425 array('internallink',array('bar:foo','two')), 426 array('cdata',array(' Bar')), 427 array('p_close',array()), 428 array('document_end',array()), 429 ); 430 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 431 } 432 433 434 function testInterwikiLink() { 435 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 436 $this->P->parse("Foo [[iw>somepage|Some Page]] Bar"); 437 $calls = array ( 438 array('document_start',array()), 439 array('p_open',array()), 440 array('cdata',array("\n".'Foo ')), 441 array('interwikilink',array('iw>somepage','Some Page','iw','somepage')), 442 array('cdata',array(' Bar')), 443 array('p_close',array()), 444 array('document_end',array()), 445 ); 446 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 447 } 448 449 function testInterwikiLinkCase() { 450 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 451 $this->P->parse("Foo [[IW>somepage|Some Page]] Bar"); 452 $calls = array ( 453 array('document_start',array()), 454 array('p_open',array()), 455 array('cdata',array("\n".'Foo ')), 456 array('interwikilink',array('IW>somepage','Some Page','iw','somepage')), 457 array('cdata',array(' Bar')), 458 array('p_close',array()), 459 array('document_end',array()), 460 ); 461 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 462 } 463 464 function testInterwikiPedia() { 465 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 466 $this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar"); 467 $calls = array ( 468 array('document_start',array()), 469 array('p_open',array()), 470 array('cdata',array("\n".'Foo ')), 471 array('interwikilink',array('wp>Callback_(computer_science)','callbacks','wp','Callback_(computer_science)')), 472 array('cdata',array(' Bar')), 473 array('p_close',array()), 474 array('document_end',array()), 475 ); 476 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 477 } 478 479 function testCamelCase() { 480 $this->P->addMode('camelcaselink',new Doku_Parser_Mode_CamelCaseLink()); 481 $this->P->parse("Foo FooBar Bar"); 482 $calls = array ( 483 array('document_start',array()), 484 array('p_open',array()), 485 array('cdata',array("\n".'Foo ')), 486 array('camelcaselink',array('FooBar')), 487 array('cdata',array(' Bar')), 488 array('p_close',array()), 489 array('document_end',array()), 490 ); 491 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 492 } 493 494 function testFileLink() { 495 $this->P->addMode('filelink',new Doku_Parser_Mode_FileLink()); 496 $this->P->parse('Foo file://temp/file.txt Bar'); 497 $calls = array ( 498 array('document_start',array()), 499 array('p_open',array()), 500 array('cdata',array("\n".'Foo ')), 501 array('filelink',array('file://temp/file.txt ',NULL)), 502 array('cdata',array('Bar')), 503 array('p_close',array()), 504 array('document_end',array()), 505 ); 506 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 507 } 508 509 function testFileLinkInternal() { 510 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 511 $this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar'); 512 $calls = array ( 513 array('document_start',array()), 514 array('p_open',array()), 515 array('cdata',array("\n".'Foo ')), 516 array('externallink',array('file://temp/file.txt','Some File')), 517 array('cdata',array(' Bar')), 518 array('p_close',array()), 519 array('document_end',array()), 520 ); 521 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 522 } 523 524 function testWindowsShareLink() { 525 $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink()); 526 $this->P->parse('Foo \\\server\share Bar'); 527 $calls = array ( 528 array('document_start',array()), 529 array('p_open',array()), 530 array('cdata',array("\n".'Foo ')), 531 array('windowssharelink',array('\\\server\share',NULL)), 532 array('cdata',array(' Bar')), 533 array('p_close',array()), 534 array('document_end',array()), 535 ); 536 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 537 } 538 539 function testWindowsShareLinkHyphen() { 540 $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink()); 541 $this->P->parse('Foo \\\server\share-hyphen Bar'); 542 $calls = array ( 543 array('document_start',array()), 544 array('p_open',array()), 545 array('cdata',array("\n".'Foo ')), 546 array('windowssharelink',array('\\\server\share-hyphen',NULL)), 547 array('cdata',array(' Bar')), 548 array('p_close',array()), 549 array('document_end',array()), 550 ); 551 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 552 } 553 554 function testWindowsShareLinkInternal() { 555 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 556 $this->P->parse('Foo [[\\\server\share|My Documents]] Bar'); 557 $calls = array ( 558 array('document_start',array()), 559 array('p_open',array()), 560 array('cdata',array("\n".'Foo ')), 561 array('windowssharelink',array('\\\server\share','My Documents')), 562 array('cdata',array(' Bar')), 563 array('p_close',array()), 564 array('document_end',array()), 565 ); 566 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 567 } 568 569 function testMediaInternal() { 570 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 571 $this->P->parse('Foo {{img.gif}} Bar'); 572 $calls = array ( 573 array('document_start',array()), 574 array('p_open',array()), 575 array('cdata',array("\n".'Foo ')), 576 array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','details')), 577 array('cdata',array(' Bar')), 578 array('p_close',array()), 579 array('document_end',array()), 580 ); 581 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 582 } 583 584 function testMediaInternalLinkOnly() { 585 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 586 $this->P->parse('Foo {{img.gif?linkonly}} Bar'); 587 $calls = array ( 588 array('document_start',array()), 589 array('p_open',array()), 590 array('cdata',array("\n".'Foo ')), 591 array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','linkonly')), 592 array('cdata',array(' Bar')), 593 array('p_close',array()), 594 array('document_end',array()), 595 ); 596 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 597 } 598 599 function testMediaNotImage() { 600 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 601 $this->P->parse('Foo {{foo.txt?10x10|Some File}} Bar'); 602 $calls = array ( 603 array('document_start',array()), 604 array('p_open',array()), 605 array('cdata',array("\n".'Foo ')), 606 array('internalmedia',array('foo.txt','Some File',null,10,10,'cache','details')), 607 array('cdata',array(' Bar')), 608 array('p_close',array()), 609 array('document_end',array()), 610 ); 611 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 612 } 613 614 function testMediaInternalLAlign() { 615 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 616 $this->P->parse('Foo {{img.gif }} Bar'); 617 $calls = array ( 618 array('document_start',array()), 619 array('p_open',array()), 620 array('cdata',array("\n".'Foo ')), 621 array('internalmedia',array('img.gif',NULL,'left',NULL,NULL,'cache','details')), 622 array('cdata',array(' Bar')), 623 array('p_close',array()), 624 array('document_end',array()), 625 ); 626 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 627 } 628 629 function testMediaInternalRAlign() { 630 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 631 $this->P->parse('Foo {{ img.gif}} Bar'); 632 $calls = array ( 633 array('document_start',array()), 634 array('p_open',array()), 635 array('cdata',array("\n".'Foo ')), 636 array('internalmedia',array('img.gif',NULL,'right',NULL,NULL,'cache','details')), 637 array('cdata',array(' Bar')), 638 array('p_close',array()), 639 array('document_end',array()), 640 ); 641 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 642 } 643 644 function testMediaInternalCenter() { 645 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 646 $this->P->parse('Foo {{ img.gif }} Bar'); 647 $calls = array ( 648 array('document_start',array()), 649 array('p_open',array()), 650 array('cdata',array("\n".'Foo ')), 651 array('internalmedia',array('img.gif',NULL,'center',NULL,NULL,'cache','details')), 652 array('cdata',array(' Bar')), 653 array('p_close',array()), 654 array('document_end',array()), 655 ); 656 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 657 } 658 659 function testMediaInternalParams() { 660 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 661 $this->P->parse('Foo {{img.gif?50x100nocache}} Bar'); 662 $calls = array ( 663 array('document_start',array()), 664 array('p_open',array()), 665 array('cdata',array("\n".'Foo ')), 666 array('internalmedia',array('img.gif',NULL,NULL,'50','100','nocache','details')), 667 array('cdata',array(' Bar')), 668 array('p_close',array()), 669 array('document_end',array()), 670 ); 671 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 672 } 673 674 function testMediaInternalTitle() { 675 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 676 $this->P->parse('Foo {{img.gif?50x100|Some Image}} Bar'); 677 $calls = array ( 678 array('document_start',array()), 679 array('p_open',array()), 680 array('cdata',array("\n".'Foo ')), 681 array('internalmedia',array('img.gif','Some Image',NULL,'50','100','cache','details')), 682 array('cdata',array(' Bar')), 683 array('p_close',array()), 684 array('document_end',array()), 685 ); 686 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 687 } 688 689 function testMediaExternal() { 690 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 691 $this->P->parse('Foo {{http://www.google.com/img.gif}} Bar'); 692 $calls = array ( 693 array('document_start',array()), 694 array('p_open',array()), 695 array('cdata',array("\n".'Foo ')), 696 array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,NULL,NULL,'cache','details')), 697 array('cdata',array(' Bar')), 698 array('p_close',array()), 699 array('document_end',array()), 700 ); 701 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 702 } 703 704 function testMediaExternalParams() { 705 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 706 $this->P->parse('Foo {{http://www.google.com/img.gif?50x100nocache}} Bar'); 707 $calls = array ( 708 array('document_start',array()), 709 array('p_open',array()), 710 array('cdata',array("\n".'Foo ')), 711 array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,'50','100','nocache','details')), 712 array('cdata',array(' Bar')), 713 array('p_close',array()), 714 array('document_end',array()), 715 ); 716 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 717 } 718 719 function testMediaExternalTitle() { 720 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 721 $this->P->parse('Foo {{http://www.google.com/img.gif?50x100|Some Image}} Bar'); 722 $calls = array ( 723 array('document_start',array()), 724 array('p_open',array()), 725 array('cdata',array("\n".'Foo ')), 726 array('externalmedia', 727 array('http://www.google.com/img.gif','Some Image',NULL,'50','100','cache','details')), 728 array('cdata',array(' Bar')), 729 array('p_close',array()), 730 array('document_end',array()), 731 ); 732 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 733 } 734 735 function testMediaInInternalLink() { 736 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 737 $this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar"); 738 739 $image = array( 740 'type'=>'internalmedia', 741 'src'=>'img.gif', 742 'title'=>'Some Image', 743 'align'=>NULL, 744 'width'=>10, 745 'height'=>20, 746 'cache'=>'nocache', 747 'linking'=>'details', 748 ); 749 750 $calls = array ( 751 array('document_start',array()), 752 array('p_open',array()), 753 array('cdata',array("\n".'Foo ')), 754 array('internallink',array('x:1:y:foo_bar:z',$image)), 755 array('cdata',array(' Bar')), 756 array('p_close',array()), 757 array('document_end',array()), 758 ); 759 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 760 } 761 762 function testMediaNoImageInInternalLink() { 763 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 764 $this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar"); 765 766 $image = array( 767 'type'=>'internalmedia', 768 'src'=>'foo.txt', 769 'title'=>'Some Image', 770 'align'=>NULL, 771 'width'=>10, 772 'height'=>20, 773 'cache'=>'nocache', 774 'linking'=>'details', 775 ); 776 777 $calls = array ( 778 array('document_start',array()), 779 array('p_open',array()), 780 array('cdata',array("\n".'Foo ')), 781 array('internallink',array('x:1:y:foo_bar:z',$image)), 782 array('cdata',array(' Bar')), 783 array('p_close',array()), 784 array('document_end',array()), 785 ); 786 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 787 } 788 789 function testMediaInEmailLink() { 790 $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); 791 $this->P->parse("Foo [[foo@example.com|{{img.gif?10x20nocache|Some Image}}]] Bar"); 792 793 $image = array( 794 'type'=>'internalmedia', 795 'src'=>'img.gif', 796 'title'=>'Some Image', 797 'align'=>NULL, 798 'width'=>10, 799 'height'=>20, 800 'cache'=>'nocache', 801 'linking'=>'details', 802 ); 803 804 $calls = array ( 805 array('document_start',array()), 806 array('p_open',array()), 807 array('cdata',array("\n".'Foo ')), 808 array('emaillink',array('foo@example.com',$image)), 809 array('cdata',array(' Bar')), 810 array('p_close',array()), 811 array('document_end',array()), 812 ); 813 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 814 } 815 816 function testNestedMedia() { 817 $this->P->addMode('media',new Doku_Parser_Mode_Media()); 818 $this->P->parse('Foo {{img.gif|{{foo.gif|{{bar.gif|Bar}}}}}} Bar'); 819 $calls = array ( 820 array('document_start',array()), 821 array('p_open',array()), 822 array('cdata',array("\n".'Foo ')), 823 array('internalmedia', 824 array('img.gif','{{foo.gif|{{bar.gif|Bar',NULL,NULL,NULL,'cache','details')), 825 array('cdata',array('}}}} Bar')), 826 array('p_close',array()), 827 array('document_end',array()), 828 ); 829 $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls); 830 } 831 832} 833 834