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