Chris@0: container->get('image.factory'); Chris@0: // Create a working copy of the file. Chris@0: $files = $this->drupalGetTestFiles('image'); Chris@0: $file = reset($files); Chris@0: $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); Chris@0: Chris@0: // Create a style. Chris@0: /** @var $style \Drupal\image\ImageStyleInterface */ Chris@0: $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']); Chris@0: $style->save(); Chris@0: $generated_uri = 'public://styles/test/public/' . \Drupal::service('file_system')->basename($original_uri); Chris@0: $url = file_url_transform_relative($style->buildUrl($original_uri)); Chris@0: Chris@0: $variables = [ Chris@0: '#theme' => 'image_style', Chris@0: '#style_name' => 'test', Chris@0: '#uri' => $original_uri, Chris@0: '#width' => 40, Chris@0: '#height' => 20, Chris@0: ]; Chris@0: // Verify that the original image matches the hard-coded values. Chris@0: $image_file = $image_factory->get($original_uri); Chris@0: $this->assertEqual($image_file->getWidth(), $variables['#width']); Chris@0: $this->assertEqual($image_file->getHeight(), $variables['#height']); Chris@0: Chris@0: // Scale an image that is wider than it is high. Chris@0: $effect = [ Chris@0: 'id' => 'image_scale', Chris@0: 'data' => [ Chris@0: 'width' => 120, Chris@0: 'height' => 90, Chris@0: 'upscale' => TRUE, Chris@0: ], Chris@0: 'weight' => 0, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 120); Chris@0: $this->assertEqual($image_file->getHeight(), 60); Chris@0: Chris@0: // Rotate 90 degrees anticlockwise. Chris@0: $effect = [ Chris@0: 'id' => 'image_rotate', Chris@0: 'data' => [ Chris@0: 'degrees' => -90, Chris@0: 'random' => FALSE, Chris@0: ], Chris@0: 'weight' => 1, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 60); Chris@0: $this->assertEqual($image_file->getHeight(), 120); Chris@0: Chris@0: // Scale an image that is higher than it is wide (rotated by previous effect). Chris@0: $effect = [ Chris@0: 'id' => 'image_scale', Chris@0: 'data' => [ Chris@0: 'width' => 120, Chris@0: 'height' => 90, Chris@0: 'upscale' => TRUE, Chris@0: ], Chris@0: 'weight' => 2, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 45); Chris@0: $this->assertEqual($image_file->getHeight(), 90); Chris@0: Chris@0: // Test upscale disabled. Chris@0: $effect = [ Chris@0: 'id' => 'image_scale', Chris@0: 'data' => [ Chris@0: 'width' => 400, Chris@0: 'height' => 200, Chris@0: 'upscale' => FALSE, Chris@0: ], Chris@0: 'weight' => 3, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 45); Chris@0: $this->assertEqual($image_file->getHeight(), 90); Chris@0: Chris@0: // Add a desaturate effect. Chris@0: $effect = [ Chris@0: 'id' => 'image_desaturate', Chris@0: 'data' => [], Chris@0: 'weight' => 4, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 45); Chris@0: $this->assertEqual($image_file->getHeight(), 90); Chris@0: Chris@0: // Add a random rotate effect. Chris@0: $effect = [ Chris@0: 'id' => 'image_rotate', Chris@0: 'data' => [ Chris@0: 'degrees' => 180, Chris@0: 'random' => TRUE, Chris@0: ], Chris@0: 'weight' => 5, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: Chris@0: // Add a crop effect. Chris@0: $effect = [ Chris@0: 'id' => 'image_crop', Chris@0: 'data' => [ Chris@0: 'width' => 30, Chris@0: 'height' => 30, Chris@0: 'anchor' => 'center-center', Chris@0: ], Chris@0: 'weight' => 6, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 30); Chris@0: $this->assertEqual($image_file->getHeight(), 30); Chris@0: Chris@0: // Rotate to a non-multiple of 90 degrees. Chris@0: $effect = [ Chris@0: 'id' => 'image_rotate', Chris@0: 'data' => [ Chris@0: 'degrees' => 57, Chris@0: 'random' => FALSE, Chris@0: ], Chris@0: 'weight' => 7, Chris@0: ]; Chris@0: Chris@0: $effect_id = $style->addImageEffect($effect); Chris@0: $style->save(); Chris@12: // @todo Uncomment this once Chris@12: // https://www.drupal.org/project/drupal/issues/2670966 is resolved. Chris@12: // $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@12: // @todo Uncomment this once Chris@12: // https://www.drupal.org/project/drupal/issues/2670966 is resolved. Chris@12: // $this->assertEqual($image_file->getWidth(), 41); Chris@12: // $this->assertEqual($image_file->getHeight(), 41); Chris@0: Chris@0: $effect_plugin = $style->getEffect($effect_id); Chris@0: $style->deleteImageEffect($effect_plugin); Chris@0: Chris@0: // Ensure that an effect can unset dimensions. Chris@0: $effect = [ Chris@0: 'id' => 'image_module_test_null', Chris@0: 'data' => [], Chris@0: 'weight' => 8, Chris@0: ]; Chris@0: Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: Chris@0: // Test URI dependent image effect. Chris@0: $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']); Chris@0: $effect = [ Chris@0: 'id' => 'image_module_test_uri_dependent', Chris@0: 'data' => [], Chris@0: 'weight' => 0, Chris@0: ]; Chris@0: $style->addImageEffect($effect); Chris@0: $style->save(); Chris@0: $variables = [ Chris@0: '#theme' => 'image_style', Chris@0: '#style_name' => 'test_uri', Chris@0: '#uri' => $original_uri, Chris@0: '#width' => 40, Chris@0: '#height' => 20, Chris@0: ]; Chris@0: // PNG original image. Should be resized to 100x100. Chris@0: $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri); Chris@0: $url = file_url_transform_relative($style->buildUrl($original_uri)); Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 100); Chris@0: $this->assertEqual($image_file->getHeight(), 100); Chris@0: // GIF original image. Should be resized to 50x50. Chris@0: $file = $files[1]; Chris@0: $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME); Chris@0: $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri); Chris@0: $url = file_url_transform_relative($style->buildUrl($original_uri)); Chris@0: $variables['#uri'] = $original_uri; Chris@0: $this->assertEqual($this->getImageTag($variables), ''); Chris@0: $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.'); Chris@0: $this->drupalGet($this->getAbsoluteUrl($url)); Chris@0: $this->assertResponse(200, 'Image was generated at the URL.'); Chris@0: $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.'); Chris@0: $image_file = $image_factory->get($generated_uri); Chris@0: $this->assertEqual($image_file->getWidth(), 50); Chris@0: $this->assertEqual($image_file->getHeight(), 50); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Render an image style element. Chris@0: * Chris@0: * drupal_render() alters the passed $variables array by adding a new key Chris@0: * '#printed' => TRUE. This prevents next call to re-render the element. We Chris@0: * wrap drupal_render() in a helper protected method and pass each time a Chris@0: * fresh array so that $variables won't get altered and the element is Chris@0: * re-rendered each time. Chris@0: */ Chris@0: protected function getImageTag($variables) { Chris@0: return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables)); Chris@0: } Chris@0: Chris@0: }