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