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