You are here

class MethodProphecy in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php \Prophecy\Prophecy\MethodProphecy

Method prophecy.

@author Konstantin Kudryashov <ever.zet@gmail.com>

Hierarchy

Expanded class hierarchy of MethodProphecy

14 files declare their use of MethodProphecy
CallbackPrediction.php in vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php
CallbackPromise.php in vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php
CallCenter.php in vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
CallPrediction.php in vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php
CallTimesPrediction.php in vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php

... See full list

File

vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php, line 27

Namespace

Prophecy\Prophecy
View source
class MethodProphecy {
  private $objectProphecy;
  private $methodName;
  private $argumentsWildcard;
  private $promise;
  private $prediction;
  private $checkedPredictions = array();
  private $bound = false;

  /**
   * Initializes method prophecy.
   *
   * @param ObjectProphecy                        $objectProphecy
   * @param string                                $methodName
   * @param null|Argument\ArgumentsWildcard|array $arguments
   *
   * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found
   */
  public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null) {
    $double = $objectProphecy
      ->reveal();
    if (!method_exists($double, $methodName)) {
      throw new MethodNotFoundException(sprintf('Method `%s::%s()` is not defined.', get_class($double), $methodName), get_class($double), $methodName, $arguments);
    }
    $this->objectProphecy = $objectProphecy;
    $this->methodName = $methodName;
    $reflectedMethod = new \ReflectionMethod($double, $methodName);
    if ($reflectedMethod
      ->isFinal()) {
      throw new MethodProphecyException(sprintf("Can not add prophecy for a method `%s::%s()`\n" . "as it is a final method.", get_class($double), $methodName), $this);
    }
    if (null !== $arguments) {
      $this
        ->withArguments($arguments);
    }
    if (version_compare(PHP_VERSION, '7.0', '>=') && true === $reflectedMethod
      ->hasReturnType()) {
      $type = (string) $reflectedMethod
        ->getReturnType();
      $this
        ->will(function () use ($type) {
        switch ($type) {
          case 'string':
            return '';
          case 'float':
            return 0.0;
          case 'int':
            return 0;
          case 'bool':
            return false;
          case 'array':
            return array();
          case 'callable':
          case 'Closure':
            return function () {
            };
          case 'Traversable':
          case 'Generator':

            // Remove eval() when minimum version >=5.5
            $generator = eval('return function () { yield; };');
            return $generator();
          default:
            $prophet = new Prophet();
            return $prophet
              ->prophesize($type)
              ->reveal();
        }
      });
    }
  }

  /**
   * Sets argument wildcard.
   *
   * @param array|Argument\ArgumentsWildcard $arguments
   *
   * @return $this
   *
   * @throws \Prophecy\Exception\InvalidArgumentException
   */
  public function withArguments($arguments) {
    if (is_array($arguments)) {
      $arguments = new Argument\ArgumentsWildcard($arguments);
    }
    if (!$arguments instanceof Argument\ArgumentsWildcard) {
      throw new InvalidArgumentException(sprintf("Either an array or an instance of ArgumentsWildcard expected as\n" . 'a `MethodProphecy::withArguments()` argument, but got %s.', gettype($arguments)));
    }
    $this->argumentsWildcard = $arguments;
    return $this;
  }

  /**
   * Sets custom promise to the prophecy.
   *
   * @param callable|Promise\PromiseInterface $promise
   *
   * @return $this
   *
   * @throws \Prophecy\Exception\InvalidArgumentException
   */
  public function will($promise) {
    if (is_callable($promise)) {
      $promise = new Promise\CallbackPromise($promise);
    }
    if (!$promise instanceof Promise\PromiseInterface) {
      throw new InvalidArgumentException(sprintf('Expected callable or instance of PromiseInterface, but got %s.', gettype($promise)));
    }
    $this
      ->bindToObjectProphecy();
    $this->promise = $promise;
    return $this;
  }

  /**
   * Sets return promise to the prophecy.
   *
   * @see Prophecy\Promise\ReturnPromise
   *
   * @return $this
   */
  public function willReturn() {
    return $this
      ->will(new Promise\ReturnPromise(func_get_args()));
  }

  /**
   * Sets return argument promise to the prophecy.
   *
   * @param int $index The zero-indexed number of the argument to return
   *
   * @see Prophecy\Promise\ReturnArgumentPromise
   *
   * @return $this
   */
  public function willReturnArgument($index = 0) {
    return $this
      ->will(new Promise\ReturnArgumentPromise($index));
  }

  /**
   * Sets throw promise to the prophecy.
   *
   * @see Prophecy\Promise\ThrowPromise
   *
   * @param string|\Exception $exception Exception class or instance
   *
   * @return $this
   */
  public function willThrow($exception) {
    return $this
      ->will(new Promise\ThrowPromise($exception));
  }

  /**
   * Sets custom prediction to the prophecy.
   *
   * @param callable|Prediction\PredictionInterface $prediction
   *
   * @return $this
   *
   * @throws \Prophecy\Exception\InvalidArgumentException
   */
  public function should($prediction) {
    if (is_callable($prediction)) {
      $prediction = new Prediction\CallbackPrediction($prediction);
    }
    if (!$prediction instanceof Prediction\PredictionInterface) {
      throw new InvalidArgumentException(sprintf('Expected callable or instance of PredictionInterface, but got %s.', gettype($prediction)));
    }
    $this
      ->bindToObjectProphecy();
    $this->prediction = $prediction;
    return $this;
  }

  /**
   * Sets call prediction to the prophecy.
   *
   * @see Prophecy\Prediction\CallPrediction
   *
   * @return $this
   */
  public function shouldBeCalled() {
    return $this
      ->should(new Prediction\CallPrediction());
  }

  /**
   * Sets no calls prediction to the prophecy.
   *
   * @see Prophecy\Prediction\NoCallsPrediction
   *
   * @return $this
   */
  public function shouldNotBeCalled() {
    return $this
      ->should(new Prediction\NoCallsPrediction());
  }

  /**
   * Sets call times prediction to the prophecy.
   *
   * @see Prophecy\Prediction\CallTimesPrediction
   *
   * @param $count
   *
   * @return $this
   */
  public function shouldBeCalledTimes($count) {
    return $this
      ->should(new Prediction\CallTimesPrediction($count));
  }

  /**
   * Checks provided prediction immediately.
   *
   * @param callable|Prediction\PredictionInterface $prediction
   *
   * @return $this
   *
   * @throws \Prophecy\Exception\InvalidArgumentException
   */
  public function shouldHave($prediction) {
    if (is_callable($prediction)) {
      $prediction = new Prediction\CallbackPrediction($prediction);
    }
    if (!$prediction instanceof Prediction\PredictionInterface) {
      throw new InvalidArgumentException(sprintf('Expected callable or instance of PredictionInterface, but got %s.', gettype($prediction)));
    }
    if (null === $this->promise) {
      $this
        ->willReturn();
    }
    $calls = $this
      ->getObjectProphecy()
      ->findProphecyMethodCalls($this
      ->getMethodName(), $this
      ->getArgumentsWildcard());
    try {
      $prediction
        ->check($calls, $this
        ->getObjectProphecy(), $this);
      $this->checkedPredictions[] = $prediction;
    } catch (\Exception $e) {
      $this->checkedPredictions[] = $prediction;
      throw $e;
    }
    return $this;
  }

  /**
   * Checks call prediction.
   *
   * @see Prophecy\Prediction\CallPrediction
   *
   * @return $this
   */
  public function shouldHaveBeenCalled() {
    return $this
      ->shouldHave(new Prediction\CallPrediction());
  }

  /**
   * Checks no calls prediction.
   *
   * @see Prophecy\Prediction\NoCallsPrediction
   *
   * @return $this
   */
  public function shouldNotHaveBeenCalled() {
    return $this
      ->shouldHave(new Prediction\NoCallsPrediction());
  }

  /**
   * Checks no calls prediction.
   *
   * @see Prophecy\Prediction\NoCallsPrediction
   * @deprecated
   *
   * @return $this
   */
  public function shouldNotBeenCalled() {
    return $this
      ->shouldNotHaveBeenCalled();
  }

  /**
   * Checks call times prediction.
   *
   * @see Prophecy\Prediction\CallTimesPrediction
   *
   * @param int $count
   *
   * @return $this
   */
  public function shouldHaveBeenCalledTimes($count) {
    return $this
      ->shouldHave(new Prediction\CallTimesPrediction($count));
  }

  /**
   * Checks currently registered [with should(...)] prediction.
   */
  public function checkPrediction() {
    if (null === $this->prediction) {
      return;
    }
    $this
      ->shouldHave($this->prediction);
  }

  /**
   * Returns currently registered promise.
   *
   * @return null|Promise\PromiseInterface
   */
  public function getPromise() {
    return $this->promise;
  }

  /**
   * Returns currently registered prediction.
   *
   * @return null|Prediction\PredictionInterface
   */
  public function getPrediction() {
    return $this->prediction;
  }

  /**
   * Returns predictions that were checked on this object.
   *
   * @return Prediction\PredictionInterface[]
   */
  public function getCheckedPredictions() {
    return $this->checkedPredictions;
  }

  /**
   * Returns object prophecy this method prophecy is tied to.
   *
   * @return ObjectProphecy
   */
  public function getObjectProphecy() {
    return $this->objectProphecy;
  }

  /**
   * Returns method name.
   *
   * @return string
   */
  public function getMethodName() {
    return $this->methodName;
  }

  /**
   * Returns arguments wildcard.
   *
   * @return Argument\ArgumentsWildcard
   */
  public function getArgumentsWildcard() {
    return $this->argumentsWildcard;
  }
  private function bindToObjectProphecy() {
    if ($this->bound) {
      return;
    }
    $this
      ->getObjectProphecy()
      ->addMethodProphecy($this);
    $this->bound = true;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
MethodProphecy::$argumentsWildcard private property
MethodProphecy::$bound private property
MethodProphecy::$checkedPredictions private property
MethodProphecy::$methodName private property
MethodProphecy::$objectProphecy private property
MethodProphecy::$prediction private property
MethodProphecy::$promise private property
MethodProphecy::bindToObjectProphecy private function
MethodProphecy::checkPrediction public function Checks currently registered [with should(...)] prediction.
MethodProphecy::getArgumentsWildcard public function Returns arguments wildcard.
MethodProphecy::getCheckedPredictions public function Returns predictions that were checked on this object.
MethodProphecy::getMethodName public function Returns method name.
MethodProphecy::getObjectProphecy public function Returns object prophecy this method prophecy is tied to.
MethodProphecy::getPrediction public function Returns currently registered prediction.
MethodProphecy::getPromise public function Returns currently registered promise.
MethodProphecy::should public function Sets custom prediction to the prophecy.
MethodProphecy::shouldBeCalled public function Sets call prediction to the prophecy.
MethodProphecy::shouldBeCalledTimes public function Sets call times prediction to the prophecy.
MethodProphecy::shouldHave public function Checks provided prediction immediately.
MethodProphecy::shouldHaveBeenCalled public function Checks call prediction.
MethodProphecy::shouldHaveBeenCalledTimes public function Checks call times prediction.
MethodProphecy::shouldNotBeCalled public function Sets no calls prediction to the prophecy.
MethodProphecy::shouldNotBeenCalled public function Checks no calls prediction.
MethodProphecy::shouldNotHaveBeenCalled public function Checks no calls prediction.
MethodProphecy::will public function Sets custom promise to the prophecy.
MethodProphecy::willReturn public function Sets return promise to the prophecy.
MethodProphecy::willReturnArgument public function Sets return argument promise to the prophecy.
MethodProphecy::willThrow public function Sets throw promise to the prophecy.
MethodProphecy::withArguments public function Sets argument wildcard.
MethodProphecy::__construct public function Initializes method prophecy.