From 914b78de24a048f45768a27f1c9d17833131761c Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Mon, 3 Nov 2014 10:47:06 +0000
Subject: [PATCH] Issue #2282673 by stevepurkiss, ParisLiakos, mgifford: Add a
 PHPunit test for not using Drupal\Core code in Drupal\Component.

---
 .../Drupal/Component/Annotation/PluginID.php  |  2 +-
 .../Exception/InvalidDecoratedMethod.php      |  2 +-
 .../Drupal/Component/Utility/SortArray.php    | 10 +--
 .../Drupal/Component/Utility/UrlHelper.php    |  5 +-
 .../Tests/Component/DrupalComponentTest.php   | 78 +++++++++++++++++++
 .../PhpStorage/PhpStorageTestBase.php         | 17 ----
 .../Tests/Component/Plugin/PluginBaseTest.php |  1 -
 .../Drupal/Tests/Component/Uuid/UuidTest.php  |  1 -
 8 files changed, 86 insertions(+), 30 deletions(-)
 create mode 100644 core/tests/Drupal/Tests/Component/DrupalComponentTest.php

diff --git a/core/lib/Drupal/Component/Annotation/PluginID.php b/core/lib/Drupal/Component/Annotation/PluginID.php
index fe8e599c9ea7..ab5e19381786 100644
--- a/core/lib/Drupal/Component/Annotation/PluginID.php
+++ b/core/lib/Drupal/Component/Annotation/PluginID.php
@@ -24,7 +24,7 @@ class PluginID extends AnnotationBase {
   public $value;
 
   /**
-   * Implements \Drupal\Core\Annotation\AnnotationInterface::get().
+   * {@inheritdoc}
    */
   public function get() {
     return array(
diff --git a/core/lib/Drupal/Component/Plugin/Exception/InvalidDecoratedMethod.php b/core/lib/Drupal/Component/Plugin/Exception/InvalidDecoratedMethod.php
index a810063bf1ff..57fd8359e5f2 100644
--- a/core/lib/Drupal/Component/Plugin/Exception/InvalidDecoratedMethod.php
+++ b/core/lib/Drupal/Component/Plugin/Exception/InvalidDecoratedMethod.php
@@ -1,7 +1,7 @@
 <?php
 /**
  * @file
- * Definition of Drupal\Core\Plugin\Exception\InvalidDecoratedMethod.
+ * Contains \Drupal\Component\Plugin\Exception\InvalidDecoratedMethod.
  */
 
 namespace Drupal\Component\Plugin\Exception;
diff --git a/core/lib/Drupal/Component/Utility/SortArray.php b/core/lib/Drupal/Component/Utility/SortArray.php
index 79688ec89699..0ed5bbc8b7d7 100644
--- a/core/lib/Drupal/Component/Utility/SortArray.php
+++ b/core/lib/Drupal/Component/Utility/SortArray.php
@@ -20,7 +20,7 @@ class SortArray {
    * Note that the sorting is by the 'weight' array element, not by the render
    * element property '#weight'.
    *
-   * Callback for uasort() used in various functions.
+   * Callback for uasort().
    *
    * @param array $a
    *   First item for comparison. The compared items should be associative
@@ -39,7 +39,7 @@ public static function sortByWeightElement(array $a, array $b) {
   /**
    * Sorts a structured array by '#weight' property.
    *
-   * Callback for uasort() within \Drupal\Core\Render\Element::children().
+   * Callback for uasort().
    *
    * @param array $a
    *   First item for comparison. The compared items should be associative
@@ -57,7 +57,7 @@ public static function sortByWeightProperty($a, $b) {
   /**
    * Sorts a structured array by 'title' key (no # prefix).
    *
-   * Callback for uasort() within system_admin_index().
+   * Callback for uasort().
    *
    * @param array $a
    *   First item for comparison. The compared items should be associative arrays
@@ -75,9 +75,7 @@ public static function sortByTitleElement($a, $b) {
   /**
    * Sorts a structured array by '#title' property.
    *
-   * Callback for uasort() within:
-   * - system_modules()
-   * - theme_simpletest_test_table()
+   * Callback for uasort().
    *
    * @param array $a
    *   First item for comparison. The compared items should be associative arrays
diff --git a/core/lib/Drupal/Component/Utility/UrlHelper.php b/core/lib/Drupal/Component/Utility/UrlHelper.php
index 45a80364bcd6..691413e80e6e 100644
--- a/core/lib/Drupal/Component/Utility/UrlHelper.php
+++ b/core/lib/Drupal/Component/Utility/UrlHelper.php
@@ -288,9 +288,8 @@ public static function setAllowedProtocols(array $protocols = array()) {
    * to being output to an HTML attribute value. It is often called as part of
    * check_url() or Drupal\Component\Utility\Xss::filter(), but those functions
    * return an HTML-encoded string, so this function can be called independently
-   * when the output needs to be a plain-text string for passing to t(), _l(),
-   * Drupal\Core\Template\Attribute, or another function that will call
-   * \Drupal\Component\Utility\String::checkPlain() separately.
+   * when the output needs to be a plain-text string for passing to functions
+   * that will call \Drupal\Component\Utility\String::checkPlain() separately.
    *
    * @param string $uri
    *   A plain-text URI that might contain dangerous protocols.
diff --git a/core/tests/Drupal/Tests/Component/DrupalComponentTest.php b/core/tests/Drupal/Tests/Component/DrupalComponentTest.php
new file mode 100644
index 000000000000..29240749fe2a
--- /dev/null
+++ b/core/tests/Drupal/Tests/Component/DrupalComponentTest.php
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Component\DrupalComponentTest.
+ */
+
+namespace Drupal\Tests\Component;
+
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * General tests for \Drupal\Component that can't go anywhere else.
+ *
+ * @group Component
+ */
+class DrupalComponentTest extends UnitTestCase {
+
+  /**
+   * Tests that classes in Component do not use any Core class.
+   */
+  public function testNoCoreInComponent() {
+    $component_path = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__))) . '/lib/Drupal/Component';
+    foreach ($this->findPhpClasses($component_path) as $class) {
+      $this->assertNoCoreUsage($class);
+    }
+  }
+
+  /**
+   * Tests that classes in Component Tests do not use any Core class.
+   */
+  public function testNoCoreInComponentTests() {
+    $component_path = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__))) . '/tests/Drupal/Tests/Component';
+    foreach ($this->findPhpClasses($component_path) as $class) {
+      $this->assertNoCoreUsage($class);
+    }
+  }
+
+  /**
+   * Searches a directory recursively for PHP classes.
+   *
+   * @param string $dir
+   *   The full path to the directory that should be checked.
+   *
+   * @return array
+   *   An array of class paths.
+   */
+  protected function findPhpClasses($dir) {
+    $classes = array();
+    foreach (new \DirectoryIterator($dir) as $file) {
+      if ($file->isDir() && !$file->isDot()) {
+        $classes = array_merge($classes, $this->findPhpClasses($file->getPathname()));
+      }
+      elseif ($file->getExtension() == 'php') {
+        $classes[] = $file->getPathname();
+      }
+    }
+
+    return $classes;
+  }
+
+  /**
+   * Asserts that the given class is not using any class from Core namespace.
+   *
+   * @param string $class_path
+   *   The full path to the class that should be checked.
+   */
+  protected function assertNoCoreUsage($class_path) {
+    foreach (new \SplFileObject($class_path) as $line_number => $line) {
+      // Allow linking to Core files with @see docs. Its harmless and boosts DX
+      // because even outside projects can treat those links as examples.
+      if ($line && (strpos($line, '@see ') === FALSE)) {
+        $this->assertSame(FALSE, strpos($line, 'Drupal\\Core'), "Illegal reference to 'Drupal\\Core' namespace in $class_path at line $line_number");
+      }
+    }
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Component/PhpStorage/PhpStorageTestBase.php b/core/tests/Drupal/Tests/Component/PhpStorage/PhpStorageTestBase.php
index 2c179a81bd1c..aa54598c4c11 100644
--- a/core/tests/Drupal/Tests/Component/PhpStorage/PhpStorageTestBase.php
+++ b/core/tests/Drupal/Tests/Component/PhpStorage/PhpStorageTestBase.php
@@ -8,29 +8,12 @@
 namespace Drupal\Tests\Component\PhpStorage;
 
 use Drupal\Tests\UnitTestCase;
-use Drupal\Core\PhpStorage\PhpStorageFactory;
 
 /**
  * Base test for PHP storages.
  */
 abstract class PhpStorageTestBase extends UnitTestCase {
 
-  /**
-   * The storage factory object.
-   *
-   * @var \Drupal\Component\PhpStorage\PhpStorageFactory
-   */
-  protected $storageFactory;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->storageFactory = new PhpStorageFactory();
-  }
-
   /**
    * Assert that a PHP storage's load/save/delete operations work.
    */
diff --git a/core/tests/Drupal/Tests/Component/Plugin/PluginBaseTest.php b/core/tests/Drupal/Tests/Component/Plugin/PluginBaseTest.php
index 97e4275acf95..585bd37b5caa 100644
--- a/core/tests/Drupal/Tests/Component/Plugin/PluginBaseTest.php
+++ b/core/tests/Drupal/Tests/Component/Plugin/PluginBaseTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\Tests\Component\Plugin;
 
-use Drupal\Core\PhpStorage\PhpStorageFactory;
 use Drupal\Tests\UnitTestCase;
 
 /**
diff --git a/core/tests/Drupal/Tests/Component/Uuid/UuidTest.php b/core/tests/Drupal/Tests/Component/Uuid/UuidTest.php
index 1f0081963283..353c3520a826 100644
--- a/core/tests/Drupal/Tests/Component/Uuid/UuidTest.php
+++ b/core/tests/Drupal/Tests/Component/Uuid/UuidTest.php
@@ -12,7 +12,6 @@
 use Drupal\Component\Uuid\Com;
 use Drupal\Component\Uuid\Pecl;
 use Drupal\Component\Uuid\Php;
-use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Tests\UnitTestCase;
 
 /**
-- 
GitLab