Make WordPress Core

Ticket #26823: 26823.4.diff

File 26823.4.diff, 29.0 KB (added by kirasong, 11 years ago)

Cleaned up tests; moved helper to base; re-applied changes to editors.

  • src/wp-includes/class-wp-image-editor-gd.php

    diff --git src/wp-includes/class-wp-image-editor-gd.php src/wp-includes/class-wp-image-editor-gd.php
    index fdd5586..303f500 100644
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    140140         * Resizes current image.
    141141         * Wraps _resize, since _resize returns a GD Resource.
    142142         *
     143         * At minimum, either a height or width must be provided.
     144         * If one of the two is set to null, the resize will
     145         * maintain aspect ratio according to the provided dimension.
     146         *
    143147         * @since 3.5.0
    144148         * @access public
    145149         *
    146          * @param int $max_w
    147          * @param int $max_h
    148          * @param boolean $crop
     150         * @param  int|null $max_w Image width.
     151         * @param  int|null $max_h Image height.
     152         * @param  boolean $crop
    149153         * @return boolean|WP_Error
    150154         */
    151155        public function resize( $max_w, $max_h, $crop = false ) {
    class WP_Image_Editor_GD extends WP_Image_Editor { 
    192196         * @param array $sizes {
    193197         *     An array of image size arrays. Default sizes are 'small', 'medium', 'large'.
    194198         *
     199         *     Either a height or width must be provided.
     200         *     If one of the two is set to null, the resize will
     201         *     maintain aspect ratio according to the provided dimension.
     202         *
    195203         *     @type array $size {
    196          *         @type int  $width Image width.
    197          *         @type int  $height Image height.
    198          *         @type bool $crop   Optional. Whether to crop the image. Default false.
     204         *         @type int  ['width']  Optional. Image width.
     205         *         @type int  ['height'] Optional. Image height.
     206         *         @type bool ['crop']   Optional. Whether to crop the image. Default false.
    199207         *     }
    200208         * }
    201          * @return array An array of resized images metadata by size.
     209         * @return array An array of resized images' metadata by size.
    202210         */
    203211        public function multi_resize( $sizes ) {
    204212                $metadata = array();
    205213                $orig_size = $this->size;
    206214
    207215                foreach ( $sizes as $size => $size_data ) {
    208                         if ( ! ( isset( $size_data['width'] ) && isset( $size_data['height'] ) ) )
     216                        if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
    209217                                continue;
     218                        }
    210219
    211                         if ( ! isset( $size_data['crop'] ) )
     220                        if ( ! isset( $size_data['width'] ) ) {
     221                                $size_data['width'] = null;
     222                        }
     223                        if ( ! isset( $size_data['height'] ) ) {
     224                                $size_data['height'] = null;
     225                        }
     226
     227                        if ( ! isset( $size_data['crop'] ) ) {
    212228                                $size_data['crop'] = false;
     229                        }
    213230
    214231                        $image = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
    215232
  • src/wp-includes/class-wp-image-editor-imagick.php

    diff --git src/wp-includes/class-wp-image-editor-imagick.php src/wp-includes/class-wp-image-editor-imagick.php
    index f3c9451..4ebed4b 100644
    class WP_Image_Editor_Imagick extends WP_Image_Editor { 
    211211        /**
    212212         * Resizes current image.
    213213         *
     214         * At minimum, either a height or width must be provided.
     215         * If one of the two is set to null, the resize will
     216         * maintain aspect ratio according to the provided dimension.
     217         *
    214218         * @since 3.5.0
    215219         * @access public
    216220         *
    217          * @param int $max_w
    218          * @param int $max_h
    219          * @param boolean $crop
     221         * @param  int|null $max_w Image width.
     222         * @param  int|null $max_h Image height.
     223         * @param  boolean $crop
    220224         * @return boolean|WP_Error
    221225         */
    222226        public function resize( $max_w, $max_h, $crop = false ) {
    class WP_Image_Editor_Imagick extends WP_Image_Editor { 
    255259         * @param array $sizes {
    256260         *     An array of image size arrays. Default sizes are 'small', 'medium', 'large'.
    257261         *
     262         *     Either a height or width must be provided.
     263         *     If one of the two is set to null, the resize will
     264         *     maintain aspect ratio according to the provided dimension.
     265         *
    258266         *     @type array $size {
    259          *         @type int  $width Image width.
    260          *         @type int  $height Image height.
     267         *         @type int  ['width']  Optional. Image width.
     268         *         @type int  ['height'] Optional. Image height.
    261269         *         @type bool $crop   Optional. Whether to crop the image. Default false.
    262270         *     }
    263271         * }
    264          * @return array An array of resized images metadata by size.
     272         * @return array An array of resized images' metadata by size.
    265273         */
    266274        public function multi_resize( $sizes ) {
    267275                $metadata = array();
    class WP_Image_Editor_Imagick extends WP_Image_Editor { 
    272280                        if ( ! $this->image )
    273281                                $this->image = $orig_image->getImage();
    274282
    275                         if ( ! ( isset( $size_data['width'] ) && isset( $size_data['height'] ) ) )
     283                        if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {
    276284                                continue;
     285                        }
    277286
    278                         if ( ! isset( $size_data['crop'] ) )
     287                        if ( ! isset( $size_data['width'] ) ) {
     288                                $size_data['width'] = null;
     289                        }
     290                        if ( ! isset( $size_data['height'] ) ) {
     291                                $size_data['height'] = null;
     292                        }
     293
     294                        if ( ! isset( $size_data['crop'] ) ) {
    279295                                $size_data['crop'] = false;
     296                        }
    280297
    281298                        $resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
    282299
  • src/wp-includes/class-wp-image-editor.php

    diff --git src/wp-includes/class-wp-image-editor.php src/wp-includes/class-wp-image-editor.php
    index 7f6488f..5affba4 100644
    abstract class WP_Image_Editor { 
    8282        /**
    8383         * Resizes current image.
    8484         *
     85         * At minimum, either a height or width must be provided.
     86         * If one of the two is set to null, the resize will
     87         * maintain aspect ratio according to the provided dimension.
     88         *
    8589         * @since 3.5.0
    8690         * @access public
    8791         * @abstract
    8892         *
    89          * @param int $max_w
    90          * @param int $max_h
    91          * @param boolean $crop
     93         * @param  int|null $max_w Image width.
     94         * @param  int|null $max_h Image height.
     95         * @param  boolean $crop
    9296         * @return boolean|WP_Error
    9397         */
    9498        abstract public function resize( $max_w, $max_h, $crop = false );
  • tests/phpunit/tests/image/base.php

    diff --git tests/phpunit/tests/image/base.php tests/phpunit/tests/image/base.php
    index 26f3b59..be9ab67 100644
    abstract class WP_Image_UnitTestCase extends WP_UnitTestCase { 
    3939         * @param  int $alpha
    4040         */
    4141        protected function assertImageAlphaAtPoint( $image_path, $point, $alpha ) {
    42 
    4342                $im = imagecreatefrompng( $image_path );
    44                 $rgb = imagecolorat($im, $point[0], $point[1]);
     43                $rgb = imagecolorat( $im, $point[0], $point[1] );
    4544
    46                 $colors = imagecolorsforindex($im, $rgb);
     45                $colors = imagecolorsforindex( $im, $rgb );
    4746
    4847                $this->assertEquals( $alpha, $colors['alpha'] );
    4948        }
     49
     50        /**
     51         * Helper assertion to check actual image dimensions on disk
     52         *
     53         * @param string $filename Image filename.
     54         * @param int    $width    Width to verify.
     55         * @param int    $height   Height to verify.
     56         */
     57        protected function assertImageDimensions( $filename, $width, $height ) {
     58                $detected_width = 0;
     59                $detected_height = 0;
     60                $image_size = @getimagesize( $filename );
     61
     62                if ( isset( $image_size[0] ) ) {
     63                        $detected_width = $image_size[0];
     64                }
     65
     66                if ( isset( $image_size[1] ) ) {
     67                        $detected_height = $image_size[1];
     68                }
     69
     70                $this->assertEquals( $width, $detected_width );
     71                $this->assertEquals( $height, $detected_height );
     72        }
    5073}
  • tests/phpunit/tests/image/editor_gd.php

    diff --git tests/phpunit/tests/image/editor_gd.php tests/phpunit/tests/image/editor_gd.php
    index f5fdd99..ca134bd 100644
     
    88 */
    99
    1010class Tests_Image_Editor_GD extends WP_Image_UnitTestCase {
     11
    1112        public $editor_engine = 'WP_Image_Editor_GD';
    1213
    13         public function setup() {
     14        public function setUp() {
    1415                require_once( ABSPATH . WPINC . '/class-wp-image-editor.php' );
    1516                require_once( ABSPATH . WPINC . '/class-wp-image-editor-gd.php' );
     17
    1618                parent::setUp();
    1719        }
    1820
     21        public function shutDown() {
     22                $folder = DIR_TESTDATA . '/images/waffles-*.jpg';
     23
     24                foreach ( glob( $folder ) as $file ) {
     25                        unlink( $file );
     26                }
     27
     28                parent::shutDown();
     29        }
     30
    1931        /**
    2032         * Check support for GD compatible mime types.
    21          *
    2233         */
    2334        public function test_supports_mime_type() {
    2435                $gd_image_editor = new WP_Image_Editor_GD( null );
    class Tests_Image_Editor_GD extends WP_Image_UnitTestCase { 
    3041
    3142        /**
    3243         * Test resizing an image, not using crop
    33          *
    3444         */
    3545        public function test_resize() {
    36 
    37                 $file = DIR_TESTDATA . '/images/gradient-square.jpg';
     46                $file = DIR_TESTDATA . '/images/waffles.jpg';
    3847
    3948                $gd_image_editor = new WP_Image_Editor_GD( $file );
    4049                $gd_image_editor->load();
    4150
    4251                $gd_image_editor->resize( 100, 50 );
    4352
    44                 $this->assertEquals( array( 'width' => 50, 'height' => 50 ), $gd_image_editor->get_size() );
     53                $this->assertEquals(
     54                        array(
     55                                'width'  => 75,
     56                                'height' => 50,
     57                        ),
     58                        $gd_image_editor->get_size()
     59                );
    4560        }
    4661
    4762        /**
    48          * Test resizing an image including cropping
    49          *
     63         * Test multi_resize with single image resize and no crop
    5064         */
    51         public function test_resize_and_crop() {
     65        public function test_single_multi_resize() {
     66                $file = DIR_TESTDATA . '/images/waffles.jpg';
    5267
    53                 $file = DIR_TESTDATA . '/images/gradient-square.jpg';
     68                $gd_image_editor = new WP_Image_Editor_GD( $file );
     69                $gd_image_editor->load();
     70
     71                $sizes_array =  array(
     72                        array(
     73                                'width'  => 50,
     74                                'height' => 50,
     75                        ),
     76                );
     77
     78                $resized = $gd_image_editor->multi_resize( $sizes_array );
     79
     80                # First, check to see if returned array is as expected
     81                $expected_array = array(
     82                        array(
     83                                'file'      => 'waffles-50x33.jpg',
     84                                'width'     => 50,
     85                                'height'    => 33,
     86                                'mime-type' => 'image/jpeg',
     87                        ),
     88                );
     89
     90                $this->assertEquals( $expected_array, $resized );
     91
     92                // Now, verify real dimensions are as expected
     93                $image_path = DIR_TESTDATA . '/images/'. $resized[0]['file'];
     94                $this->assertImageDimensions(
     95                        $image_path,
     96                        $expected_array[0]['width'],
     97                        $expected_array[0]['height']
     98                );
     99        }
     100
     101        /**
     102         * Ensure multi_resize doesn't create an image when
     103         * both height and weight are missing, null, or 0.
     104         *
     105         * ticket 26823
     106         */
     107        public function test_multi_resize_does_not_create() {
     108                $file = DIR_TESTDATA . '/images/waffles.jpg';
     109
     110                $gd_image_editor = new WP_Image_Editor_GD( $file );
     111                $gd_image_editor->load();
     112
     113                $sizes_array = array(
     114                        array(
     115                                'width'  => 0,
     116                                'height' => 0,
     117                        ),
     118                        array(
     119                                'width'  => 0,
     120                                'height' => 0,
     121                                'crop'   => true,
     122                        ),
     123                        array(
     124                                'width'  => null,
     125                                'height' => null,
     126                        ),
     127                        array(
     128                                'width'  => null,
     129                                'height' => null,
     130                                'crop'   => true,
     131                        ),
     132                        array(
     133                                'width'  => '',
     134                                'height' => '',
     135                        ),
     136                        array(
     137                                'width'  => '',
     138                                'height' => '',
     139                                'crop'   => true,
     140                        ),
     141                        array(
     142                                'width'  => 0,
     143                        ),
     144                        array(
     145                                'width'  => 0,
     146                                'crop'   => true,
     147                        ),
     148                        array(
     149                                'width'  => null,
     150                        ),
     151                        array(
     152                                'width'  => null,
     153                                'crop'   => true,
     154                        ),
     155                        array(
     156                                'width'  => '',
     157                        ),
     158                        array(
     159                                'width'  => '',
     160                                'crop'   => true,
     161                        ),
     162                );
     163
     164                $resized = $gd_image_editor->multi_resize( $sizes_array );
     165
     166                // If no images are generated, the returned array is empty.
     167                $this->assertEmpty( $resized );
     168        }
     169
     170        /**
     171         * Test multi_resize with multiple sizes
     172         *
     173         * ticket 26823
     174         */
     175        public function test_multi_resize() {
     176                $file = DIR_TESTDATA . '/images/waffles.jpg';
     177
     178                $gd_image_editor = new WP_Image_Editor_GD( $file );
     179                $gd_image_editor->load();
     180
     181                $sizes_array = array(
     182
     183                        /**
     184                         * #0 - 10x10 resize, no cropping.
     185                         * By aspect, should be 10x6 output.
     186                         */
     187                        array(
     188                                'width'  => 10,
     189                                'height' => 10,
     190                                'crop'   => false,
     191                        ),
     192
     193                        /**
     194                         * #1 - 75x50 resize, with cropping.
     195                         * Output dimensions should be 75x50
     196                         */
     197                        array(
     198                                'width'  => 75,
     199                                'height' => 50,
     200                                'crop'   => true,
     201                        ),
     202
     203                        /**
     204                         * #2 - 20 pixel max height, no cropping.
     205                         * By aspect, should be 30x20 output.
     206                         */
     207                        array(
     208                                'width'  => 9999, # Arbitrary High Value
     209                                'height' => 20,
     210                                'crop'   => false,
     211                        ),
     212
     213                        /**
     214                         * #3 - 45 pixel max height, with cropping.
     215                         * By aspect, should be 45x400 output.
     216                         */
     217                        array(
     218                                'width'  => 45,
     219                                'height' => 9999, # Arbitrary High Value
     220                                'crop'   => true,
     221                        ),
     222
     223                        /**
     224                         * #4 - 50 pixel max width, no cropping.
     225                         * By aspect, should be 50x33 output.
     226                         */
     227                        array(
     228                                'width' => 50,
     229                        ),
     230
     231                        /**
     232                         * #5 - 55 pixel max width, no cropping, null height
     233                         * By aspect, should be 55x36 output.
     234                         */
     235                        array(
     236                                'width'  => 55,
     237                                'height' => null,
     238                        ),
     239
     240                        /**
     241                         * #6 - 55 pixel max height, no cropping, no width specified.
     242                         * By aspect, should be 82x55 output.
     243                         */
     244                        array(
     245                                'height' => 55,
     246                        ),
     247
     248                        /**
     249                         * #7 - 60 pixel max height, no cropping, null width.
     250                         * By aspect, should be 90x60 output.
     251                         */
     252                        array(
     253                                'width'  => null,
     254                                'height' => 60,
     255                        ),
     256
     257                        /**
     258                         * #8 - 70 pixel max height, no cropping, negative width.
     259                         * By aspect, should be 105x70 output.
     260                         */
     261                        array(
     262                                'width'  => -9999, # Arbitrary Negative Value
     263                                'height' => 70,
     264                        ),
     265
     266                        /**
     267                         * #9 - 200 pixel max width, no cropping, negative height.
     268                         * By aspect, should be 200x133 output.
     269                         */
     270                        array(
     271                                'width'  => 200,
     272                                'height' => -9999, # Arbitrary Negative Value
     273                        ),
     274                );
     275
     276                $resized = $gd_image_editor->multi_resize( $sizes_array );
     277
     278                $expected_array = array(
     279
     280                        // #0
     281                        array(
     282                                'file'      => 'waffles-10x6.jpg',
     283                                'width'     => 10,
     284                                'height'    => 6,
     285                                'mime-type' => 'image/jpeg',
     286                        ),
     287
     288                        // #1
     289                        array(
     290                                'file'      => 'waffles-75x50.jpg',
     291                                'width'     => 75,
     292                                'height'    => 50,
     293                                'mime-type' => 'image/jpeg',
     294                        ),
     295
     296                        // #2
     297                        array(
     298                                'file'      => 'waffles-30x20.jpg',
     299                                'width'     => 30,
     300                                'height'    => 20,
     301                                'mime-type' => 'image/jpeg',
     302                        ),
     303
     304                        // #3
     305                        array(
     306                                'file'      => 'waffles-45x400.jpg',
     307                                'width'     => 45,
     308                                'height'    => 400,
     309                                'mime-type' => 'image/jpeg',
     310                        ),
     311
     312                        // #4
     313                        array(
     314                                'file'      => 'waffles-50x33.jpg',
     315                                'width'     => 50,
     316                                'height'    => 33,
     317                                'mime-type' => 'image/jpeg',
     318                        ),
     319
     320                        // #5
     321                        array(
     322                                'file'      => 'waffles-55x36.jpg',
     323                                'width'     => 55,
     324                                'height'    => 36,
     325                                'mime-type' => 'image/jpeg',
     326                        ),
     327
     328                        // #6
     329                        array(
     330                                'file'      => 'waffles-82x55.jpg',
     331                                'width'     => 82,
     332                                'height'    => 55,
     333                                'mime-type' => 'image/jpeg',
     334                        ),
     335
     336                        // #7
     337                        array(
     338                                'file'      => 'waffles-90x60.jpg',
     339                                'width'     => 90,
     340                                'height'    => 60,
     341                                'mime-type' => 'image/jpeg',
     342                        ),
     343
     344                        // #8
     345                        array(
     346                                'file'      => 'waffles-105x70.jpg',
     347                                'width'     => 105,
     348                                'height'    => 70,
     349                                'mime-type' => 'image/jpeg',
     350                        ),
     351
     352                        // #9
     353                        array(
     354                                'file'      => 'waffles-200x133.jpg',
     355                                'width'     => 200,
     356                                'height'    => 133,
     357                                'mime-type' => 'image/jpeg',
     358                        ),
     359                );
     360
     361                $this->assertNotNull( $resized );
     362                $this->assertEquals( $expected_array, $resized );
     363
     364                foreach( $resized as $key => $image_data ){
     365                        $image_path = DIR_TESTDATA . '/images/' . $image_data['file'];
     366
     367                        // Now, verify real dimensions are as expected
     368                        $this->assertImageDimensions(
     369                                $image_path,
     370                                $expected_array[$key]['width'],
     371                                $expected_array[$key]['height']
     372                        );
     373                }
     374        }
     375
     376        /**
     377         * Test resizing an image with cropping
     378         */
     379        public function test_resize_and_crop() {
     380                $file = DIR_TESTDATA . '/images/waffles.jpg';
    54381
    55382                $gd_image_editor = new WP_Image_Editor_GD( $file );
    56383                $gd_image_editor->load();
    57384
    58385                $gd_image_editor->resize( 100, 50, true );
    59386
    60                 $this->assertEquals( array( 'width' => 100, 'height' => 50 ), $gd_image_editor->get_size() );
     387                $this->assertEquals(
     388                        array(
     389                                'width'  => 100,
     390                                'height' => 50,
     391                        ),
     392                        $gd_image_editor->get_size()
     393                );
    61394        }
    62395
    63396        /**
    64397         * Test cropping an image
    65398         */
    66399        public function test_crop() {
    67 
    68400                $file = DIR_TESTDATA . '/images/gradient-square.jpg';
    69401
    70402                $gd_image_editor = new WP_Image_Editor_GD( $file );
    class Tests_Image_Editor_GD extends WP_Image_UnitTestCase { 
    72404
    73405                $gd_image_editor->crop( 0, 0, 50, 50 );
    74406
    75                 $this->assertEquals( array( 'width' => 50, 'height' => 50 ), $gd_image_editor->get_size() );
    76 
     407                $this->assertEquals(
     408                        array(
     409                                'width' => 50,
     410                                'height' => 50,
     411                        ),
     412                        $gd_image_editor->get_size()
     413                );
    77414        }
    78415
    79416        /**
    80417         * Test rotating an image 180 deg
    81418         */
    82419        public function test_rotate() {
    83 
    84420                $file = DIR_TESTDATA . '/images/gradient-square.jpg';
    85421
    86422                $gd_image_editor = new WP_Image_Editor_GD( $file );
    class Tests_Image_Editor_GD extends WP_Image_UnitTestCase { 
    100436         * Test flipping an image
    101437         */
    102438        public function test_flip() {
    103 
    104439                $file = DIR_TESTDATA . '/images/gradient-square.jpg';
    105440
    106441                $gd_image_editor = new WP_Image_Editor_GD( $file );
    class Tests_Image_Editor_GD extends WP_Image_UnitTestCase { 
    117452        }
    118453
    119454        /**
    120          * Test the image created with WP_Image_Edior_GD preserves alpha when resizing
    121          * 
     455         * Test the image created with WP_Image_Editor_GD preserves alpha when resizing
     456         *
    122457         * @ticket 23039
    123458         */
    124459        public function test_image_preserves_alpha_on_resize() {
    125 
    126460                $file = DIR_TESTDATA . '/images/transparent.png';
    127461
    128462                $editor = wp_get_image_editor( $file );
    129463                $editor->load();
    130                 $editor->resize(5,5);
     464                $editor->resize( 5, 5 );
    131465                $save_to_file = tempnam( get_temp_dir(), '' ) . '.png';
    132                
     466
    133467                $editor->save( $save_to_file );
    134468
    135469                $this->assertImageAlphaAtPoint( $save_to_file, array( 0,0 ), 127 );
    136 
    137470        }
    138        
     471
    139472        /**
    140          * Test the image created with WP_Image_Edior_GD preserves alpha with no resizing etc
    141          * 
     473         * Test the image created with WP_Image_Editor_GD preserves alpha with no resizing etc
     474         *
    142475         * @ticket 23039
    143476         */
    144477        public function test_image_preserves_alpha() {
    145 
    146478                $file = DIR_TESTDATA . '/images/transparent.png';
    147479
    148480                $editor = wp_get_image_editor( $file );
    149481                $editor->load();
    150482
    151483                $save_to_file = tempnam( get_temp_dir(), '' ) . '.png';
    152                
     484
    153485                $editor->save( $save_to_file );
    154486
    155487                $this->assertImageAlphaAtPoint( $save_to_file, array( 0,0 ), 127 );
    156488        }
    157 
    158489}
  • tests/phpunit/tests/image/editor_imagick.php

    diff --git tests/phpunit/tests/image/editor_imagick.php tests/phpunit/tests/image/editor_imagick.php
    index 1e43298..ec0cd23 100644
    class Tests_Image_Editor_Imagick extends WP_Image_UnitTestCase { 
    1111
    1212        public $editor_engine = 'WP_Image_Editor_Imagick';
    1313
    14         public function setup() {
     14        public function setUp() {
    1515                require_once( ABSPATH . WPINC . '/class-wp-image-editor.php' );
    1616                require_once( ABSPATH . WPINC . '/class-wp-image-editor-imagick.php' );
    1717
    18                 $editor = new WP_Image_Editor_Imagick( null );
     18                parent::setUp();
     19        }
    1920
    20                 if ( ! $editor->test() )
    21                         $this->markTestSkipped( 'Image Magick not available' );
     21        public function shutDown() {
     22                $folder = DIR_TESTDATA . '/images/waffles-*.jpg';
    2223
    23                 parent::setUp();
     24                foreach ( glob( $folder ) as $file ) {
     25                        unlink( $file );
     26                }
     27
     28                parent::shutDown();
    2429        }
    2530
    2631        /**
    27          * Check support for Image Magick compatible mime types.
    28          *
     32         * Check support for ImageMagick compatible mime types.
    2933         */
    3034        public function test_supports_mime_type() {
    31 
    3235                $imagick_image_editor = new WP_Image_Editor_Imagick( null );
    3336
    3437                $this->assertTrue( $imagick_image_editor->supports_mime_type( 'image/jpeg' ), 'Does not support image/jpeg' );
    class Tests_Image_Editor_Imagick extends WP_Image_UnitTestCase { 
    3841
    3942        /**
    4043         * Test resizing an image, not using crop
    41          *
    4244         */
    4345        public function test_resize() {
    44 
    45                 $file = DIR_TESTDATA . '/images/gradient-square.jpg';
     46                $file = DIR_TESTDATA . '/images/waffles.jpg';
    4647
    4748                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
    4849                $imagick_image_editor->load();
    4950
    5051                $imagick_image_editor->resize( 100, 50 );
    5152
    52                 $this->assertEquals( array( 'width' => 50, 'height' => 50 ), $imagick_image_editor->get_size() );
     53                $this->assertEquals(
     54                        array(
     55                                'width'  => 75,
     56                                'height' => 50,
     57                        ),
     58                        $imagick_image_editor->get_size()
     59                );
    5360        }
    5461
    5562        /**
    56          * Test resizing an image including cropping
    57          *
     63         * Test multi_resize with single image resize and no crop
    5864         */
    59         public function test_resize_and_crop() {
     65        public function test_single_multi_resize() {
     66                $file = DIR_TESTDATA . '/images/waffles.jpg';
    6067
    61                 $file = DIR_TESTDATA . '/images/gradient-square.jpg';
     68                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
     69                $imagick_image_editor->load();
     70
     71                $sizes_array =  array(
     72                        array(
     73                                'width'  => 50,
     74                                'height' => 50,
     75                        ),
     76                );
     77
     78                $resized = $imagick_image_editor->multi_resize( $sizes_array );
     79
     80                # First, check to see if returned array is as expected
     81                $expected_array = array(
     82                        array(
     83                                'file'      => 'waffles-50x33.jpg',
     84                                'width'     => 50,
     85                                'height'    => 33,
     86                                'mime-type' => 'image/jpeg',
     87                        ),
     88                );
     89
     90                $this->assertEquals( $expected_array, $resized );
     91
     92                // Now, verify real dimensions are as expected
     93                $image_path = DIR_TESTDATA . '/images/'. $resized[0]['file'];
     94                $this->assertImageDimensions(
     95                        $image_path,
     96                        $expected_array[0]['width'],
     97                        $expected_array[0]['height']
     98                );
     99        }
     100
     101        /**
     102         * Ensure multi_resize doesn't create an image when
     103         * both height and weight are missing, null, or 0.
     104         *
     105         * ticket 26823
     106         */
     107        public function test_multi_resize_does_not_create() {
     108                $file = DIR_TESTDATA . '/images/waffles.jpg';
     109
     110                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
     111                $imagick_image_editor->load();
     112
     113                $sizes_array = array(
     114                        array(
     115                                'width'  => 0,
     116                                'height' => 0,
     117                        ),
     118                        array(
     119                                'width'  => 0,
     120                                'height' => 0,
     121                                'crop'   => true,
     122                        ),
     123                        array(
     124                                'width'  => null,
     125                                'height' => null,
     126                        ),
     127                        array(
     128                                'width'  => null,
     129                                'height' => null,
     130                                'crop'   => true,
     131                        ),
     132                        array(
     133                                'width'  => '',
     134                                'height' => '',
     135                        ),
     136                        array(
     137                                'width'  => '',
     138                                'height' => '',
     139                                'crop'   => true,
     140                        ),
     141                        array(
     142                                'width'  => 0,
     143                        ),
     144                        array(
     145                                'width'  => 0,
     146                                'crop'   => true,
     147                        ),
     148                        array(
     149                                'width'  => null,
     150                        ),
     151                        array(
     152                                'width'  => null,
     153                                'crop'   => true,
     154                        ),
     155                        array(
     156                                'width'  => '',
     157                        ),
     158                        array(
     159                                'width'  => '',
     160                                'crop'   => true,
     161                        ),
     162                );
     163
     164                $resized = $imagick_image_editor->multi_resize( $sizes_array );
     165
     166                // If no images are generated, the returned array is empty.
     167                $this->assertEmpty( $resized );
     168        }
     169
     170        /**
     171         * Test multi_resize with multiple sizes
     172         *
     173         * ticket 26823
     174         */
     175        public function test_multi_resize() {
     176                $file = DIR_TESTDATA . '/images/waffles.jpg';
     177
     178                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
     179                $imagick_image_editor->load();
     180
     181                $sizes_array = array(
     182
     183                        /**
     184                         * #0 - 10x10 resize, no cropping.
     185                         * By aspect, should be 10x6 output.
     186                         */
     187                        array(
     188                                'width'  => 10,
     189                                'height' => 10,
     190                                'crop'   => false,
     191                        ),
     192
     193                        /**
     194                         * #1 - 75x50 resize, with cropping.
     195                         * Output dimensions should be 75x50
     196                         */
     197                        array(
     198                                'width'  => 75,
     199                                'height' => 50,
     200                                'crop'   => true,
     201                        ),
     202
     203                        /**
     204                         * #2 - 20 pixel max height, no cropping.
     205                         * By aspect, should be 30x20 output.
     206                         */
     207                        array(
     208                                'width'  => 9999, # Arbitrary High Value
     209                                'height' => 20,
     210                                'crop'   => false,
     211                        ),
     212
     213                        /**
     214                         * #3 - 45 pixel max height, with cropping.
     215                         * By aspect, should be 45x400 output.
     216                         */
     217                        array(
     218                                'width'  => 45,
     219                                'height' => 9999, # Arbitrary High Value
     220                                'crop'   => true,
     221                        ),
     222
     223                        /**
     224                         * #4 - 50 pixel max width, no cropping.
     225                         * By aspect, should be 50x33 output.
     226                         */
     227                        array(
     228                                'width' => 50,
     229                        ),
     230
     231                        /**
     232                         * #5 - 55 pixel max width, no cropping, null height
     233                         * By aspect, should be 55x36 output.
     234                         */
     235                        array(
     236                                'width'  => 55,
     237                                'height' => null,
     238                        ),
     239
     240                        /**
     241                         * #6 - 55 pixel max height, no cropping, no width specified.
     242                         * By aspect, should be 82x55 output.
     243                         */
     244                        array(
     245                                'height' => 55,
     246                        ),
     247
     248                        /**
     249                         * #7 - 60 pixel max height, no cropping, null width.
     250                         * By aspect, should be 90x60 output.
     251                         */
     252                        array(
     253                                'width'  => null,
     254                                'height' => 60,
     255                        ),
     256
     257                        /**
     258                         * #8 - 70 pixel max height, no cropping, negative width.
     259                         * By aspect, should be 105x70 output.
     260                         */
     261                        array(
     262                                'width'  => -9999, # Arbitrary Negative Value
     263                                'height' => 70,
     264                        ),
     265
     266                        /**
     267                         * #9 - 200 pixel max width, no cropping, negative height.
     268                         * By aspect, should be 200x133 output.
     269                         */
     270                        array(
     271                                'width'  => 200,
     272                                'height' => -9999, # Arbitrary Negative Value
     273                        ),
     274                );
     275
     276                $resized = $imagick_image_editor->multi_resize( $sizes_array );
     277
     278                $expected_array = array(
     279
     280                        // #0
     281                        array(
     282                                'file'      => 'waffles-10x6.jpg',
     283                                'width'     => 10,
     284                                'height'    => 6,
     285                                'mime-type' => 'image/jpeg',
     286                        ),
     287
     288                        // #1
     289                        array(
     290                                'file'      => 'waffles-75x50.jpg',
     291                                'width'     => 75,
     292                                'height'    => 50,
     293                                'mime-type' => 'image/jpeg',
     294                        ),
     295
     296                        // #2
     297                        array(
     298                                'file'      => 'waffles-30x20.jpg',
     299                                'width'     => 30,
     300                                'height'    => 20,
     301                                'mime-type' => 'image/jpeg',
     302                        ),
     303
     304                        // #3
     305                        array(
     306                                'file'      => 'waffles-45x400.jpg',
     307                                'width'     => 45,
     308                                'height'    => 400,
     309                                'mime-type' => 'image/jpeg',
     310                        ),
     311
     312                        // #4
     313                        array(
     314                                'file'      => 'waffles-50x33.jpg',
     315                                'width'     => 50,
     316                                'height'    => 33,
     317                                'mime-type' => 'image/jpeg',
     318                        ),
     319
     320                        // #5
     321                        array(
     322                                'file'      => 'waffles-55x36.jpg',
     323                                'width'     => 55,
     324                                'height'    => 36,
     325                                'mime-type' => 'image/jpeg',
     326                        ),
     327
     328                        // #6
     329                        array(
     330                                'file'      => 'waffles-82x55.jpg',
     331                                'width'     => 82,
     332                                'height'    => 55,
     333                                'mime-type' => 'image/jpeg',
     334                        ),
     335
     336                        // #7
     337                        array(
     338                                'file'      => 'waffles-90x60.jpg',
     339                                'width'     => 90,
     340                                'height'    => 60,
     341                                'mime-type' => 'image/jpeg',
     342                        ),
     343
     344                        // #8
     345                        array(
     346                                'file'      => 'waffles-105x70.jpg',
     347                                'width'     => 105,
     348                                'height'    => 70,
     349                                'mime-type' => 'image/jpeg',
     350                        ),
     351
     352                        // #9
     353                        array(
     354                                'file'      => 'waffles-200x133.jpg',
     355                                'width'     => 200,
     356                                'height'    => 133,
     357                                'mime-type' => 'image/jpeg',
     358                        ),
     359                );
     360
     361                $this->assertNotNull( $resized );
     362                $this->assertEquals( $expected_array, $resized );
     363
     364                foreach( $resized as $key => $image_data ){
     365                        $image_path = DIR_TESTDATA . '/images/' . $image_data['file'];
     366
     367                        // Now, verify real dimensions are as expected
     368                        $this->assertImageDimensions(
     369                                $image_path,
     370                                $expected_array[$key]['width'],
     371                                $expected_array[$key]['height']
     372                        );
     373                }
     374        }
     375
     376        /**
     377         * Test resizing an image with cropping
     378         */
     379        public function test_resize_and_crop() {
     380                $file = DIR_TESTDATA . '/images/waffles.jpg';
    62381
    63382                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
    64383                $imagick_image_editor->load();
    65384
    66385                $imagick_image_editor->resize( 100, 50, true );
    67386
    68                 $this->assertEquals( array( 'width' => 100, 'height' => 50 ), $imagick_image_editor->get_size() );
     387                $this->assertEquals(
     388                        array(
     389                                'width'  => 100,
     390                                'height' => 50,
     391                        ),
     392                        $imagick_image_editor->get_size()
     393                );
    69394        }
    70395
    71396        /**
    72397         * Test cropping an image
    73398         */
    74399        public function test_crop() {
    75 
    76400                $file = DIR_TESTDATA . '/images/gradient-square.jpg';
    77401
    78402                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
    class Tests_Image_Editor_Imagick extends WP_Image_UnitTestCase { 
    80404
    81405                $imagick_image_editor->crop( 0, 0, 50, 50 );
    82406
    83                 $this->assertEquals( array( 'width' => 50, 'height' => 50 ), $imagick_image_editor->get_size() );
    84 
     407                $this->assertEquals(
     408                        array(
     409                                'width' => 50,
     410                                'height' => 50,
     411                        ),
     412                        $imagick_image_editor->get_size()
     413                );
    85414        }
    86415
    87416        /**
    88417         * Test rotating an image 180 deg
    89418         */
    90419        public function test_rotate() {
    91 
    92420                $file = DIR_TESTDATA . '/images/gradient-square.jpg';
    93421
    94422                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
    class Tests_Image_Editor_Imagick extends WP_Image_UnitTestCase { 
    108436         * Test flipping an image
    109437         */
    110438        public function test_flip() {
    111 
    112439                $file = DIR_TESTDATA . '/images/gradient-square.jpg';
    113440
    114441                $imagick_image_editor = new WP_Image_Editor_Imagick( $file );
    class Tests_Image_Editor_Imagick extends WP_Image_UnitTestCase { 
    125452        }
    126453
    127454        /**
    128          * Test the image created with WP_Image_Edior_Imagick preserves alpha when resizing
     455         * Test the image created with WP_Image_Editor_Imagick preserves alpha when resizing
    129456         *
    130457         * @ticket 24871
    131458         */
    132459        public function test_image_preserves_alpha_on_resize() {
    133 
    134460                $file = DIR_TESTDATA . '/images/transparent.png';
    135461
    136462                $editor = wp_get_image_editor( $file );
    137463                $editor->load();
    138                 $editor->resize(5,5);
     464                $editor->resize( 5, 5 );
    139465                $save_to_file = tempnam( get_temp_dir(), '' ) . '.png';
    140466               
    141467                $editor->save( $save_to_file );
    142468
    143469                $this->assertImageAlphaAtPoint( $save_to_file, array( 0,0 ), 127 );
    144 
    145470        }
    146        
     471
    147472        /**
    148          * Test the image created with WP_Image_Edior_Imagick preserves alpha with no resizing etc
     473         * Test the image created with WP_Image_Editor_Imagick preserves alpha with no resizing etc
    149474         *
    150475         * @ticket 24871
    151476         */
    152477        public function test_image_preserves_alpha() {
    153 
    154478                $file = DIR_TESTDATA . '/images/transparent.png';
    155479
    156480                $editor = wp_get_image_editor( $file );
    157481                $editor->load();
    158482
    159483                $save_to_file = tempnam( get_temp_dir(), '' ) . '.png';
    160                
     484
    161485                $editor->save( $save_to_file );
    162486
    163487                $this->assertImageAlphaAtPoint( $save_to_file, array( 0,0 ), 127 );