| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | <?phpnamespace 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);  }}
 |