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 = '&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, '&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 = '&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, '&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