function AnnotatedClassDiscoveryTest::testAutoloadBadAnnotations

Same name in other branches
  1. 9 core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php \Drupal\Tests\Component\Plugin\Discovery\AnnotatedClassDiscoveryTest::testAutoloadBadAnnotations()
  2. 8.9.x core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php \Drupal\Tests\Component\Plugin\Discovery\AnnotatedClassDiscoveryTest::testAutoloadBadAnnotations()
  3. 11.x 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 61

Class

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

Namespace

Drupal\Tests\Component\Plugin\Discovery

Code

public function testAutoloadBadAnnotations($annotation) : void {
    // 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);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.