Permalink
Browse files

Add missing logical XOR.

  • Loading branch information...
sebastianbergmann committed Nov 15, 2006
1 parent e9c0f9e commit e4a7afb4328a5daf80e6c2939c14a7e018a4fe96
Showing with 179 additions and 0 deletions.
  1. +18 −0 PHPUnit/Framework/Assert.php
  2. +1 −0 PHPUnit/Framework/Constraint.php
  3. +157 −0 PHPUnit/Framework/Constraint/Xor.php
  4. +3 −0 package.xml
@@ -744,6 +744,24 @@ public static function logicalNot(PHPUnit_Framework_Constraint $constraint)
return new PHPUnit_Framework_Constraint_Not($constraint);
}
+ /**
+ * Logical XOR.
+ *
+ * @return PHPUnit_Framework_Constraint_Xor
+ * @access public
+ * @since Method available since Release 3.0.0
+ * @static
+ */
+ public static function logicalXor()
+ {
+ $constraints = func_get_args();
+
+ $constraint = new PHPUnit_Framework_Constraint_Xor;
+ $constraint->setConstraints($constraints);
+
+ return $constraint;
+ }
+
/**
*
*
@@ -155,4 +155,5 @@ public static function negate($string)
require_once 'PHPUnit/Framework/Constraint/PCREMatch.php';
require_once 'PHPUnit/Framework/Constraint/StringContains.php';
require_once 'PHPUnit/Framework/Constraint/TraversableContains.php';
+require_once 'PHPUnit/Framework/Constraint/Xor.php';
?>
@@ -0,0 +1,157 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2006, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Jan Borsodi <jb@ez.no>
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id$
+ * @link http://www.phpunit.de/
+ * @since File available since Release 3.0.0
+ */
+
+require_once 'PHPUnit/Framework.php';
+require_once 'PHPUnit/Util/Filter.php';
+require_once 'PHPUnit/Util/Type.php';
+
+PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
+
+/**
+ * Constraint which will only evaluate to true if only one of the sub-constraints does the same.
+ *
+ * This means the constraint behaves like a logical xor. All parameters passed
+ * to the constructor will be considered a constraint to check.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Jan Borsodi <jb@ez.no>
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://www.phpunit.de/
+ * @since Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_Xor extends PHPUnit_Framework_Constraint
+{
+ private $constraints = array();
+
+ public function setConstraints(array $constraints)
+ {
+ $this->constraints = array();
+
+ foreach($constraints as $key => $constraint) {
+ if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
+ $constraint = new PHPUnit_Framework_Constraint_IsEqual($constraint);
+ }
+
+ $this->constraints[] = $constraint;
+ }
+ }
+
+ /**
+ * Evaluates the constraint for parameter $other. Returns TRUE if the
+ * constraint is met, FALSE otherwise.
+ *
+ * @param mixed $other Value or object to evaluate.
+ * @return bool
+ */
+ public function evaluate($other)
+ {
+ $result = FALSE;
+
+ foreach($this->constraints as $constraint) {
+ if ($constraint->evaluate($other)) {
+ if ( $result )
+ {
+ return FALSE;
+ }
+
+ $result = TRUE;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param mixed $other The value passed to evaluate() which failed the
+ * constraint check.
+ * @param string $description A string with extra description of what was
+ * going on while the evaluation failed.
+ * @param boolean $not Flag to indicate negation.
+ * @throws PHPUnit_Framework_ExpectationFailedException
+ */
+ public function fail($other, $description, $not = FALSE)
+ {
+ if (!empty($description)) {
+ $description .= "\n";
+ }
+
+ throw new PHPUnit_Framework_ExpectationFailedException(
+ sprintf(
+ '%sFailed asserting that %s.',
+
+ $description,
+ $this->toString()
+ )
+ );
+ }
+
+ /**
+ * Returns a string representation of the constraint.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString()
+ {
+ $text = '';
+
+ foreach($this->constraints as $key => $constraint) {
+ if ($key > 0) {
+ $text .= ' xor ';
+ }
+
+ $text .= $constraint->toString();
+ }
+
+ return $text;
+ }
+}
+?>
View
@@ -121,6 +121,9 @@
<file baseinstalldir="/" name="TraversableContains.php" role="php">
<tasks:replace from="@package_version@" to="version" type="package-info" />
</file>
+ <file baseinstalldir="/" name="Xor.php" role="php">
+ <tasks:replace from="@package_version@" to="version" type="package-info" />
+ </file>
</dir>
<dir name="MockObject">
<dir name="Builder">

0 comments on commit e4a7afb

Please sign in to comment.