AnnotatedClassDiscoveryTest.php

Same filename in this branch
  1. 11.x core/tests/Drupal/KernelTests/Core/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
  2. 11.x core/tests/Drupal/Tests/Component/Annotation/AnnotatedClassDiscoveryTest.php
Same filename in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
  2. 9 core/tests/Drupal/Tests/Component/Annotation/AnnotatedClassDiscoveryTest.php
  3. 9 core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
  4. 8.9.x core/tests/Drupal/KernelTests/Core/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
  5. 8.9.x core/tests/Drupal/Tests/Component/Annotation/AnnotatedClassDiscoveryTest.php
  6. 8.9.x core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
  7. 10 core/tests/Drupal/KernelTests/Core/Plugin/Discovery/AnnotatedClassDiscoveryTest.php
  8. 10 core/tests/Drupal/Tests/Component/Annotation/AnnotatedClassDiscoveryTest.php
  9. 10 core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php

Namespace

Drupal\Tests\Component\Plugin\Discovery

File

core/tests/Drupal/Tests/Component/Plugin/Discovery/AnnotatedClassDiscoveryTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\Component\Plugin\Discovery;

use Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery;
use Drupal\Component\FileCache\FileCacheFactory;
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamDirectory;
use org\bovigo\vfs\vfsStreamWrapper;
use PHPUnit\Framework\TestCase;

/**
 * @coversDefaultClass \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery
 *
 * @group Annotation
 * @group Plugin
 */
class AnnotatedClassDiscoveryTest extends TestCase {
    
    /**
     * All the Drupal documentation standards tags.
     *
     * @var string[]
     */
    public static function provideBadAnnotations() {
        return [
            [
                'addtogroup',
            ],
            [
                'code',
            ],
            [
                'defgroup',
            ],
            [
                'deprecated',
            ],
            [
                'endcode',
            ],
            [
                'endlink',
            ],
            [
                'file',
            ],
            [
                'ingroup',
            ],
            [
                'group',
            ],
            [
                'link',
            ],
            [
                'mainpage',
            ],
            [
                'param',
            ],
            [
                'ref',
            ],
            [
                'return',
            ],
            [
                'section',
            ],
            [
                'see',
            ],
            [
                'subsection',
            ],
            [
                'throws',
            ],
            [
                'todo',
            ],
            [
                'var',
            ],
            [
                '{',
            ],
            [
                '}',
            ],
        ];
    }
    
    /**
     * Make sure AnnotatedClassDiscovery never tries to autoload bad annotations.
     *
     * @dataProvider provideBadAnnotations
     *
     * @coversNothing
     */
    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);
    }

}

Classes

Title Deprecated Summary
AnnotatedClassDiscoveryTest @coversDefaultClass \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery

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