Viewing file: BinaryOperator.php (3.63 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php declare(strict_types=1); /* * This file is part of PHPUnit. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\Constraint;
use function array_map; use function array_values; use function count;
/** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ abstract class BinaryOperator extends Operator { /** * @var Constraint[] */ private $constraints = [];
public static function fromConstraints(Constraint ...$constraints): self { $constraint = new static;
$constraint->constraints = $constraints;
return $constraint; }
/** * @param mixed[] $constraints */ public function setConstraints(array $constraints): void { $this->constraints = array_map(function ($constraint): Constraint { return $this->checkConstraint($constraint); }, array_values($constraints)); }
/** * Returns the number of operands (constraints). */ final public function arity(): int { return count($this->constraints); }
/** * Returns a string representation of the constraint. */ public function toString(): string { $reduced = $this->reduce();
if ($reduced !== $this) { return $reduced->toString(); }
$text = '';
foreach ($this->constraints as $key => $constraint) { $constraint = $constraint->reduce();
$text .= $this->constraintToString($constraint, $key); }
return $text; }
/** * Counts the number of constraint elements. */ public function count(): int { $count = 0;
foreach ($this->constraints as $constraint) { $count += count($constraint); }
return $count; }
/** * Returns the nested constraints. */ final protected function constraints(): array { return $this->constraints; }
/** * Returns true if the $constraint needs to be wrapped with braces. */ final protected function constraintNeedsParentheses(Constraint $constraint): bool { return $this->arity() > 1 && parent::constraintNeedsParentheses($constraint); }
/** * Reduces the sub-expression starting at $this by skipping degenerate * sub-expression and returns first descendant constraint that starts * a non-reducible sub-expression. * * See Constraint::reduce() for more. */ protected function reduce(): Constraint { if ($this->arity() === 1 && $this->constraints[0] instanceof Operator) { return $this->constraints[0]->reduce(); }
return parent::reduce(); }
/** * Returns string representation of given operand in context of this operator. * * @param Constraint $constraint operand constraint * @param int $position position of $constraint in this expression */ private function constraintToString(Constraint $constraint, int $position): string { $prefix = '';
if ($position > 0) { $prefix = (' ' . $this->operator() . ' '); }
if ($this->constraintNeedsParentheses($constraint)) { return $prefix . '( ' . $constraint->toString() . ' )'; }
$string = $constraint->toStringInContext($this, $position);
if ($string === '') { $string = $constraint->toString(); }
return $prefix . $string; } }
|