From e7836c2df46ede15927d1afa7cd5007e5d52defd Mon Sep 17 00:00:00 2001
From: Dries <dries@buytaert.net>
Date: Mon, 21 Oct 2013 16:07:49 -0400
Subject: [PATCH] Issue #338403 by klausi, jhodgdon, grisendo, YesCT, drewish:
 Use {@inheritdoc} on all class methods (including tests).

---
 .../lib/Drupal/simpletest/TestBase.php        | 26 +++++++++++++++++++
 core/modules/simpletest/simpletest.module     | 19 ++++++++++++--
 core/tests/Drupal/Tests/UnitTestCase.php      | 23 ++++++++--------
 3 files changed, 54 insertions(+), 14 deletions(-)

diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
index c2d4b44cd6d8..3c0ea2cc87db 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
@@ -195,6 +195,30 @@ public function __construct($test_id = NULL) {
     $this->testId = $test_id;
   }
 
+  /**
+   * Provides meta information about this test case, such as test name.
+   *
+   * @return array
+   *   An array of untranslated strings with the following keys:
+   *   - name: An overview of what is tested by the class; for example, "User
+   *     access rules".
+   *   - description: One sentence describing the test, starting with a verb.
+   *   - group: The human-readable name of the module ("Node", "Statistics"), or
+   *     the human-readable name of the Drupal facility tested (e.g. "Form API"
+   *     or "XML-RPC").
+   */
+  public static function getInfo() {
+    // PHP does not allow us to declare this method as abstract public static,
+    // so we simply throw an exception here if this has not been implemented by
+    // a child class.
+    throw new \RuntimeException("Sub-class must implement the getInfo method!");
+  }
+
+  /**
+   * Performs setup tasks before each individual test method is run.
+   */
+  abstract protected function setUp();
+
   /**
    * Checks the matching requirements for Test.
    *
@@ -1018,6 +1042,8 @@ protected function rebuildContainer() {
   }
 
   /**
+   * Performs cleanup tasks after each individual test method has been run.
+   *
    * Deletes created files, database tables, and reverts environment changes.
    *
    * This method needs to be invoked for both unit and integration tests.
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index d04012eb4083..da7c265f972c 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -480,8 +480,23 @@ function simpletest_test_get_all() {
       foreach ($classes as $class) {
         // Test classes need to implement getInfo() to be valid.
         if (class_exists($class) && method_exists($class, 'getInfo')) {
-          $info = call_user_func(array($class, 'getInfo'));
-
+          $reflectionClass = new ReflectionClass($class);
+          // Skip abstract classes and interfaces.
+          if ($reflectionClass->isInstantiable()) {
+            $reflectionMethod = new ReflectionMethod($class, 'getInfo');
+            $declaringClass = $reflectionMethod->getDeclaringClass()->getName();
+            // Avoid testing intermediate classes which do not implement the
+            // method.
+            if ($class == $declaringClass) {
+              $info = call_user_func(array($class, 'getInfo'));
+            }
+            else {
+              continue;
+            }
+          }
+          else {
+            continue;
+          }
           // If this test class requires a non-existing module, skip it.
           if (!empty($info['dependencies'])) {
             foreach ($info['dependencies'] as $module) {
diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php
index 2917318d11b2..1535c779dd5c 100644
--- a/core/tests/Drupal/Tests/UnitTestCase.php
+++ b/core/tests/Drupal/Tests/UnitTestCase.php
@@ -22,22 +22,21 @@ abstract class UnitTestCase extends \PHPUnit_Framework_TestCase {
   protected $randomGenerator;
 
   /**
-   * This method exists to support the simpletest UI runner.
-   *
-   * It should eventually be replaced with something native to phpunit.
-   *
-   * Also, this method is empty because you can't have an abstract static
-   * method. Sub-classes should always override it.
+   * Provides meta information about this test case, such as test name.
    *
    * @return array
-   *   An array describing the test like so:
-   *   array(
-   *     'name' => 'Something Test',
-   *     'description' => 'Tests Something',
-   *     'group' => 'Something',
-   *   )
+   *   An array of untranslated strings with the following keys:
+   *   - name: An overview of what is tested by the class; for example, "User
+   *     access rules".
+   *   - description: One sentence describing the test, starting with a verb.
+   *   - group: The human-readable name of the module ("Node", "Statistics"), or
+   *     the human-readable name of the Drupal facility tested (e.g. "Form API"
+   *     or "XML-RPC").
    */
   public static function getInfo() {
+    // PHP does not allow us to declare this method as abstract public static,
+    // so we simply throw an exception here if this has not been implemented by
+    // a child class.
     throw new \RuntimeException("Sub-class must implement the getInfo method!");
   }
 
-- 
GitLab