xref: /dokuwiki/_test/tests/Parsing/ParserMode/LinksTest.php (revision 504c13e8df88563c11b3720b317991bc38835a35)
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