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 }
|