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