xref: /dokuwiki/_test/tests/Parsing/ParserMode/MediaTest.php (revision 504c13e8df88563c11b3720b317991bc38835a35)
1<?php
2
3namespace dokuwiki\test\Parsing\ParserMode;
4
5use Doku_Renderer_xhtml;
6
7/**
8 * Tests for the implementation of audio and video files
9 *
10 * @group parser_media
11 * @author  Michael Große <grosse@cosmocode.de>
12*/
13class MediaTest extends ParserTestBase
14{
15
16    function testVideoOGVExternal() {
17        $file = 'http://some.where.far/away.ogv';
18        $parser_response = p_get_instructions('{{' . $file . '}}');
19
20        $calls = [
21            ['document_start',[]],
22            ['p_open',[]],
23            ['externalmedia',[$file,null,null,null,null,'cache','details']],
24            ['cdata',[null]],
25            ['p_close',[]],
26            ['document_end',[]],
27        ];
28        $this->assertCalls($calls, $parser_response);
29
30        $Renderer = new Doku_Renderer_xhtml();
31        $url = $Renderer->externalmedia($file,null,null,null,null,'cache','details',true);
32        //print_r("url: " . $url);
33        $video = '<video class="media" width="320" height="240" controls="controls">';
34        $this->assertEquals($video, substr($url,0,66));
35        $source = '<source src="http://some.where.far/away.ogv" type="video/ogg" />';
36        $this->assertEquals($source, substr($url,67,64));
37        // work around random token
38        $a_first_part = '<a href="' . \DOKU_BASE . 'lib/exe/fetch.php?tok=';
39        $a_second_part = '&amp;media=http%3A%2F%2Fsome.where.far%2Faway.ogv" class="media mediafile mf_ogv" title="http://some.where.far/away.ogv">';
40
41        $substr_start = 132;
42        $substr_len = strlen($a_first_part);
43        $this->assertEquals($a_first_part, substr($url, $substr_start, $substr_len));
44
45        $substr_start = strpos($url, '&amp;media', $substr_start + $substr_len);
46        $this->assertNotSame(false, $substr_start, 'Substring not found.');
47        $substr_len = strlen($a_second_part);
48        $this->assertEquals($a_second_part, substr($url, $substr_start, $substr_len));
49
50        $rest = 'away.ogv</a></video>'."\n";
51        $substr_start = strlen($url) - strlen($rest);
52        $this->assertEquals($rest, substr($url, $substr_start));
53    }
54
55    /**
56     * unknown extension of external media file
57     */
58    function testVideoVIDExternal() {
59        $file = 'http://some.where.far/away.vid';
60        $parser_response = p_get_instructions('{{' . $file . '}}');
61
62        $calls = [
63            ['document_start', []],
64            ['p_open', []],
65            ['externalmedia', [$file, null, null, null, null, 'cache', 'details']],
66            ['cdata', [null]],
67            ['p_close', []],
68            ['document_end', []],
69        ];
70        $this->assertCalls($calls, $parser_response);
71
72        $Renderer = new Doku_Renderer_xhtml();
73        $url = $Renderer->externalmedia($file, null, null, null, null, 'cache', 'details', true);
74        // work around random token
75        $a_first_part = '<a href="' . \DOKU_BASE . 'lib/exe/fetch.php?tok=';
76        $a_second_part = '&amp;media=http%3A%2F%2Fsome.where.far%2Faway.vid" class="media mediafile mf_vid" title="http://some.where.far/away.vid">';
77
78        $substr_start = 0;
79        $substr_len = strlen($a_first_part);
80        $this->assertEquals($a_first_part, substr($url, $substr_start, $substr_len));
81
82        $substr_start = strpos($url, '&amp;media', $substr_start + $substr_len);
83        $this->assertNotSame(false, $substr_start, 'Substring not found.');
84        $substr_len = strlen($a_second_part);
85        $this->assertEquals($a_second_part, substr($url, $substr_start, $substr_len));
86
87        $rest = 'away.vid</a>';
88        $substr_start = strlen($url) - strlen($rest);
89        $this->assertEquals($rest, substr($url, $substr_start));
90    }
91
92
93    function testVideoOGVInternal() {
94        $file = 'wiki:kind_zu_katze.ogv';
95        $parser_response = p_get_instructions('{{' . $file . '}}');
96
97        $calls = [
98            ['document_start',[]],
99            ['p_open',[]],
100            ['internalmedia',[$file,null,null,null,null,'cache','details']],
101            ['cdata',[null]],
102            ['p_close',[]],
103            ['document_end',[]],
104        ];
105        $this->assertCalls($calls, $parser_response);
106
107        $Renderer = new Doku_Renderer_xhtml();
108        $url = $Renderer->externalmedia($file,null,null,null,null,'cache','details',true);
109
110        $video = '<video class="media" width="320" height="240" controls="controls" poster="' . \DOKU_BASE . 'lib/exe/fetch.php?media=wiki:kind_zu_katze.png">';
111        $substr_start = 0;
112        $substr_len = strlen($video);
113        $this->assertEquals($video, substr($url, $substr_start, $substr_len));
114
115        // find $source_webm in $url
116        $source_webm = '<source src="' . \DOKU_BASE . 'lib/exe/fetch.php?media=wiki:kind_zu_katze.webm" type="video/webm" />';
117        $substr_start = strpos($url, $source_webm, $substr_start + $substr_len);
118        $this->assertNotSame(false, $substr_start, 'Substring not found.');
119
120        // find $source_ogv in $url
121        $source_ogv = '<source src="' . \DOKU_BASE . 'lib/exe/fetch.php?media=wiki:kind_zu_katze.ogv" type="video/ogg" />';
122        $substr_start = strpos($url, $source_ogv, $substr_start + strlen($source_webm));
123        $this->assertNotSame(false, $substr_start, 'Substring not found.');
124
125        // find $a_webm in $url
126        $a_webm = '<a href="' . \DOKU_BASE . 'lib/exe/fetch.php?media=wiki:kind_zu_katze.webm" class="media mediafile mf_webm" title="wiki:kind_zu_katze.webm (99.1'."\xC2\xA0".'KB)">kind_zu_katze.webm</a>';
127        $substr_start = strpos($url, $a_webm, $substr_start + strlen($source_ogv));
128        $this->assertNotSame(false, $substr_start, 'Substring not found.');
129
130        // find $a_webm in $url
131        $a_ogv = '<a href="' . \DOKU_BASE . 'lib/exe/fetch.php?media=wiki:kind_zu_katze.ogv" class="media mediafile mf_ogv" title="wiki:kind_zu_katze.ogv (44.8'."\xC2\xA0".'KB)">kind_zu_katze.ogv</a>';
132        $substr_start = strpos($url, $a_ogv, $substr_start + strlen($a_webm));
133        $this->assertNotSame(false, $substr_start, 'Substring not found.');
134
135        $rest = '</video>'."\n";
136        $substr_start = strlen($url) - strlen($rest);
137        $this->assertEquals($rest, substr($url, $substr_start));
138    }
139
140    function testVideoInternalTitle() {
141        $file = 'wiki:kind_zu_katze.ogv';
142        $title = 'Single quote: \' Ampersand: &';
143
144        $Renderer = new Doku_Renderer_xhtml();
145        $url = $Renderer->externalmedia($file, $title, null, null, null, 'cache', 'details', true);
146
147        // make sure the title is escaped just once
148        $this->assertEquals(hsc($title), substr($url, 28, 37));
149    }
150
151    function testSimpleLinkText() {
152        $file = 'wiki:dokuwiki-128.png';
153        $parser_response = p_get_instructions('{{' . $file . '|This is a simple text.}}');
154
155        $calls = [
156            ['document_start',[]],
157            ['p_open',[]],
158            ['internalmedia',[$file,'This is a simple text.',null,null,null,'cache','details']],
159            ['cdata',[null]],
160            ['p_close',[]],
161            ['document_end',[]],
162        ];
163        $this->assertCalls($calls, $parser_response);
164    }
165
166    function testLinkTextWithWavedBrackets_1() {
167        $file = 'wiki:dokuwiki-128.png';
168        $parser_response = p_get_instructions('{{' . $file . '|We got a { here.}}');
169
170        $calls = [
171            ['document_start',[]],
172            ['p_open',[]],
173            ['internalmedia',[$file,'We got a { here.',null,null,null,'cache','details']],
174            ['cdata',[null]],
175            ['p_close',[]],
176            ['document_end',[]],
177        ];
178        $this->assertCalls($calls, $parser_response);
179    }
180
181    function testLinkTextWithWavedBrackets_2() {
182        $file = 'wiki:dokuwiki-128.png';
183        $parser_response = p_get_instructions('{{' . $file . '|We got a } here.}}');
184
185        $calls = [
186            ['document_start',[]],
187            ['p_open',[]],
188            ['internalmedia',[$file,'We got a } here.',null,null,null,'cache','details']],
189            ['cdata',[null]],
190            ['p_close',[]],
191            ['document_end',[]],
192        ];
193        $this->assertCalls($calls, $parser_response);
194    }
195
196    function testLinkTextWithWavedBrackets_3() {
197        $file = 'wiki:dokuwiki-128.png';
198        $parser_response = p_get_instructions('{{' . $file . '|We got a { and a } here.}}');
199
200        $calls = [
201            ['document_start',[]],
202            ['p_open',[]],
203            ['internalmedia',[$file,'We got a { and a } here.',null,null,null,'cache','details']],
204            ['cdata',[null]],
205            ['p_close',[]],
206            ['document_end',[]],
207        ];
208        $this->assertCalls($calls, $parser_response);
209    }
210}
211