diff core/tests/Drupal/Tests/PhpunitCompatibilityTrait.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/Drupal/Tests/PhpunitCompatibilityTrait.php	Thu Jul 05 14:24:15 2018 +0000
@@ -0,0 +1,167 @@
+<?php
+
+namespace Drupal\Tests;
+
+/**
+ * Makes Drupal's test API forward compatible with multiple versions of PHPUnit.
+ */
+trait PhpunitCompatibilityTrait {
+
+  /**
+   * Returns a mock object for the specified class using the available method.
+   *
+   * The getMock method does not exist in PHPUnit 6. To provide backward
+   * compatibility this trait provides the getMock method and uses createMock if
+   * this method is available on the parent class.
+   *
+   * @param string $originalClassName
+   *   Name of the class to mock.
+   * @param array|null $methods
+   *   When provided, only methods whose names are in the array are replaced
+   *   with a configurable test double. The behavior of the other methods is not
+   *   changed. Providing null means that no methods will be replaced.
+   * @param array $arguments
+   *   Parameters to pass to the original class' constructor.
+   * @param string $mockClassName
+   *   Class name for the generated test double class.
+   * @param bool $callOriginalConstructor
+   *   Can be used to disable the call to the original class' constructor.
+   * @param bool $callOriginalClone
+   *   Can be used to disable the call to the original class' clone constructor.
+   * @param bool $callAutoload
+   *   Can be used to disable __autoload() during the generation of the test
+   *   double class.
+   * @param bool $cloneArguments
+   *   Enables the cloning of arguments passed to mocked methods.
+   * @param bool $callOriginalMethods
+   *   Enables the invocation of the original methods.
+   * @param object $proxyTarget
+   *   Sets the proxy target.
+   *
+   * @see \PHPUnit_Framework_TestCase::getMock
+   * @see https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-5.4.0
+   *
+   * @return \PHPUnit_Framework_MockObject_MockObject
+   *
+   * @deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0.
+   *   Use \Drupal\Tests\PhpunitCompatibilityTrait::createMock() instead.
+   *
+   * @see https://www.drupal.org/node/2907725
+   */
+  public function getMock($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = FALSE, $callOriginalMethods = FALSE, $proxyTarget = NULL) {
+    if (!$this->supports('getMock')) {
+      $mock = $this->getMockBuilder($originalClassName)
+        ->setMethods($methods)
+        ->setConstructorArgs($arguments)
+        ->setMockClassName($mockClassName)
+        ->setProxyTarget($proxyTarget);
+      if ($callOriginalConstructor) {
+        $mock->enableOriginalConstructor();
+      }
+      else {
+        $mock->disableOriginalConstructor();
+      }
+      if ($callOriginalClone) {
+        $mock->enableOriginalClone();
+      }
+      else {
+        $mock->disableOriginalClone();
+      }
+      if ($callAutoload) {
+        $mock->enableAutoload();
+      }
+      else {
+        $mock->disableAutoload();
+      }
+      if ($cloneArguments) {
+        $mock->enableArgumentCloning();
+      }
+      else {
+        $mock->disableArgumentCloning();
+      }
+      if ($callOriginalMethods) {
+        $mock->enableProxyingToOriginalMethods();
+      }
+      else {
+        $mock->disableProxyingToOriginalMethods();
+      }
+      return $mock->getMock();
+    }
+    else {
+      return parent::getMock($originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods, $proxyTarget);
+    }
+  }
+
+  /**
+   * Returns a mock object for the specified class using the available method.
+   *
+   * The createMock method does not exist in PHPUnit 4. To provide forward
+   * compatibility this trait provides the createMock method and uses createMock
+   * if this method is available on the parent class or falls back to getMock if
+   * it isn't.
+   *
+   * @param string $originalClassName
+   *   Name of the class to mock.
+   *
+   * @see \PHPUnit_Framework_TestCase::getMock
+   *
+   * @return \PHPUnit_Framework_MockObject_MockObject
+   */
+  public function createMock($originalClassName) {
+    if ($this->supports('createMock')) {
+      return parent::createMock($originalClassName);
+    }
+    else {
+      return $this->getMock($originalClassName, [], [], '', FALSE, FALSE);
+    }
+  }
+
+  /**
+   * Compatibility layer for PHPUnit 6 to support PHPUnit 4 code.
+   *
+   * @param mixed $class
+   *   The expected exception class.
+   * @param string $message
+   *   The expected exception message.
+   * @param int $exception_code
+   *   The expected exception code.
+   */
+  public function setExpectedException($class, $message = '', $exception_code = NULL) {
+    if (method_exists($this, 'expectException')) {
+      $this->expectException($class);
+      if (!empty($message)) {
+        $this->expectExceptionMessage($message);
+      }
+      if ($exception_code !== NULL) {
+        $this->expectExceptionCode($exception_code);
+      }
+    }
+    else {
+      parent::setExpectedException($class, $message, $exception_code);
+    }
+  }
+
+  /**
+   * Checks if the trait is used in a class that has a method.
+   *
+   * @param string $method
+   *   Method to check.
+   *
+   * @return bool
+   *   TRUE if the method is supported, FALSE if not.
+   */
+  private function supports($method) {
+    // Get the parent class of the currently running test class.
+    $parent = get_parent_class($this);
+    // Ensure that the method_exists() check on the createMock method is carried
+    // out on the first parent of $this that does not have access to this
+    // trait's methods. This is because the trait also has a method called
+    // createMock(). Most often the check will be made on
+    // \PHPUnit\Framework\TestCase.
+    while (method_exists($parent, 'supports')) {
+      $parent = get_parent_class($parent);
+    }
+    return method_exists($parent, $method);
+  }
+
+}