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