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