File: //usr/local/wp/vendor/behat/behat/src/Behat/Behat/Gherkin/Specification/LazyFeatureIterator.php
<?php
/*
* This file is part of the Behat.
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Behat\Behat\Gherkin\Specification;
use Behat\Gherkin\Filter\FilterInterface;
use Behat\Gherkin\Filter\NameFilter;
use Behat\Gherkin\Filter\NarrativeFilter;
use Behat\Gherkin\Filter\RoleFilter;
use Behat\Gherkin\Filter\TagFilter;
use Behat\Gherkin\Gherkin;
use Behat\Gherkin\Node\FeatureNode;
use Behat\Testwork\Specification\SpecificationIterator;
use Behat\Testwork\Suite\Exception\SuiteConfigurationException;
use Behat\Testwork\Suite\Suite;
/**
* Lazily iterates (parses one-by-one) over features.
*
* @author Konstantin Kudryashov <ever.zet@gmail.com>
*/
final class LazyFeatureIterator implements SpecificationIterator
{
/**
* @var Suite
*/
private $suite;
/**
* @var Gherkin
*/
private $gherkin;
/**
* @var string[]
*/
private $paths = array();
/**
* @var FilterInterface[]
*/
private $filters = array();
/**
* @var integer
*/
private $position = 0;
/**
* @var FeatureNode[]
*/
private $features = array();
/**
* @var FeatureNode
*/
private $currentFeature;
/**
* Initializes specifications.
*
* @param Suite $suite
* @param Gherkin $gherkin
* @param string[] $paths
* @param FilterInterface[] $filters
*/
public function __construct(Suite $suite, Gherkin $gherkin, array $paths, array $filters = array())
{
$this->suite = $suite;
$this->gherkin = $gherkin;
$this->paths = array_values($paths);
$this->filters = array_merge($this->getSuiteFilters($suite), $filters);
}
/**
* {@inheritdoc}
*/
public function getSuite()
{
return $this->suite;
}
/**
* {@inheritdoc}
*/
public function rewind()
{
$this->position = 0;
$this->moveToNextAvailableFeature();
}
/**
* {@inheritdoc}
*/
public function next()
{
$this->moveToNextAvailableFeature();
}
/**
* {@inheritdoc}
*/
public function valid()
{
return null !== $this->currentFeature;
}
/**
* {@inheritdoc}
*/
public function key()
{
return $this->position;
}
/**
* {@inheritdoc}
*/
public function current()
{
return $this->currentFeature;
}
/**
* Returns list of filters from suite settings.
*
* @param Suite $suite
*
* @return FilterInterface[]
*/
private function getSuiteFilters(Suite $suite)
{
if (!$suite->hasSetting('filters') || !is_array($suite->getSetting('filters'))) {
return array();
}
$filters = array();
foreach ($suite->getSetting('filters') as $type => $filterString) {
$filters[] = $this->createFilter($type, $filterString, $suite);
}
return $filters;
}
/**
* Creates filter of provided type.
*
* @param string $type
* @param string $filterString
* @param Suite $suite
*
* @return FilterInterface
*
* @throws SuiteConfigurationException If filter type is not recognised
*/
private function createFilter($type, $filterString, Suite $suite)
{
if ('role' === $type) {
return new RoleFilter($filterString);
}
if ('name' === $type) {
return new NameFilter($filterString);
}
if ('tags' === $type) {
return new TagFilter($filterString);
}
if ('narrative' === $type) {
return new NarrativeFilter($filterString);
}
throw new SuiteConfigurationException(sprintf(
'`%s` filter is not supported by the `%s` suite. Supported types are `%s`.',
$type,
$suite->getName(),
implode('`, `', array('role', 'name', 'tags'))
), $suite->getName());
}
/**
* Parses paths consequently.
*/
private function moveToNextAvailableFeature()
{
while (!count($this->features) && $this->position < count($this->paths)) {
$this->features = $this->parseFeature($this->paths[$this->position]);
$this->position++;
}
$this->currentFeature = array_shift($this->features);
}
/**
* Parses feature at path.
*
* @param string $path
*
* @return FeatureNode[]
*/
private function parseFeature($path)
{
return $this->gherkin->load($path, $this->filters);
}
}