You are here

class PHPUnit_Framework_MockObject_Matcher in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php \PHPUnit_Framework_MockObject_Matcher

Main matcher which defines a full expectation using method, parameter and invocation matchers. This matcher encapsulates all the other matchers and allows the builder to set the specific matchers when the appropriate methods are called (once(), where() etc.).

All properties are public so that they can easily be accessed by the builder.

@since Class available since Release 1.0.0

Hierarchy

Expanded class hierarchy of PHPUnit_Framework_MockObject_Matcher

File

vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php, line 22

View source
class PHPUnit_Framework_MockObject_Matcher implements PHPUnit_Framework_MockObject_Matcher_Invocation {

  /**
   * @var PHPUnit_Framework_MockObject_Matcher_Invocation
   */
  public $invocationMatcher;

  /**
   * @var mixed
   */
  public $afterMatchBuilderId = null;

  /**
   * @var bool
   */
  public $afterMatchBuilderIsInvoked = false;

  /**
   * @var PHPUnit_Framework_MockObject_Matcher_MethodName
   */
  public $methodNameMatcher = null;

  /**
   * @var PHPUnit_Framework_MockObject_Matcher_Parameters
   */
  public $parametersMatcher = null;

  /**
   * @var PHPUnit_Framework_MockObject_Stub
   */
  public $stub = null;

  /**
   * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
   */
  public function __construct(PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher) {
    $this->invocationMatcher = $invocationMatcher;
  }

  /**
   * @return string
   */
  public function toString() {
    $list = array();
    if ($this->invocationMatcher !== null) {
      $list[] = $this->invocationMatcher
        ->toString();
    }
    if ($this->methodNameMatcher !== null) {
      $list[] = 'where ' . $this->methodNameMatcher
        ->toString();
    }
    if ($this->parametersMatcher !== null) {
      $list[] = 'and ' . $this->parametersMatcher
        ->toString();
    }
    if ($this->afterMatchBuilderId !== null) {
      $list[] = 'after ' . $this->afterMatchBuilderId;
    }
    if ($this->stub !== null) {
      $list[] = 'will ' . $this->stub
        ->toString();
    }
    return implode(' ', $list);
  }

  /**
   * @param  PHPUnit_Framework_MockObject_Invocation $invocation
   * @return mixed
   */
  public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation) {
    if ($this->invocationMatcher === null) {
      throw new PHPUnit_Framework_Exception('No invocation matcher is set');
    }
    if ($this->methodNameMatcher === null) {
      throw new PHPUnit_Framework_Exception('No method matcher is set');
    }
    if ($this->afterMatchBuilderId !== null) {
      $builder = $invocation->object
        ->__phpunit_getInvocationMocker()
        ->lookupId($this->afterMatchBuilderId);
      if (!$builder) {
        throw new PHPUnit_Framework_Exception(sprintf('No builder found for match builder identification <%s>', $this->afterMatchBuilderId));
      }
      $matcher = $builder
        ->getMatcher();
      if ($matcher && $matcher->invocationMatcher
        ->hasBeenInvoked()) {
        $this->afterMatchBuilderIsInvoked = true;
      }
    }
    $this->invocationMatcher
      ->invoked($invocation);
    try {
      if ($this->parametersMatcher !== null && !$this->parametersMatcher
        ->matches($invocation)) {
        $this->parametersMatcher
          ->verify();
      }
    } catch (PHPUnit_Framework_ExpectationFailedException $e) {
      throw new PHPUnit_Framework_ExpectationFailedException(sprintf("Expectation failed for %s when %s\n%s", $this->methodNameMatcher
        ->toString(), $this->invocationMatcher
        ->toString(), $e
        ->getMessage()), $e
        ->getComparisonFailure());
    }
    if ($this->stub) {
      return $this->stub
        ->invoke($invocation);
    }
    return;
  }

  /**
   * @param  PHPUnit_Framework_MockObject_Invocation $invocation
   * @return bool
   */
  public function matches(PHPUnit_Framework_MockObject_Invocation $invocation) {
    if ($this->afterMatchBuilderId !== null) {
      $builder = $invocation->object
        ->__phpunit_getInvocationMocker()
        ->lookupId($this->afterMatchBuilderId);
      if (!$builder) {
        throw new PHPUnit_Framework_Exception(sprintf('No builder found for match builder identification <%s>', $this->afterMatchBuilderId));
      }
      $matcher = $builder
        ->getMatcher();
      if (!$matcher) {
        return false;
      }
      if (!$matcher->invocationMatcher
        ->hasBeenInvoked()) {
        return false;
      }
    }
    if ($this->invocationMatcher === null) {
      throw new PHPUnit_Framework_Exception('No invocation matcher is set');
    }
    if ($this->methodNameMatcher === null) {
      throw new PHPUnit_Framework_Exception('No method matcher is set');
    }
    if (!$this->invocationMatcher
      ->matches($invocation)) {
      return false;
    }
    try {
      if (!$this->methodNameMatcher
        ->matches($invocation)) {
        return false;
      }
    } catch (PHPUnit_Framework_ExpectationFailedException $e) {
      throw new PHPUnit_Framework_ExpectationFailedException(sprintf("Expectation failed for %s when %s\n%s", $this->methodNameMatcher
        ->toString(), $this->invocationMatcher
        ->toString(), $e
        ->getMessage()), $e
        ->getComparisonFailure());
    }
    return true;
  }

  /**
   * @throws PHPUnit_Framework_Exception
   * @throws PHPUnit_Framework_ExpectationFailedException
   */
  public function verify() {
    if ($this->invocationMatcher === null) {
      throw new PHPUnit_Framework_Exception('No invocation matcher is set');
    }
    if ($this->methodNameMatcher === null) {
      throw new PHPUnit_Framework_Exception('No method matcher is set');
    }
    try {
      $this->invocationMatcher
        ->verify();
      if ($this->parametersMatcher === null) {
        $this->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters();
      }
      $invocationIsAny = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount';
      $invocationIsNever = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' && $this->invocationMatcher
        ->isNever();
      if (!$invocationIsAny && !$invocationIsNever) {
        $this->parametersMatcher
          ->verify();
      }
    } catch (PHPUnit_Framework_ExpectationFailedException $e) {
      throw new PHPUnit_Framework_ExpectationFailedException(sprintf("Expectation failed for %s when %s.\n%s", $this->methodNameMatcher
        ->toString(), $this->invocationMatcher
        ->toString(), PHPUnit_Framework_TestFailure::exceptionToString($e)));
    }
  }

  /**
   * @since Method available since Release 1.2.4
   */
  public function hasMatchers() {
    if ($this->invocationMatcher !== null && !$this->invocationMatcher instanceof PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount) {
      return true;
    }
    return false;
  }

}

Members