Browse Source

[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.
Daniele Alessandri 11 years ago
parent
commit
d16a1c8705
2 changed files with 98 additions and 0 deletions
  1. 97 0
      tests/PHPUnit/RedisCommandConstraint.php
  2. 1 0
      tests/bootstrap.php

+ 97 - 0
tests/PHPUnit/RedisCommandConstraint.php

@@ -0,0 +1,97 @@
+<?php
+
+/*
+ * This file is part of the Predis package.
+ *
+ * (c) Daniele Alessandri <suppakilla@gmail.com>
+ *
+ * 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()}";
+    }
+}

+ 1 - 0
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/ServerVersionTestCase.php';