Files
socialhose-php/behat/Common/Util/Matcher/Expander/FieldExpander.php
T
2022-12-09 08:36:26 -06:00

89 lines
2.4 KiB
PHP

<?php
namespace Common\Util\Matcher\Expander;
use Coduo\PHPMatcher\Matcher\Pattern\PatternExpander;
/**
* Class FieldExpander
* Check that expanded object or array has specific field which matched
* given matcher expander.
*
* Example:
* - .field('username', contains('admin'))
* - .field('user', entity('AppBundle:User', 'user'), field('id', 1))
*
* @package Common\Util\Matcher\Expander
*/
class FieldExpander extends AbstractExpander
{
/**
* @var string
*/
private $fieldName;
/**
* @var mixed|PatternExpander[]
*/
private $expander;
/**
* @param string $fieldName Field name.
* @param mixed|PatternExpander $expander A PatternExpander instance.
* @param PatternExpander $expander,... A PatternExpander's instances.
*/
public function __construct($fieldName, $expander)
{
$this->fieldName = $fieldName;
$this->expander = $expander;
if ($expander instanceof PatternExpander) {
$expander = func_get_args();
$length = count($expander);
// Process all except first argument which contains field name.
$this->expander = [];
for ($i = 1; $i < $length; ++$i) {
if (!$expander[$i] instanceof PatternExpander) {
throw new \InvalidArgumentException('Has invalid expander.');
}
$this->expander[] = $expander[$i];
}
}
}
/**
* @param mixed $value Value to match.
*
* @return boolean
*/
public function match($value)
{
if (! is_array($value) && !isset($value[$this->fieldName])) {
return false;
}
if (is_array($this->expander)) {
// Match all expanders.
foreach ($this->expander as $expander) {
if (! $expander->match($value[$this->fieldName])) {
$this->error = "Field {$this->fieldName}: expander don't matches value. ".
$expander->getError();
return false;
}
}
// All expanders successfully matches.
return true;
}
if ($value[$this->fieldName] !== $this->expander) {
$this->error = "Field {$this->fieldName}: don't equal to {$this->expander}";
return false;
}
return true;
}
}