From 7f690cb62ee7f95cee6d6326c89427ea714e2ef4 Mon Sep 17 00:00:00 2001 From: Daniele Alessandri Date: Sat, 30 Nov 2013 17:14:42 +0100 Subject: [PATCH] [tests] Add a PHPUnit constraint to verify commands. Commands are verified by checking their IDs and optionally arguments. Passing a command instance is only a shortcut to set the expected ID and arguments, commands are never compared for identity but always for equivalence. --- tests/PHPUnit/RedisCommandConstraint.php | 97 ++++++++++++++++++++++++ tests/bootstrap.php | 1 + 2 files changed, 98 insertions(+) create mode 100644 tests/PHPUnit/RedisCommandConstraint.php diff --git a/tests/PHPUnit/RedisCommandConstraint.php b/tests/PHPUnit/RedisCommandConstraint.php new file mode 100644 index 00000000..a7fac9fc --- /dev/null +++ b/tests/PHPUnit/RedisCommandConstraint.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Predis\Command\CommandInterface; + +/** + * Constraint that verifies a redis command. + */ +class RedisCommandConstraint extends PHPUnit_Framework_Constraint +{ + protected $commandID; + protected $arguments; + + /** + * @param array $array + */ + public function __construct($command = null, array $arguments = null) + { + if ($command instanceof CommandInterface) { + $this->commandID = $command->getId(); + $this->arguments = $arguments ?: $commant->getArguments(); + } else { + $this->commandID = $command; + $this->arguments = $arguments; + } + } + + /** + * {@inheritdoc} + */ + public function matches($other) + { + if (!$other instanceof CommandInterface) { + return false; + } + + if ($this->commandID && $other->getId() !== $this->commandID) { + return false; + } + + if ($this->arguments !== null) { + $otherArguments = $other->getArguments(); + + if (count($this->arguments) !== count($otherArguments)) { + return false; + } + + for ($i = 0; $i < count($this->arguments); $i++) { + if (((string) $this->arguments[$i]) !== ((string) $otherArguments[$i])) { + return false; + } + } + } + + return true; + } + + /** + * {@inheritdoc} + * + * @todo Improve output using diff when expected and actual arguments of a + * command do not match. + */ + public function toString() + { + $string = 'is a Redis command'; + + if ($this->commandID) { + $string .= " with ID `{$this->commandID}"; + } + + if ($this->arguments) { + $string .= " and the following arguments:\n\n"; + $string .= PHPUnit_Util_Type::export($this->arguments); + } + + return $string; + } + + /** + * {@inheritdoc} + */ + protected function failureDescription($other) + { + $string = is_object($other) ? get_class($other) : $other; + + return "$string {$this->toString()}"; + } +} \ No newline at end of file diff --git a/tests/bootstrap.php b/tests/bootstrap.php index efe24915..a6ffdc7d 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -12,6 +12,7 @@ require __DIR__.'/../autoload.php'; require __DIR__.'/PHPUnit/ArrayHasSameValuesConstraint.php'; +require __DIR__.'/PHPUnit/RedisCommandConstraint.php'; require __DIR__.'/PHPUnit/CommandTestCase.php'; require __DIR__.'/PHPUnit/ConnectionTestCase.php'; require __DIR__.'/PHPUnit/RedisProfileTestCase.php';