1<?php
2
3/**
4 * @group Media
5 */
6class BitmapScalingTest extends MediaWikiIntegrationTestCase {
7
8	protected function setUp() : void {
9		parent::setUp();
10
11		$this->setMwGlobals( [
12			'wgMaxImageArea' => 1.25e7, // 3500x3500
13			'wgCustomConvertCommand' => 'dummy', // Set so that we don't get client side rendering
14		] );
15	}
16
17	/**
18	 * @dataProvider provideNormaliseParams
19	 * @covers BitmapHandler::normaliseParams
20	 */
21	public function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
22		$file = new FakeDimensionFile( $fileDimensions );
23		$handler = new BitmapHandler;
24		$valid = $handler->normaliseParams( $file, $params );
25		$this->assertTrue( $valid );
26		$this->assertEquals( $expectedParams, $params, $msg );
27	}
28
29	public static function provideNormaliseParams() {
30		return [
31			/* Regular resize operations */
32			[
33				[ 1024, 768 ],
34				[
35					'width' => 512, 'height' => 384,
36					'physicalWidth' => 512, 'physicalHeight' => 384,
37					'page' => 1, 'interlace' => false,
38				],
39				[ 'width' => 512 ],
40				'Resizing with width set',
41			],
42			[
43				[ 1024, 768 ],
44				[
45					'width' => 512, 'height' => 384,
46					'physicalWidth' => 512, 'physicalHeight' => 384,
47					'page' => 1, 'interlace' => false,
48				],
49				[ 'width' => 512, 'height' => 768 ],
50				'Resizing with height set too high',
51			],
52			[
53				[ 1024, 768 ],
54				[
55					'width' => 512, 'height' => 384,
56					'physicalWidth' => 512, 'physicalHeight' => 384,
57					'page' => 1, 'interlace' => false,
58				],
59				[ 'width' => 1024, 'height' => 384 ],
60				'Resizing with height set',
61			],
62
63			/* Very tall images */
64			[
65				[ 1000, 100 ],
66				[
67					'width' => 5, 'height' => 1,
68					'physicalWidth' => 5, 'physicalHeight' => 1,
69					'page' => 1, 'interlace' => false,
70				],
71				[ 'width' => 5 ],
72				'Very wide image',
73			],
74
75			[
76				[ 100, 1000 ],
77				[
78					'width' => 1, 'height' => 10,
79					'physicalWidth' => 1, 'physicalHeight' => 10,
80					'page' => 1, 'interlace' => false,
81				],
82				[ 'width' => 1 ],
83				'Very high image',
84			],
85			[
86				[ 100, 1000 ],
87				[
88					'width' => 1, 'height' => 5,
89					'physicalWidth' => 1, 'physicalHeight' => 10,
90					'page' => 1, 'interlace' => false,
91				],
92				[ 'width' => 10, 'height' => 5 ],
93				'Very high image with height set',
94			],
95			/* Max image area */
96			[
97				[ 4000, 4000 ],
98				[
99					'width' => 5000, 'height' => 5000,
100					'physicalWidth' => 4000, 'physicalHeight' => 4000,
101					'page' => 1, 'interlace' => false,
102				],
103				[ 'width' => 5000 ],
104				'Bigger than max image size but doesn\'t need scaling',
105			],
106			/* Max interlace image area */
107			[
108				[ 4000, 4000 ],
109				[
110					'width' => 5000, 'height' => 5000,
111					'physicalWidth' => 4000, 'physicalHeight' => 4000,
112					'page' => 1, 'interlace' => false,
113				],
114				[ 'width' => 5000, 'interlace' => true ],
115				'Interlace bigger than max interlace area',
116			],
117		];
118	}
119
120	/**
121	 * @covers BitmapHandler::doTransform
122	 */
123	public function testTooBigImage() {
124		$file = new FakeDimensionFile( [ 4000, 4000 ] );
125		$handler = new BitmapHandler;
126		$params = [ 'width' => '3700' ]; // Still bigger than max size.
127		$this->assertEquals( TransformTooBigImageAreaError::class,
128			get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
129	}
130
131	/**
132	 * @covers BitmapHandler::doTransform
133	 */
134	public function testTooBigMustRenderImage() {
135		$file = new FakeDimensionFile( [ 4000, 4000 ] );
136		$file->mustRender = true;
137		$handler = new BitmapHandler;
138		$params = [ 'width' => '5000' ]; // Still bigger than max size.
139		$this->assertEquals( TransformTooBigImageAreaError::class,
140			get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
141	}
142
143	/**
144	 * @covers BitmapHandler::getImageArea
145	 */
146	public function testImageArea() {
147		$file = new FakeDimensionFile( [ 7, 9 ] );
148		$handler = new BitmapHandler;
149		$this->assertEquals( 63, $handler->getImageArea( $file ) );
150	}
151}
152