Mercurial > hg > isophonics-drupal-site
diff core/modules/image/src/Tests/ImageDimensionsTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 7a779792577d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/image/src/Tests/ImageDimensionsTest.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,290 @@ +<?php + +namespace Drupal\image\Tests; + +use Drupal\image\Entity\ImageStyle; +use Drupal\simpletest\WebTestBase; + +/** + * Tests that images have correct dimensions when styled. + * + * @group image + */ +class ImageDimensionsTest extends WebTestBase { + + /** + * Modules to enable. + * + * @var array + */ + public static $modules = ['image', 'image_module_test']; + + protected $profile = 'testing'; + + /** + * Test styled image dimensions cumulatively. + */ + public function testImageDimensions() { + $image_factory = $this->container->get('image.factory'); + // Create a working copy of the file. + $files = $this->drupalGetTestFiles('image'); + $file = reset($files); + $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); + + // Create a style. + /** @var $style \Drupal\image\ImageStyleInterface */ + $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']); + $style->save(); + $generated_uri = 'public://styles/test/public/' . \Drupal::service('file_system')->basename($original_uri); + $url = file_url_transform_relative($style->buildUrl($original_uri)); + + $variables = [ + '#theme' => 'image_style', + '#style_name' => 'test', + '#uri' => $original_uri, + '#width' => 40, + '#height' => 20, + ]; + // Verify that the original image matches the hard-coded values. + $image_file = $image_factory->get($original_uri); + $this->assertEqual($image_file->getWidth(), $variables['#width']); + $this->assertEqual($image_file->getHeight(), $variables['#height']); + + // Scale an image that is wider than it is high. + $effect = [ + 'id' => 'image_scale', + 'data' => [ + 'width' => 120, + 'height' => 90, + 'upscale' => TRUE, + ], + 'weight' => 0, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="120" height="60" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 120); + $this->assertEqual($image_file->getHeight(), 60); + + // Rotate 90 degrees anticlockwise. + $effect = [ + 'id' => 'image_rotate', + 'data' => [ + 'degrees' => -90, + 'random' => FALSE, + ], + 'weight' => 1, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="60" height="120" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 60); + $this->assertEqual($image_file->getHeight(), 120); + + // Scale an image that is higher than it is wide (rotated by previous effect). + $effect = [ + 'id' => 'image_scale', + 'data' => [ + 'width' => 120, + 'height' => 90, + 'upscale' => TRUE, + ], + 'weight' => 2, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 45); + $this->assertEqual($image_file->getHeight(), 90); + + // Test upscale disabled. + $effect = [ + 'id' => 'image_scale', + 'data' => [ + 'width' => 400, + 'height' => 200, + 'upscale' => FALSE, + ], + 'weight' => 3, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 45); + $this->assertEqual($image_file->getHeight(), 90); + + // Add a desaturate effect. + $effect = [ + 'id' => 'image_desaturate', + 'data' => [], + 'weight' => 4, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 45); + $this->assertEqual($image_file->getHeight(), 90); + + // Add a random rotate effect. + $effect = [ + 'id' => 'image_rotate', + 'data' => [ + 'degrees' => 180, + 'random' => TRUE, + ], + 'weight' => 5, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + + + // Add a crop effect. + $effect = [ + 'id' => 'image_crop', + 'data' => [ + 'width' => 30, + 'height' => 30, + 'anchor' => 'center-center', + ], + 'weight' => 6, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="30" height="30" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 30); + $this->assertEqual($image_file->getHeight(), 30); + + // Rotate to a non-multiple of 90 degrees. + $effect = [ + 'id' => 'image_rotate', + 'data' => [ + 'degrees' => 57, + 'random' => FALSE, + ], + 'weight' => 7, + ]; + + $effect_id = $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="41" height="41" alt="" class="image-style-test" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 41); + $this->assertEqual($image_file->getHeight(), 41); + + $effect_plugin = $style->getEffect($effect_id); + $style->deleteImageEffect($effect_plugin); + + // Ensure that an effect can unset dimensions. + $effect = [ + 'id' => 'image_module_test_null', + 'data' => [], + 'weight' => 8, + ]; + + $style->addImageEffect($effect); + $style->save(); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />'); + + // Test URI dependent image effect. + $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']); + $effect = [ + 'id' => 'image_module_test_uri_dependent', + 'data' => [], + 'weight' => 0, + ]; + $style->addImageEffect($effect); + $style->save(); + $variables = [ + '#theme' => 'image_style', + '#style_name' => 'test_uri', + '#uri' => $original_uri, + '#width' => 40, + '#height' => 20, + ]; + // PNG original image. Should be resized to 100x100. + $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri); + $url = file_url_transform_relative($style->buildUrl($original_uri)); + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="100" height="100" alt="" class="image-style-test-uri" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 100); + $this->assertEqual($image_file->getHeight(), 100); + // GIF original image. Should be resized to 50x50. + $file = $files[1]; + $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); + $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri); + $url = file_url_transform_relative($style->buildUrl($original_uri)); + $variables['#uri'] = $original_uri; + $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="50" height="50" alt="" class="image-style-test-uri" />'); + $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); + $this->drupalGet($this->getAbsoluteUrl($url)); + $this->assertResponse(200, 'Image was generated at the URL.'); + $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); + $image_file = $image_factory->get($generated_uri); + $this->assertEqual($image_file->getWidth(), 50); + $this->assertEqual($image_file->getHeight(), 50); + } + + /** + * Render an image style element. + * + * drupal_render() alters the passed $variables array by adding a new key + * '#printed' => TRUE. This prevents next call to re-render the element. We + * wrap drupal_render() in a helper protected method and pass each time a + * fresh array so that $variables won't get altered and the element is + * re-rendered each time. + */ + protected function getImageTag($variables) { + return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables)); + } + +}