xref: /dokuwiki/_test/tests/inc/parser/parser_links.test.php (revision 58332f92e599b579dcdc7f655b9bc34711e0dcb1)
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 testExternalWWWLinkInPath() {
148        $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
149        // See issue #936. Should NOT generate a link!
150        $this->P->parse("Foo /home/subdir/www/www.something.de/somedir/ Bar");
151        $calls = array (
152            array('document_start',array()),
153            array('p_open',array()),
154            array('cdata',array("\n".'Foo /home/subdir/www/www.something.de/somedir/ Bar')),
155            array('p_close',array()),
156            array('document_end',array()),
157        );
158        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
159    }
160
161    function testExternalWWWLinkFollowingPath() {
162        $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
163        $this->P->parse("Foo /home/subdir/www/ www.something.de/somedir/ Bar");
164        $calls = array (
165            array('document_start',array()),
166            array('p_open',array()),
167            array('cdata',array("\n".'Foo /home/subdir/www/ ')),
168            array('externallink',array('http://www.something.de/somedir/', 'www.something.de/somedir/')),
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 testExternalFTPLink() {
177        $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
178        $this->P->parse("Foo ftp.sunsite.com Bar");
179        $calls = array (
180            array('document_start',array()),
181            array('p_open',array()),
182            array('cdata',array("\n".'Foo ')),
183            array('externallink',array('ftp://ftp.sunsite.com', 'ftp.sunsite.com')),
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 testExternalFTPLinkInPath() {
192        $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
193        // See issue #936. Should NOT generate a link!
194        $this->P->parse("Foo /home/subdir/www/ftp.something.de/somedir/ Bar");
195        $calls = array (
196            array('document_start',array()),
197            array('p_open',array()),
198            array('cdata',array("\n".'Foo /home/subdir/www/ftp.something.de/somedir/ Bar')),
199            array('p_close',array()),
200            array('document_end',array()),
201        );
202        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
203    }
204
205    function testExternalFTPLinkFollowingPath() {
206        $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
207        $this->P->parse("Foo /home/subdir/www/ ftp.something.de/somedir/ Bar");
208        $calls = array (
209            array('document_start',array()),
210            array('p_open',array()),
211            array('cdata',array("\n".'Foo /home/subdir/www/ ')),
212            array('externallink',array('ftp://ftp.something.de/somedir/', 'ftp.something.de/somedir/')),
213            array('cdata',array(' Bar')),
214            array('p_close',array()),
215            array('document_end',array()),
216        );
217        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
218    }
219
220    function testEmail() {
221        $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
222        $this->P->parse("Foo <bugs@php.net> Bar");
223        $calls = array (
224            array('document_start',array()),
225            array('p_open',array()),
226            array('cdata',array("\n".'Foo ')),
227            array('emaillink',array('bugs@php.net', NULL)),
228            array('cdata',array(' Bar')),
229            array('p_close',array()),
230            array('document_end',array()),
231        );
232        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
233    }
234
235    function testEmailRFC2822() {
236        $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
237        $this->P->parse("Foo <~fix+bug's.for/ev{e}r@php.net> Bar");
238        $calls = array (
239            array('document_start',array()),
240            array('p_open',array()),
241            array('cdata',array("\n".'Foo ')),
242            array('emaillink',array("~fix+bug's.for/ev{e}r@php.net", NULL)),
243            array('cdata',array(' Bar')),
244            array('p_close',array()),
245            array('document_end',array()),
246        );
247        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
248    }
249
250    function testEmailCase() {
251        $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
252        $this->P->parse("Foo <bugs@pHp.net> Bar");
253        $calls = array (
254            array('document_start',array()),
255            array('p_open',array()),
256            array('cdata',array("\n".'Foo ')),
257            array('emaillink',array('bugs@pHp.net', NULL)),
258            array('cdata',array(' Bar')),
259            array('p_close',array()),
260            array('document_end',array()),
261        );
262        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
263    }
264
265
266    function testInternalLinkOneChar() {
267        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
268        $this->P->parse("Foo [[l]] Bar");
269        $calls = array (
270            array('document_start',array()),
271            array('p_open',array()),
272            array('cdata',array("\n".'Foo ')),
273            array('internallink',array('l',NULL)),
274            array('cdata',array(' Bar')),
275            array('p_close',array()),
276            array('document_end',array()),
277        );
278        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
279    }
280
281    function testInternalLinkNoChar() {
282        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
283        $this->P->parse("Foo [[]] Bar");
284        $calls = array (
285            array('document_start',array()),
286            array('p_open',array()),
287            array('cdata',array("\n".'Foo ')),
288            array('internallink',array('',NULL)),
289            array('cdata',array(' Bar')),
290            array('p_close',array()),
291            array('document_end',array()),
292        );
293        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
294    }
295
296    function testInternalLinkNamespaceNoTitle() {
297        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
298        $this->P->parse("Foo [[foo:bar]] Bar");
299        $calls = array (
300            array('document_start',array()),
301            array('p_open',array()),
302            array('cdata',array("\n".'Foo ')),
303            array('internallink',array('foo:bar',NULL)),
304            array('cdata',array(' Bar')),
305            array('p_close',array()),
306            array('document_end',array()),
307        );
308        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
309    }
310
311    function testInternalLinkNamespace() {
312        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
313        $this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar");
314        $calls = array (
315            array('document_start',array()),
316            array('p_open',array()),
317            array('cdata',array("\n".'Foo ')),
318            array('internallink',array('x:1:y:foo_bar:z','Test')),
319            array('cdata',array(' Bar')),
320            array('p_close',array()),
321            array('document_end',array()),
322        );
323        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
324    }
325
326    function testInternalLinkSectionRef() {
327        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
328        $this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar");
329        $calls = array (
330            array('document_start',array()),
331            array('p_open',array()),
332            array('cdata',array("\n".'Foo ')),
333            array('internallink',array('wiki:syntax#internal','Syntax')),
334            array('cdata',array(' Bar')),
335            array('p_close',array()),
336            array('document_end',array()),
337        );
338        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
339    }
340
341    function testInternalLinkCodeFollows() {
342        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
343        $this->P->parse("Foo [[wiki:internal:link|Test]] Bar <code>command [arg1 [arg2 [arg3]]]</code>");
344        $calls = array (
345            array('document_start',array()),
346            array('p_open',array()),
347            array('cdata',array("\n".'Foo ')),
348            array('internallink',array('wiki:internal:link','Test')),
349            array('cdata',array(' Bar <code>command [arg1 [arg2 [arg3]]]</code>')),
350            array('p_close',array()),
351            array('document_end',array()),
352        );
353        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
354    }
355
356    function testInternalLinkCodeFollows2() {
357        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
358        $this->P->parse("Foo [[wiki:internal:link|[Square brackets in title] Test]] Bar <code>command [arg1 [arg2 [arg3]]]</code>");
359        $calls = array (
360            array('document_start',array()),
361            array('p_open',array()),
362            array('cdata',array("\n".'Foo ')),
363            array('internallink',array('wiki:internal:link','[Square brackets in title] Test')),
364            array('cdata',array(' Bar <code>command [arg1 [arg2 [arg3]]]</code>')),
365            array('p_close',array()),
366            array('document_end',array()),
367        );
368        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
369    }
370
371    function testExternalInInternalLink() {
372        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
373        $this->P->parse("Foo [[http://www.google.com|Google]] Bar");
374        $calls = array (
375            array('document_start',array()),
376            array('p_open',array()),
377            array('cdata',array("\n".'Foo ')),
378            array('externallink',array('http://www.google.com','Google')),
379            array('cdata',array(' Bar')),
380            array('p_close',array()),
381            array('document_end',array()),
382        );
383        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
384    }
385
386    function testExternalInInternalLink2() {
387        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
388        $this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar");
389        $calls = array (
390            array('document_start',array()),
391            array('p_open',array()),
392            array('cdata',array("\n".'Foo ')),
393            array('externallink',array('http://www.google.com?test[]=squarebracketsinurl','Google')),
394            array('cdata',array(' Bar')),
395            array('p_close',array()),
396            array('document_end',array()),
397        );
398        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
399    }
400
401    function testExternalInInternalLink2CodeFollows() {
402        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
403        $this->P->parse("Foo [[http://www.google.com?test[]=squarebracketsinurl|Google]] Bar <code>command [arg1 [arg2 [arg3]]]</code>");
404        $calls = array (
405            array('document_start',array()),
406            array('p_open',array()),
407            array('cdata',array("\n".'Foo ')),
408            array('externallink',array('http://www.google.com?test[]=squarebracketsinurl','Google')),
409            array('cdata',array(' Bar <code>command [arg1 [arg2 [arg3]]]</code>')),
410            array('p_close',array()),
411            array('document_end',array()),
412        );
413        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
414    }
415
416    function testTwoInternalLinks() {
417        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
418        $this->P->parse("Foo [[foo:bar|one]] and [[bar:foo|two]] Bar");
419        $calls = array (
420            array('document_start',array()),
421            array('p_open',array()),
422            array('cdata',array("\n".'Foo ')),
423            array('internallink',array('foo:bar','one')),
424            array('cdata',array(' and ')),
425            array('internallink',array('bar:foo','two')),
426            array('cdata',array(' Bar')),
427            array('p_close',array()),
428            array('document_end',array()),
429        );
430        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
431    }
432
433
434    function testInterwikiLink() {
435        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
436        $this->P->parse("Foo [[iw>somepage|Some Page]] Bar");
437        $calls = array (
438            array('document_start',array()),
439            array('p_open',array()),
440            array('cdata',array("\n".'Foo ')),
441            array('interwikilink',array('iw>somepage','Some Page','iw','somepage')),
442            array('cdata',array(' Bar')),
443            array('p_close',array()),
444            array('document_end',array()),
445        );
446        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
447    }
448
449    function testInterwikiLinkCase() {
450        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
451        $this->P->parse("Foo [[IW>somepage|Some Page]] Bar");
452        $calls = array (
453            array('document_start',array()),
454            array('p_open',array()),
455            array('cdata',array("\n".'Foo ')),
456            array('interwikilink',array('IW>somepage','Some Page','iw','somepage')),
457            array('cdata',array(' Bar')),
458            array('p_close',array()),
459            array('document_end',array()),
460        );
461        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
462    }
463
464    function testInterwikiPedia() {
465        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
466        $this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar");
467        $calls = array (
468            array('document_start',array()),
469            array('p_open',array()),
470            array('cdata',array("\n".'Foo ')),
471            array('interwikilink',array('wp>Callback_(computer_science)','callbacks','wp','Callback_(computer_science)')),
472            array('cdata',array(' Bar')),
473            array('p_close',array()),
474            array('document_end',array()),
475        );
476        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
477    }
478
479    function testCamelCase() {
480        $this->P->addMode('camelcaselink',new Doku_Parser_Mode_CamelCaseLink());
481        $this->P->parse("Foo FooBar Bar");
482        $calls = array (
483            array('document_start',array()),
484            array('p_open',array()),
485            array('cdata',array("\n".'Foo ')),
486            array('camelcaselink',array('FooBar')),
487            array('cdata',array(' Bar')),
488            array('p_close',array()),
489            array('document_end',array()),
490        );
491        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
492    }
493
494    function testFileLink() {
495        $this->P->addMode('filelink',new Doku_Parser_Mode_FileLink());
496        $this->P->parse('Foo file://temp/file.txt Bar');
497        $calls = array (
498            array('document_start',array()),
499            array('p_open',array()),
500            array('cdata',array("\n".'Foo ')),
501            array('filelink',array('file://temp/file.txt ',NULL)),
502            array('cdata',array('Bar')),
503            array('p_close',array()),
504            array('document_end',array()),
505        );
506        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
507    }
508
509    function testFileLinkInternal() {
510        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
511        $this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar');
512        $calls = array (
513            array('document_start',array()),
514            array('p_open',array()),
515            array('cdata',array("\n".'Foo ')),
516            array('externallink',array('file://temp/file.txt','Some File')),
517            array('cdata',array(' Bar')),
518            array('p_close',array()),
519            array('document_end',array()),
520        );
521        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
522    }
523
524    function testWindowsShareLink() {
525        $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
526        $this->P->parse('Foo \\\server\share Bar');
527        $calls = array (
528            array('document_start',array()),
529            array('p_open',array()),
530            array('cdata',array("\n".'Foo ')),
531            array('windowssharelink',array('\\\server\share',NULL)),
532            array('cdata',array(' Bar')),
533            array('p_close',array()),
534            array('document_end',array()),
535        );
536        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
537    }
538
539    function testWindowsShareLinkHyphen() {
540        $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink());
541        $this->P->parse('Foo \\\server\share-hyphen Bar');
542        $calls = array (
543        array('document_start',array()),
544        array('p_open',array()),
545        array('cdata',array("\n".'Foo ')),
546        array('windowssharelink',array('\\\server\share-hyphen',NULL)),
547        array('cdata',array(' Bar')),
548        array('p_close',array()),
549        array('document_end',array()),
550        );
551        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
552    }
553
554    function testWindowsShareLinkInternal() {
555        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
556        $this->P->parse('Foo [[\\\server\share|My Documents]] Bar');
557        $calls = array (
558            array('document_start',array()),
559            array('p_open',array()),
560            array('cdata',array("\n".'Foo ')),
561            array('windowssharelink',array('\\\server\share','My Documents')),
562            array('cdata',array(' Bar')),
563            array('p_close',array()),
564            array('document_end',array()),
565        );
566        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
567    }
568
569    function testMediaInternal() {
570        $this->P->addMode('media',new Doku_Parser_Mode_Media());
571        $this->P->parse('Foo {{img.gif}} Bar');
572        $calls = array (
573            array('document_start',array()),
574            array('p_open',array()),
575            array('cdata',array("\n".'Foo ')),
576            array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','details')),
577            array('cdata',array(' Bar')),
578            array('p_close',array()),
579            array('document_end',array()),
580        );
581        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
582    }
583
584    function testMediaInternalLinkOnly() {
585        $this->P->addMode('media',new Doku_Parser_Mode_Media());
586        $this->P->parse('Foo {{img.gif?linkonly}} Bar');
587        $calls = array (
588            array('document_start',array()),
589            array('p_open',array()),
590            array('cdata',array("\n".'Foo ')),
591            array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','linkonly')),
592            array('cdata',array(' Bar')),
593            array('p_close',array()),
594            array('document_end',array()),
595        );
596        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
597    }
598
599    function testMediaNotImage() {
600        $this->P->addMode('media',new Doku_Parser_Mode_Media());
601        $this->P->parse('Foo {{foo.txt?10x10|Some File}} Bar');
602        $calls = array (
603            array('document_start',array()),
604            array('p_open',array()),
605            array('cdata',array("\n".'Foo ')),
606            array('internalmedia',array('foo.txt','Some File',null,10,10,'cache','details')),
607            array('cdata',array(' Bar')),
608            array('p_close',array()),
609            array('document_end',array()),
610        );
611        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
612    }
613
614    function testMediaInternalLAlign() {
615        $this->P->addMode('media',new Doku_Parser_Mode_Media());
616        $this->P->parse('Foo {{img.gif }} Bar');
617        $calls = array (
618            array('document_start',array()),
619            array('p_open',array()),
620            array('cdata',array("\n".'Foo ')),
621            array('internalmedia',array('img.gif',NULL,'left',NULL,NULL,'cache','details')),
622            array('cdata',array(' Bar')),
623            array('p_close',array()),
624            array('document_end',array()),
625        );
626        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
627    }
628
629    function testMediaInternalRAlign() {
630        $this->P->addMode('media',new Doku_Parser_Mode_Media());
631        $this->P->parse('Foo {{ img.gif}} Bar');
632        $calls = array (
633            array('document_start',array()),
634            array('p_open',array()),
635            array('cdata',array("\n".'Foo ')),
636            array('internalmedia',array('img.gif',NULL,'right',NULL,NULL,'cache','details')),
637            array('cdata',array(' Bar')),
638            array('p_close',array()),
639            array('document_end',array()),
640        );
641        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
642    }
643
644    function testMediaInternalCenter() {
645        $this->P->addMode('media',new Doku_Parser_Mode_Media());
646        $this->P->parse('Foo {{ img.gif }} Bar');
647        $calls = array (
648            array('document_start',array()),
649            array('p_open',array()),
650            array('cdata',array("\n".'Foo ')),
651            array('internalmedia',array('img.gif',NULL,'center',NULL,NULL,'cache','details')),
652            array('cdata',array(' Bar')),
653            array('p_close',array()),
654            array('document_end',array()),
655        );
656        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
657    }
658
659    function testMediaInternalParams() {
660        $this->P->addMode('media',new Doku_Parser_Mode_Media());
661        $this->P->parse('Foo {{img.gif?50x100nocache}} Bar');
662        $calls = array (
663            array('document_start',array()),
664            array('p_open',array()),
665            array('cdata',array("\n".'Foo ')),
666            array('internalmedia',array('img.gif',NULL,NULL,'50','100','nocache','details')),
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 testMediaInternalTitle() {
675        $this->P->addMode('media',new Doku_Parser_Mode_Media());
676        $this->P->parse('Foo {{img.gif?50x100|Some Image}} Bar');
677        $calls = array (
678            array('document_start',array()),
679            array('p_open',array()),
680            array('cdata',array("\n".'Foo ')),
681            array('internalmedia',array('img.gif','Some Image',NULL,'50','100','cache','details')),
682            array('cdata',array(' Bar')),
683            array('p_close',array()),
684            array('document_end',array()),
685        );
686        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
687    }
688
689    function testMediaExternal() {
690        $this->P->addMode('media',new Doku_Parser_Mode_Media());
691        $this->P->parse('Foo {{http://www.google.com/img.gif}} Bar');
692        $calls = array (
693            array('document_start',array()),
694            array('p_open',array()),
695            array('cdata',array("\n".'Foo ')),
696            array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,NULL,NULL,'cache','details')),
697            array('cdata',array(' Bar')),
698            array('p_close',array()),
699            array('document_end',array()),
700        );
701        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
702    }
703
704    function testMediaExternalParams() {
705        $this->P->addMode('media',new Doku_Parser_Mode_Media());
706        $this->P->parse('Foo {{http://www.google.com/img.gif?50x100nocache}} Bar');
707        $calls = array (
708            array('document_start',array()),
709            array('p_open',array()),
710            array('cdata',array("\n".'Foo ')),
711            array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,'50','100','nocache','details')),
712            array('cdata',array(' Bar')),
713            array('p_close',array()),
714            array('document_end',array()),
715        );
716        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
717    }
718
719    function testMediaExternalTitle() {
720        $this->P->addMode('media',new Doku_Parser_Mode_Media());
721        $this->P->parse('Foo {{http://www.google.com/img.gif?50x100|Some Image}} Bar');
722        $calls = array (
723            array('document_start',array()),
724            array('p_open',array()),
725            array('cdata',array("\n".'Foo ')),
726            array('externalmedia',
727            array('http://www.google.com/img.gif','Some Image',NULL,'50','100','cache','details')),
728            array('cdata',array(' Bar')),
729            array('p_close',array()),
730            array('document_end',array()),
731        );
732        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
733    }
734
735    function testMediaInInternalLink() {
736        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
737        $this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar");
738
739        $image = array(
740            'type'=>'internalmedia',
741            'src'=>'img.gif',
742            'title'=>'Some Image',
743            'align'=>NULL,
744            'width'=>10,
745            'height'=>20,
746            'cache'=>'nocache',
747            'linking'=>'details',
748        );
749
750        $calls = array (
751            array('document_start',array()),
752            array('p_open',array()),
753            array('cdata',array("\n".'Foo ')),
754            array('internallink',array('x:1:y:foo_bar:z',$image)),
755            array('cdata',array(' Bar')),
756            array('p_close',array()),
757            array('document_end',array()),
758        );
759        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
760    }
761
762    function testMediaNoImageInInternalLink() {
763        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
764        $this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar");
765
766        $image = array(
767            'type'=>'internalmedia',
768            'src'=>'foo.txt',
769            'title'=>'Some Image',
770            'align'=>NULL,
771            'width'=>10,
772            'height'=>20,
773            'cache'=>'nocache',
774            'linking'=>'details',
775        );
776
777        $calls = array (
778            array('document_start',array()),
779            array('p_open',array()),
780            array('cdata',array("\n".'Foo ')),
781            array('internallink',array('x:1:y:foo_bar:z',$image)),
782            array('cdata',array(' Bar')),
783            array('p_close',array()),
784            array('document_end',array()),
785        );
786        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
787    }
788
789    function testMediaInEmailLink() {
790        $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
791        $this->P->parse("Foo [[foo@example.com|{{img.gif?10x20nocache|Some Image}}]] Bar");
792
793        $image = array(
794            'type'=>'internalmedia',
795            'src'=>'img.gif',
796            'title'=>'Some Image',
797            'align'=>NULL,
798            'width'=>10,
799            'height'=>20,
800            'cache'=>'nocache',
801            'linking'=>'details',
802        );
803
804        $calls = array (
805            array('document_start',array()),
806            array('p_open',array()),
807            array('cdata',array("\n".'Foo ')),
808            array('emaillink',array('foo@example.com',$image)),
809            array('cdata',array(' Bar')),
810            array('p_close',array()),
811            array('document_end',array()),
812        );
813        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
814    }
815
816    function testNestedMedia() {
817        $this->P->addMode('media',new Doku_Parser_Mode_Media());
818        $this->P->parse('Foo {{img.gif|{{foo.gif|{{bar.gif|Bar}}}}}} Bar');
819        $calls = array (
820            array('document_start',array()),
821            array('p_open',array()),
822            array('cdata',array("\n".'Foo ')),
823            array('internalmedia',
824            array('img.gif','{{foo.gif|{{bar.gif|Bar',NULL,NULL,NULL,'cache','details')),
825            array('cdata',array('}}}} Bar')),
826            array('p_close',array()),
827            array('document_end',array()),
828        );
829        $this->assertEquals(array_map('stripByteIndex',$this->H->calls),$calls);
830    }
831
832}
833
834