annotate core/tests/Drupal/Tests/Component/DrupalComponentTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Tests\Component;
Chris@0 4
Chris@0 5 use org\bovigo\vfs\vfsStream;
Chris@0 6 use PHPUnit\Framework\TestCase;
Chris@0 7
Chris@0 8 /**
Chris@0 9 * General tests for \Drupal\Component that can't go anywhere else.
Chris@0 10 *
Chris@0 11 * @group Component
Chris@0 12 */
Chris@0 13 class DrupalComponentTest extends TestCase {
Chris@0 14
Chris@0 15 /**
Chris@0 16 * Tests that classes in Component do not use any Core class.
Chris@0 17 */
Chris@0 18 public function testNoCoreInComponent() {
Chris@0 19 $component_path = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__))) . '/lib/Drupal/Component';
Chris@0 20 foreach ($this->findPhpClasses($component_path) as $class) {
Chris@0 21 $this->assertNoCoreUsage($class);
Chris@0 22 }
Chris@0 23 }
Chris@0 24
Chris@0 25 /**
Chris@0 26 * Tests that classes in Component Tests do not use any Core class.
Chris@0 27 */
Chris@0 28 public function testNoCoreInComponentTests() {
Chris@0 29 $component_path = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__))) . '/tests/Drupal/Tests/Component';
Chris@0 30 foreach ($this->findPhpClasses($component_path) as $class) {
Chris@0 31 $this->assertNoCoreUsage($class);
Chris@0 32 }
Chris@0 33 }
Chris@0 34
Chris@0 35 /**
Chris@0 36 * Searches a directory recursively for PHP classes.
Chris@0 37 *
Chris@0 38 * @param string $dir
Chris@0 39 * The full path to the directory that should be checked.
Chris@0 40 *
Chris@0 41 * @return array
Chris@0 42 * An array of class paths.
Chris@0 43 */
Chris@0 44 protected function findPhpClasses($dir) {
Chris@0 45 $classes = [];
Chris@0 46 foreach (new \DirectoryIterator($dir) as $file) {
Chris@0 47 if ($file->isDir() && !$file->isDot()) {
Chris@0 48 $classes = array_merge($classes, $this->findPhpClasses($file->getPathname()));
Chris@0 49 }
Chris@0 50 elseif ($file->getExtension() == 'php') {
Chris@0 51 $classes[] = $file->getPathname();
Chris@0 52 }
Chris@0 53 }
Chris@0 54
Chris@0 55 return $classes;
Chris@0 56 }
Chris@0 57
Chris@0 58 /**
Chris@0 59 * Asserts that the given class is not using any class from Core namespace.
Chris@0 60 *
Chris@0 61 * @param string $class_path
Chris@0 62 * The full path to the class that should be checked.
Chris@0 63 */
Chris@0 64 protected function assertNoCoreUsage($class_path) {
Chris@0 65 $contents = file_get_contents($class_path);
Chris@0 66 preg_match_all('/^.*Drupal\\\Core.*$/m', $contents, $matches);
Chris@0 67 $matches = array_filter($matches[0], function ($line) {
Chris@0 68 // Filter references to @see as they don't really matter.
Chris@0 69 return strpos($line, '@see') === FALSE;
Chris@0 70 });
Chris@0 71 $this->assertEmpty($matches, "Checking for illegal reference to 'Drupal\\Core' namespace in $class_path");
Chris@0 72 }
Chris@0 73
Chris@0 74 /**
Chris@0 75 * Data provider for testAssertNoCoreUseage().
Chris@0 76 *
Chris@0 77 * @return array
Chris@0 78 * Data for testAssertNoCoreUseage() in the form:
Chris@0 79 * - TRUE if the test passes, FALSE otherwise.
Chris@0 80 * - File data as a string. This will be used as a virtual file.
Chris@0 81 */
Chris@0 82 public function providerAssertNoCoreUseage() {
Chris@0 83 return [
Chris@0 84 [
Chris@0 85 TRUE,
Chris@0 86 '@see \\Drupal\\Core\\Something',
Chris@0 87 ],
Chris@0 88 [
Chris@0 89 FALSE,
Chris@0 90 '\\Drupal\\Core\\Something',
Chris@0 91 ],
Chris@0 92 [
Chris@0 93 FALSE,
Chris@0 94 "@see \\Drupal\\Core\\Something\n" .
Chris@0 95 '\\Drupal\\Core\\Something',
Chris@0 96 ],
Chris@0 97 [
Chris@0 98 FALSE,
Chris@0 99 "\\Drupal\\Core\\Something\n" .
Chris@0 100 '@see \\Drupal\\Core\\Something',
Chris@0 101 ],
Chris@0 102 ];
Chris@0 103 }
Chris@0 104
Chris@0 105 /**
Chris@0 106 * @covers \Drupal\Tests\Component\DrupalComponentTest::assertNoCoreUsage
Chris@0 107 * @dataProvider providerAssertNoCoreUseage
Chris@0 108 */
Chris@0 109 public function testAssertNoCoreUseage($expected_pass, $file_data) {
Chris@0 110 // Set up a virtual file to read.
Chris@0 111 $vfs_root = vfsStream::setup('root');
Chris@0 112 vfsStream::newFile('Test.php')->at($vfs_root)->setContent($file_data);
Chris@0 113 $file_uri = vfsStream::url('root/Test.php');
Chris@0 114
Chris@0 115 try {
Chris@0 116 $pass = TRUE;
Chris@0 117 $this->assertNoCoreUsage($file_uri);
Chris@0 118 }
Chris@0 119 catch (\PHPUnit_Framework_AssertionFailedError $e) {
Chris@0 120 $pass = FALSE;
Chris@0 121 }
Chris@0 122 $this->assertEquals($expected_pass, $pass, $expected_pass ?
Chris@0 123 'Test caused a false positive' :
Chris@0 124 'Test failed to detect Core usage');
Chris@0 125 }
Chris@0 126
Chris@0 127 }