3 use Wikimedia\TestingAccessWrapper
;
8 class SvgHandlerTest
extends MediaWikiMediaTestCase
{
11 * @covers \SvgHandler::getCommonMetaArray()
12 * @dataProvider provideGetIndependentMetaArray
14 * @param string $filename
15 * @param array $expected The expected independent metadata
17 public function testGetIndependentMetaArray( $filename, $expected ) {
18 $this->filePath
= __DIR__
. '/../../data/media/';
19 $this->setMwGlobals( 'wgShowEXIF', true );
21 $file = $this->dataFile( $filename, 'image/svg+xml' );
22 $handler = new SvgHandler();
23 $res = $handler->getCommonMetaArray( $file );
25 self
::assertEquals( $res, $expected );
28 public static function provideGetIndependentMetaArray() {
31 'ObjectName' => 'Tux',
33 'For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg',
35 [ 'Wikimedia-logo.svg', [] ]
40 * @covers SvgHandler::getMatchedLanguage()
41 * @dataProvider provideGetMatchedLanguage
43 * @param string $userPreferredLanguage
44 * @param array $svgLanguages
45 * @param string $expectedMatch
47 public function testGetMatchedLanguage( $userPreferredLanguage, $svgLanguages, $expectedMatch ) {
48 $handler = new SvgHandler();
49 $match = $handler->getMatchedLanguage( $userPreferredLanguage, $svgLanguages );
50 self
::assertEquals( $expectedMatch, $match );
53 public function provideGetMatchedLanguage() {
56 'userPreferredLanguage' => 'en',
57 'svgLanguages' => [ 'de-DE', 'zh', 'ga', 'fr', 'sr-Latn-ME' ],
58 'expectedMatch' => null,
61 'userPreferredLanguage' => 'en',
62 'svgLanguages' => [ 'de', 'zh', 'en', 'fr' ],
63 'expectedMatch' => 'en',
65 'user no subtags, svg 1 subtag' => [
66 'userPreferredLanguage' => 'en',
67 'svgLanguages' => [ 'de-DE', 'en-GB', 'en-US', 'fr' ],
68 'expectedMatch' => 'en-GB',
70 'user no subtags, svg >1 subtag' => [
71 'userPreferredLanguage' => 'sr',
72 'svgLanguages' => [ 'de-DE', 'sr-Cyrl-BA', 'sr-Latn-ME', 'en-US', 'fr' ],
73 'expectedMatch' => 'sr-Cyrl-BA',
75 'user 1 subtag, svg no subtags' => [
76 'userPreferredLanguage' => 'en-US',
77 'svgLanguages' => [ 'de', 'en', 'en', 'fr' ],
78 'expectedMatch' => null,
80 'user 1 subtag, svg 1 subtag' => [
81 'userPreferredLanguage' => 'en-US',
82 'svgLanguages' => [ 'de-DE', 'en-GB', 'en-US', 'fr' ],
83 'expectedMatch' => 'en-US',
85 'user 1 subtag, svg >1 subtag' => [
86 'userPreferredLanguage' => 'sr-Latn',
87 'svgLanguages' => [ 'de-DE', 'sr-Cyrl-BA', 'sr-Latn-ME', 'fr' ],
88 'expectedMatch' => 'sr-Latn-ME',
90 'user >1 subtag, svg >1 subtag' => [
91 'userPreferredLanguage' => 'sr-Latn-ME',
92 'svgLanguages' => [ 'de-DE', 'sr-Cyrl-BA', 'sr-Latn-ME', 'en-US', 'fr' ],
93 'expectedMatch' => 'sr-Latn-ME',
95 'user >1 subtag, svg <=1 subtag' => [
96 'userPreferredLanguage' => 'sr-Latn-ME',
97 'svgLanguages' => [ 'de-DE', 'sr-Cyrl', 'sr-Latn', 'en-US', 'fr' ],
98 'expectedMatch' => null,
100 'ensure case-insensitive' => [
101 'userPreferredLanguage' => 'sr-latn',
102 'svgLanguages' => [ 'de-DE', 'sr-Cyrl', 'sr-Latn-ME', 'en-US', 'fr' ],
103 'expectedMatch' => 'sr-Latn-ME',
109 * @covers \SvgHandler::makeParamString()
110 * @dataProvider provideMakeParamString
112 * @param array $params
113 * @param string $expected
114 * @param string $message
116 public function testMakeParamString( array $params, $expected, $message = '' ) {
117 $handler = new SvgHandler();
118 self
::assertEquals( $expected, $handler->makeParamString( $params ), $message );
121 public function provideMakeParamString() {
126 "Don't thumbnail without knowing width"
131 "Don't thumbnail without knowing width, even with lang"
139 [ 'width' => 123, 'lang' => 'en' ],
144 [ 'width' => 123, 'targetlang' => 'en' ],
146 'Ignore targetlang=en'
149 [ 'width' => 123, 'lang' => 'en', 'targetlang' => 'ru' ],
151 "lang should override targetlang even of it's in English"
154 [ 'width' => 123, 'targetlang' => 'en' ],
156 'Ignore targetlang=en'
159 [ 'width' => 123, 'lang' => 'en', 'targetlang' => 'en' ],
161 'Ignore lang=targetlang=en'
164 [ 'width' => 123, 'lang' => 'ru' ],
166 'Include lang in thumb'
169 [ 'width' => 123, 'targetlang' => 'ru' ],
171 'Include targetlang in thumb'
174 [ 'width' => 123, 'lang' => 'fr', 'targetlang' => 'sq' ],
176 'lang should override targetlang'
182 * @covers SvgHandler::normaliseParamsInternal()
183 * @dataProvider provideNormaliseParamsInternal
188 * @param array $params
189 * @param array $paramsExpected
191 public function testNormaliseParamsInternal( $message,
195 array $paramsExpected = null
197 $this->setMwGlobals( 'wgSVGMaxSize', 1000 );
199 /** @var SvgHandler $handler */
200 $handler = TestingAccessWrapper
::newFromObject( new SvgHandler() );
202 $file = $this->getMockBuilder( File
::class )
203 ->disableOriginalConstructor()
204 ->setMethods( [ 'getWidth', 'getHeight', 'getMetadata', 'getHandler' ] )
207 $file->method( 'getWidth' )
208 ->willReturn( $width );
209 $file->method( 'getHeight' )
210 ->willReturn( $height );
211 $file->method( 'getMetadata' )
212 ->willReturn( serialize( [
213 'version' => SvgHandler
::SVG_METADATA_VERSION
,
215 'en' => SVGReader
::LANG_FULL_MATCH
,
216 'ru' => SVGReader
::LANG_FULL_MATCH
,
219 $file->method( 'getHandler' )
220 ->willReturn( $handler );
222 /** @var File $file */
223 $params = $handler->normaliseParamsInternal( $file, $params );
224 self
::assertEquals( $paramsExpected, $params, $message );
227 public function provideNormaliseParamsInternal() {
230 'No need to change anything',
232 [ 'physicalWidth' => 400, 'physicalHeight' => 500 ],
233 [ 'physicalWidth' => 400, 'physicalHeight' => 500 ],
236 'Resize horizontal image',
238 [ 'physicalWidth' => 2000, 'physicalHeight' => 1600, 'page' => 0 ],
239 [ 'physicalWidth' => 1250, 'physicalHeight' => 1000, 'page' => 0 ],
242 'Resize vertical image',
244 [ 'physicalWidth' => 1600, 'physicalHeight' => 2000, 'page' => 0 ],
245 [ 'physicalWidth' => 1000, 'physicalHeight' => 1250, 'page' => 0 ],
248 'Preserve targetlang present in the image',
250 [ 'physicalWidth' => 400, 'physicalHeight' => 500, 'targetlang' => 'en' ],
251 [ 'physicalWidth' => 400, 'physicalHeight' => 500, 'targetlang' => 'en' ],
254 'Preserve targetlang present in the image 2',
256 [ 'physicalWidth' => 400, 'physicalHeight' => 500, 'targetlang' => 'en' ],
257 [ 'physicalWidth' => 400, 'physicalHeight' => 500, 'targetlang' => 'en' ],
260 'Remove targetlang not present in the image',
262 [ 'physicalWidth' => 400, 'physicalHeight' => 500, 'targetlang' => 'de' ],
263 [ 'physicalWidth' => 400, 'physicalHeight' => 500 ],
266 'Remove targetlang not present in the image 2',
268 [ 'physicalWidth' => 400, 'physicalHeight' => 500, 'targetlang' => 'ru-UA' ],
269 [ 'physicalWidth' => 400, 'physicalHeight' => 500 ],
275 * @covers \SvgHandler::isEnabled()
276 * @dataProvider provideIsEnabled
278 * @param string $converter
279 * @param bool $expected
281 public function testIsEnabled( $converter, $expected ) {
282 $this->setMwGlobals( 'wgSVGConverter', $converter );
284 $handler = new SvgHandler();
285 self
::assertEquals( $handler->isEnabled(), $expected );
288 public function provideIsEnabled() {
290 [ 'ImageMagick', true ],
291 [ 'sodipodi', true ],
292 [ 'invalid', false ],
297 * @covers \SvgHandler::getAvailableLanguages()
298 * @dataProvider provideAvailableLanguages
300 * @param array $metadata
301 * @param array $expected
303 public function testGetAvailableLanguages( array $metadata, array $expected ) {
304 $metadata['version'] = SvgHandler
::SVG_METADATA_VERSION
;
305 $file = $this->getMockBuilder( File
::class )
306 ->disableOriginalConstructor()
307 ->setMethods( [ 'getMetadata' ] )
309 $file->method( 'getMetadata' )
310 ->willReturn( serialize( $metadata ) );
312 $handler = new SvgHandler();
313 /** @var File $file */
314 self
::assertEquals( $expected, $handler->getAvailableLanguages( $file ) );
317 public function provideAvailableLanguages() {
320 [ [ 'translations' => [] ], [] ],
324 'ru-RU' => SVGReader
::LANG_PREFIX_MATCH
332 'en' => SVGReader
::LANG_FULL_MATCH
,
333 'ru-RU' => SVGReader
::LANG_PREFIX_MATCH
,
334 'ru' => SVGReader
::LANG_FULL_MATCH
,
335 'fr-CA' => SVGReader
::LANG_PREFIX_MATCH
,
344 * @covers SvgHandler::getLanguageFromParams()
345 * @dataProvider provideGetLanguageFromParams
347 * @param array $params
348 * @param string $expected
349 * @param string $message
351 public function testGetLanguageFromParams( array $params, $expected, $message ) {
352 /** @var SvgHandler $handler */
353 $handler = TestingAccessWrapper
::newFromObject( new SvgHandler() );
354 self
::assertEquals( $expected, $handler->getLanguageFromParams( $params ), $message );
357 public function provideGetLanguageFromParams() {
359 [ [], 'en', 'Default no language to en' ],
360 [ [ 'preserve' => 'this' ], 'en', 'Default no language to en 2' ],
361 [ [ 'preserve' => 'this', 'lang' => 'ru' ], 'ru', 'Language from lang' ],
362 [ [ 'lang' => 'ru' ], 'ru', 'Language from lang 2' ],
363 [ [ 'targetlang' => 'fr' ], 'fr', 'Language from targetlang' ],
364 [ [ 'lang' => 'fr', 'targetlang' => 'de' ], 'fr', 'lang overrides targetlang' ],