You are here

public function AnnotatedClassDiscoveryTest::testAutoloadBadAnnotations in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php \Drupal\Tests\Component\Plugin\Discovery\AnnotatedClassDiscoveryTest::testAutoloadBadAnnotations()

Make sure AnnotatedClassDiscovery never tries to autoload bad annotations.

@dataProvider provideBadAnnotations

@coversNothing

File

core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php, line 59

Class

AnnotatedClassDiscoveryTest
@coversDefaultClass \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery

Namespace

Drupal\Tests\Component\Plugin\Discovery

Code

public function testAutoloadBadAnnotations($annotation) {

  // Set up a class file in vfsStream.
  vfsStreamWrapper::register();
  $root = new vfsStreamDirectory('root');
  vfsStreamWrapper::setRoot($root);
  FileCacheFactory::setPrefix(__CLASS__);

  // Make a directory for discovery.
  $url = vfsStream::url('root');
  mkdir($url . '/DrupalTest');

  // Create a class docblock with our annotation.
  $php_file = "<?php\nnamespace DrupalTest;\n/**\n";
  $php_file .= " * @{$annotation}\n";
  $php_file .= " */\nclass TestClass {}";
  file_put_contents($url . '/DrupalTest/TestClass.php', $php_file);

  // Create an AnnotatedClassDiscovery object referencing the virtual file.
  $discovery = new AnnotatedClassDiscovery([
    '\\DrupalTest\\TestClass' => [
      vfsStream::url('root/DrupalTest'),
    ],
  ], '\\DrupalTest\\Component\\Annotation\\');

  // Register our class loader which will fail if the annotation reader tries
  // to autoload disallowed annotations.
  $class_loader = function ($class_name) use ($annotation) {
    $name_array = explode('\\', $class_name);
    $name = array_pop($name_array);
    if ($name == $annotation) {
      $this
        ->fail('Attempted to autoload a non-plugin annotation: ' . $name);
    }
  };
  spl_autoload_register($class_loader, TRUE, TRUE);

  // Now try to get plugin definitions.
  $definitions = $discovery
    ->getDefinitions();

  // Unregister to clean up.
  spl_autoload_unregister($class_loader);

  // Assert that no annotations were loaded.
  $this
    ->assertEmpty($definitions);
}