xref: /dokuwiki/_test/tests/inc/parser/parser_links.test.php (revision 5c967d3d04622c1420313f1a514da5cda99827f3)
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 testExternalFTPLink() {
143        $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
144        $this->P->parse("Foo ftp.sunsite.com Bar");
145        $calls = array (
146            array('document_start',array()),
147            array('p_open',array()),
148            array('cdata',array("\n".'Foo ')),
149            array('externallink',array('ftp://ftp.sunsite.com', 'ftp.sunsite.com')),
150            array('cdata',array(' Bar')),
151            array('p_close',array()),
152            array('document_end',array()),
153        );
154        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
155    }
156    function testEmail() {
157        $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
158        $this->P->parse("Foo <bugs@php.net> Bar");
159        $calls = array (
160            array('document_start',array()),
161            array('p_open',array()),
162            array('cdata',array("\n".'Foo ')),
163            array('emaillink',array('bugs@php.net', NULL)),
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 testEmailRFC2822() {
172        $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
173        $this->P->parse("Foo <~fix+bug's.for/ev{e}r@php.net> Bar");
174        $calls = array (
175            array('document_start',array()),
176            array('p_open',array()),
177            array('cdata',array("\n".'Foo ')),
178            array('emaillink',array("~fix+bug's.for/ev{e}r@php.net", NULL)),
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 testEmailCase() {
187        $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
188        $this->P->parse("Foo <bugs@pHp.net> Bar");
189        $calls = array (
190            array('document_start',array()),
191            array('p_open',array()),
192            array('cdata',array("\n".'Foo ')),
193            array('emaillink',array('bugs@pHp.net', NULL)),
194            array('cdata',array(' Bar')),
195            array('p_close',array()),
196            array('document_end',array()),
197        );
198        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
199    }
200
201
202    function testInternalLinkOneChar() {
203        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
204        $this->P->parse("Foo [[l]] Bar");
205        $calls = array (
206            array('document_start',array()),
207            array('p_open',array()),
208            array('cdata',array("\n".'Foo ')),
209            array('internallink',array('l',NULL)),
210            array('cdata',array(' Bar')),
211            array('p_close',array()),
212            array('document_end',array()),
213        );
214        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
215    }
216
217    function testInternalLinkNoChar() {
218        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
219        $this->P->parse("Foo [[]] Bar");
220        $calls = array (
221            array('document_start',array()),
222            array('p_open',array()),
223            array('cdata',array("\n".'Foo ')),
224            array('internallink',array('',NULL)),
225            array('cdata',array(' Bar')),
226            array('p_close',array()),
227            array('document_end',array()),
228        );
229        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
230    }
231
232    function testInternalLinkNamespaceNoTitle() {
233        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
234        $this->P->parse("Foo [[foo:bar]] Bar");
235        $calls = array (
236            array('document_start',array()),
237            array('p_open',array()),
238            array('cdata',array("\n".'Foo ')),
239            array('internallink',array('foo:bar',NULL)),
240            array('cdata',array(' Bar')),
241            array('p_close',array()),
242            array('document_end',array()),
243        );
244        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
245    }
246
247    function testInternalLinkNamespace() {
248        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
249        $this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar");
250        $calls = array (
251            array('document_start',array()),
252            array('p_open',array()),
253            array('cdata',array("\n".'Foo ')),
254            array('internallink',array('x:1:y:foo_bar:z','Test')),
255            array('cdata',array(' Bar')),
256            array('p_close',array()),
257            array('document_end',array()),
258        );
259        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
260    }
261
262    function testInternalLinkSectionRef() {
263        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
264        $this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar");
265        $calls = array (
266            array('document_start',array()),
267            array('p_open',array()),
268            array('cdata',array("\n".'Foo ')),
269            array('internallink',array('wiki:syntax#internal','Syntax')),
270            array('cdata',array(' Bar')),
271            array('p_close',array()),
272            array('document_end',array()),
273        );
274        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
275    }
276
277    function testExternalInInternalLink() {
278        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
279        $this->P->parse("Foo [[http://www.google.com|Google]] Bar");
280        $calls = array (
281            array('document_start',array()),
282            array('p_open',array()),
283            array('cdata',array("\n".'Foo ')),
284            array('externallink',array('http://www.google.com','Google')),
285            array('cdata',array(' Bar')),
286            array('p_close',array()),
287            array('document_end',array()),
288        );
289        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
290    }
291
292    function testInterwikiLink() {
293        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
294        $this->P->parse("Foo [[iw>somepage|Some Page]] Bar");
295        $calls = array (
296            array('document_start',array()),
297            array('p_open',array()),
298            array('cdata',array("\n".'Foo ')),
299            array('interwikilink',array('iw>somepage','Some Page','iw','somepage')),
300            array('cdata',array(' Bar')),
301            array('p_close',array()),
302            array('document_end',array()),
303        );
304        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
305    }
306
307    function testInterwikiLinkCase() {
308        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
309        $this->P->parse("Foo [[IW>somepage|Some Page]] Bar");
310        $calls = array (
311            array('document_start',array()),
312            array('p_open',array()),
313            array('cdata',array("\n".'Foo ')),
314            array('interwikilink',array('IW>somepage','Some Page','iw','somepage')),
315            array('cdata',array(' Bar')),
316            array('p_close',array()),
317            array('document_end',array()),
318        );
319        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
320    }
321
322    function testInterwikiPedia() {
323        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
324        $this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar");
325        $calls = array (
326            array('document_start',array()),
327            array('p_open',array()),
328            array('cdata',array("\n".'Foo ')),
329            array('interwikilink',array('wp>Callback_(computer_science)','callbacks','wp','Callback_(computer_science)')),
330            array('cdata',array(' Bar')),
331            array('p_close',array()),
332            array('document_end',array()),
333        );
334        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
335    }
336
337    function testCamelCase() {
338        $this->P->addMode('camelcaselink',new Doku_Parser_Mode_CamelCaseLink());
339        $this->P->parse("Foo FooBar Bar");
340        $calls = array (
341            array('document_start',array()),
342            array('p_open',array()),
343            array('cdata',array("\n".'Foo ')),
344            array('camelcaselink',array('FooBar')),
345            array('cdata',array(' Bar')),
346            array('p_close',array()),
347            array('document_end',array()),
348        );
349        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
350    }
351
352    function testFileLink() {
353        $this->P->addMode('filelink',new Doku_Parser_Mode_FileLink());
354        $this->P->parse('Foo file://temp/file.txt Bar');
355        $calls = array (
356            array('document_start',array()),
357            array('p_open',array()),
358            array('cdata',array("\n".'Foo ')),
359            array('filelink',array('file://temp/file.txt ',NULL)),
360            array('cdata',array('Bar')),
361            array('p_close',array()),
362            array('document_end',array()),
363        );
364        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
365    }
366
367    function testFileLinkInternal() {
368        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
369        $this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar');
370        $calls = array (
371            array('document_start',array()),
372            array('p_open',array()),
373            array('cdata',array("\n".'Foo ')),
374            array('externallink',array('file://temp/file.txt','Some File')),
375            array('cdata',array(' Bar')),
376            array('p_close',array()),
377            array('document_end',array()),
378        );
379        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
380    }
381
382    function testWindowsShareLink() {
383        $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
384        $this->P->parse('Foo \\\server\share Bar');
385        $calls = array (
386            array('document_start',array()),
387            array('p_open',array()),
388            array('cdata',array("\n".'Foo ')),
389            array('windowssharelink',array('\\\server\share',NULL)),
390            array('cdata',array(' Bar')),
391            array('p_close',array()),
392            array('document_end',array()),
393        );
394        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
395    }
396
397    function testWindowsShareLinkHyphen() {
398        $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
399        $this->P->parse('Foo \\\server\share-hyphen Bar');
400        $calls = array (
401        array('document_start',array()),
402        array('p_open',array()),
403        array('cdata',array("\n".'Foo ')),
404        array('windowssharelink',array('\\\server\share-hyphen',NULL)),
405        array('cdata',array(' Bar')),
406        array('p_close',array()),
407        array('document_end',array()),
408        );
409        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
410    }
411
412    function testWindowsShareLinkInternal() {
413        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
414        $this->P->parse('Foo [[\\\server\share|My Documents]] Bar');
415        $calls = array (
416            array('document_start',array()),
417            array('p_open',array()),
418            array('cdata',array("\n".'Foo ')),
419            array('windowssharelink',array('\\\server\share','My Documents')),
420            array('cdata',array(' Bar')),
421            array('p_close',array()),
422            array('document_end',array()),
423        );
424        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
425    }
426
427    function testMediaInternal() {
428        $this->P->addMode('media',new Doku_Parser_Mode_Media());
429        $this->P->parse('Foo {{img.gif}} Bar');
430        $calls = array (
431            array('document_start',array()),
432            array('p_open',array()),
433            array('cdata',array("\n".'Foo ')),
434            array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','details')),
435            array('cdata',array(' Bar')),
436            array('p_close',array()),
437            array('document_end',array()),
438        );
439        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
440    }
441
442    function testMediaInternalLinkOnly() {
443        $this->P->addMode('media',new Doku_Parser_Mode_Media());
444        $this->P->parse('Foo {{img.gif?linkonly}} Bar');
445        $calls = array (
446            array('document_start',array()),
447            array('p_open',array()),
448            array('cdata',array("\n".'Foo ')),
449            array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','linkonly')),
450            array('cdata',array(' Bar')),
451            array('p_close',array()),
452            array('document_end',array()),
453        );
454        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
455    }
456
457    function testMediaNotImage() {
458        $this->P->addMode('media',new Doku_Parser_Mode_Media());
459        $this->P->parse('Foo {{foo.txt?10x10|Some File}} Bar');
460        $calls = array (
461            array('document_start',array()),
462            array('p_open',array()),
463            array('cdata',array("\n".'Foo ')),
464            array('internalmedia',array('foo.txt','Some File',null,10,10,'cache','details')),
465            array('cdata',array(' Bar')),
466            array('p_close',array()),
467            array('document_end',array()),
468        );
469        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
470    }
471
472    function testMediaInternalLAlign() {
473        $this->P->addMode('media',new Doku_Parser_Mode_Media());
474        $this->P->parse('Foo {{img.gif }} Bar');
475        $calls = array (
476            array('document_start',array()),
477            array('p_open',array()),
478            array('cdata',array("\n".'Foo ')),
479            array('internalmedia',array('img.gif',NULL,'left',NULL,NULL,'cache','details')),
480            array('cdata',array(' Bar')),
481            array('p_close',array()),
482            array('document_end',array()),
483        );
484        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
485    }
486
487    function testMediaInternalRAlign() {
488        $this->P->addMode('media',new Doku_Parser_Mode_Media());
489        $this->P->parse('Foo {{ img.gif}} Bar');
490        $calls = array (
491            array('document_start',array()),
492            array('p_open',array()),
493            array('cdata',array("\n".'Foo ')),
494            array('internalmedia',array('img.gif',NULL,'right',NULL,NULL,'cache','details')),
495            array('cdata',array(' Bar')),
496            array('p_close',array()),
497            array('document_end',array()),
498        );
499        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
500    }
501
502    function testMediaInternalCenter() {
503        $this->P->addMode('media',new Doku_Parser_Mode_Media());
504        $this->P->parse('Foo {{ img.gif }} Bar');
505        $calls = array (
506            array('document_start',array()),
507            array('p_open',array()),
508            array('cdata',array("\n".'Foo ')),
509            array('internalmedia',array('img.gif',NULL,'center',NULL,NULL,'cache','details')),
510            array('cdata',array(' Bar')),
511            array('p_close',array()),
512            array('document_end',array()),
513        );
514        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
515    }
516
517    function testMediaInternalParams() {
518        $this->P->addMode('media',new Doku_Parser_Mode_Media());
519        $this->P->parse('Foo {{img.gif?50x100nocache}} Bar');
520        $calls = array (
521            array('document_start',array()),
522            array('p_open',array()),
523            array('cdata',array("\n".'Foo ')),
524            array('internalmedia',array('img.gif',NULL,NULL,'50','100','nocache','details')),
525            array('cdata',array(' Bar')),
526            array('p_close',array()),
527            array('document_end',array()),
528        );
529        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
530    }
531
532    function testMediaInternalTitle() {
533        $this->P->addMode('media',new Doku_Parser_Mode_Media());
534        $this->P->parse('Foo {{img.gif?50x100|Some Image}} Bar');
535        $calls = array (
536            array('document_start',array()),
537            array('p_open',array()),
538            array('cdata',array("\n".'Foo ')),
539            array('internalmedia',array('img.gif','Some Image',NULL,'50','100','cache','details')),
540            array('cdata',array(' Bar')),
541            array('p_close',array()),
542            array('document_end',array()),
543        );
544        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
545    }
546
547    function testMediaExternal() {
548        $this->P->addMode('media',new Doku_Parser_Mode_Media());
549        $this->P->parse('Foo {{http://www.google.com/img.gif}} Bar');
550        $calls = array (
551            array('document_start',array()),
552            array('p_open',array()),
553            array('cdata',array("\n".'Foo ')),
554            array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,NULL,NULL,'cache','details')),
555            array('cdata',array(' Bar')),
556            array('p_close',array()),
557            array('document_end',array()),
558        );
559        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
560    }
561
562    function testMediaExternalParams() {
563        $this->P->addMode('media',new Doku_Parser_Mode_Media());
564        $this->P->parse('Foo {{http://www.google.com/img.gif?50x100nocache}} Bar');
565        $calls = array (
566            array('document_start',array()),
567            array('p_open',array()),
568            array('cdata',array("\n".'Foo ')),
569            array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,'50','100','nocache','details')),
570            array('cdata',array(' Bar')),
571            array('p_close',array()),
572            array('document_end',array()),
573        );
574        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
575    }
576
577    function testMediaExternalTitle() {
578        $this->P->addMode('media',new Doku_Parser_Mode_Media());
579        $this->P->parse('Foo {{http://www.google.com/img.gif?50x100|Some Image}} Bar');
580        $calls = array (
581            array('document_start',array()),
582            array('p_open',array()),
583            array('cdata',array("\n".'Foo ')),
584            array('externalmedia',
585            array('http://www.google.com/img.gif','Some Image',NULL,'50','100','cache','details')),
586            array('cdata',array(' Bar')),
587            array('p_close',array()),
588            array('document_end',array()),
589        );
590        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
591    }
592
593    function testMediaInInternalLink() {
594        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
595        $this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar");
596
597        $image = array(
598            'type'=>'internalmedia',
599            'src'=>'img.gif',
600            'title'=>'Some Image',
601            'align'=>NULL,
602            'width'=>10,
603            'height'=>20,
604            'cache'=>'nocache',
605            'linking'=>'details',
606        );
607
608        $calls = array (
609            array('document_start',array()),
610            array('p_open',array()),
611            array('cdata',array("\n".'Foo ')),
612            array('internallink',array('x:1:y:foo_bar:z',$image)),
613            array('cdata',array(' Bar')),
614            array('p_close',array()),
615            array('document_end',array()),
616        );
617        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
618    }
619
620    function testMediaNoImageInInternalLink() {
621        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
622        $this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar");
623
624        $image = array(
625            'type'=>'internalmedia',
626            'src'=>'foo.txt',
627            'title'=>'Some Image',
628            'align'=>NULL,
629            'width'=>10,
630            'height'=>20,
631            'cache'=>'nocache',
632            'linking'=>'details',
633        );
634
635        $calls = array (
636            array('document_start',array()),
637            array('p_open',array()),
638            array('cdata',array("\n".'Foo ')),
639            array('internallink',array('x:1:y:foo_bar:z',$image)),
640            array('cdata',array(' Bar')),
641            array('p_close',array()),
642            array('document_end',array()),
643        );
644        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
645    }
646
647    function testMediaInEmailLink() {
648        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
649        $this->P->parse("Foo [[foo@example.com|{{img.gif?10x20nocache|Some Image}}]] Bar");
650
651        $image = array(
652            'type'=>'internalmedia',
653            'src'=>'img.gif',
654            'title'=>'Some Image',
655            'align'=>NULL,
656            'width'=>10,
657            'height'=>20,
658            'cache'=>'nocache',
659            'linking'=>'details',
660        );
661
662        $calls = array (
663            array('document_start',array()),
664            array('p_open',array()),
665            array('cdata',array("\n".'Foo ')),
666            array('emaillink',array('foo@example.com',$image)),
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 testNestedMedia() {
675        $this->P->addMode('media',new Doku_Parser_Mode_Media());
676        $this->P->parse('Foo {{img.gif|{{foo.gif|{{bar.gif|Bar}}}}}} Bar');
677        $calls = array (
678            array('document_start',array()),
679            array('p_open',array()),
680            array('cdata',array("\n".'Foo ')),
681            array('internalmedia',
682            array('img.gif','{{foo.gif|{{bar.gif|Bar',NULL,NULL,NULL,'cache','details')),
683            array('cdata',array('}}}} Bar')),
684            array('p_close',array()),
685            array('document_end',array()),
686        );
687        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
688    }
689
690}
691
692