Chris@0: Chris@0: * Marcello Duarte Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Prophecy\Argument\Token; Chris@0: Chris@0: use SebastianBergmann\Comparator\ComparisonFailure; Chris@0: use Prophecy\Comparator\Factory as ComparatorFactory; Chris@0: use Prophecy\Util\StringUtil; Chris@0: Chris@0: /** Chris@0: * Exact value token. Chris@0: * Chris@0: * @author Konstantin Kudryashov Chris@0: */ Chris@0: class ExactValueToken implements TokenInterface Chris@0: { Chris@0: private $value; Chris@0: private $string; Chris@0: private $util; Chris@0: private $comparatorFactory; Chris@0: Chris@0: /** Chris@0: * Initializes token. Chris@0: * Chris@0: * @param mixed $value Chris@0: * @param StringUtil $util Chris@0: * @param ComparatorFactory $comparatorFactory Chris@0: */ Chris@0: public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) Chris@0: { Chris@0: $this->value = $value; Chris@0: $this->util = $util ?: new StringUtil(); Chris@0: Chris@0: $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Scores 10 if argument matches preset value. Chris@0: * Chris@0: * @param $argument Chris@0: * Chris@0: * @return bool|int Chris@0: */ Chris@0: public function scoreArgument($argument) Chris@0: { Chris@0: if (is_object($argument) && is_object($this->value)) { Chris@0: $comparator = $this->comparatorFactory->getComparatorFor( Chris@0: $argument, $this->value Chris@0: ); Chris@0: Chris@0: try { Chris@0: $comparator->assertEquals($argument, $this->value); Chris@0: return 10; Chris@0: } catch (ComparisonFailure $failure) {} Chris@0: } Chris@0: Chris@0: // If either one is an object it should be castable to a string Chris@0: if (is_object($argument) xor is_object($this->value)) { Chris@0: if (is_object($argument) && !method_exists($argument, '__toString')) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: if (is_object($this->value) && !method_exists($this->value, '__toString')) { Chris@0: return false; Chris@0: } Chris@0: } elseif (is_numeric($argument) && is_numeric($this->value)) { Chris@0: // noop Chris@0: } elseif (gettype($argument) !== gettype($this->value)) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: return $argument == $this->value ? 10 : false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns preset value against which token checks arguments. Chris@0: * Chris@0: * @return mixed Chris@0: */ Chris@0: public function getValue() Chris@0: { Chris@0: return $this->value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns false. Chris@0: * Chris@0: * @return bool Chris@0: */ Chris@0: public function isLast() Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns string representation for token. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function __toString() Chris@0: { Chris@0: if (null === $this->string) { Chris@0: $this->string = sprintf('exact(%s)', $this->util->stringify($this->value)); Chris@0: } Chris@0: Chris@0: return $this->string; Chris@0: } Chris@0: }