* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Testwork\Specification; use Behat\Testwork\Suite\Suite; /** * Iterates over specification iterators grouped by their suite. * * @author Konstantin Kudryashov */ final class GroupedSpecificationIterator implements SpecificationIterator { /** * @var Suite */ private $suite; /** * @var SpecificationIterator[] */ private $iterators; /** * @var integer */ private $position = 0; /** * Initializes iterator. * * @param Suite $suite * @param SpecificationIterator[] $specificationIterators */ public function __construct(Suite $suite, array $specificationIterators) { $this->suite = $suite; $this->iterators = $specificationIterators; } /** * Groups specifications by their suite. * * @param SpecificationIterator[] $specificationIterators * * @return GroupedSpecificationIterator[] */ public static function group(array $specificationIterators) { $groupedSpecifications = array(); foreach ($specificationIterators as $specificationIterator) { $groupedSpecifications[$specificationIterator->getSuite()->getName()][] = $specificationIterator; } return array_map( function ($iterator) { return new GroupedSpecificationIterator($iterator[0]->getSuite(), $iterator); }, $groupedSpecifications ); } /** * {@inheritdoc} */ public function getSuite() { return $this->suite; } /** * {@inheritdoc} */ public function rewind() { $this->position = 0; while (isset($this->iterators[$this->position])) { $this->iterators[$this->position]->rewind(); if ($this->iterators[$this->position]->valid()) { break; } $this->position++; } } /** * {@inheritdoc} */ public function next() { if (!isset($this->iterators[$this->position])) { return; } $this->iterators[$this->position]->next(); while (!$this->iterators[$this->position]->valid()) { $this->position++; if (!isset($this->iterators[$this->position])) { break; } $this->iterators[$this->position]->rewind(); } } /** * {@inheritdoc} */ public function valid() { return isset($this->iterators[$this->position]) && $this->iterators[$this->position]->valid(); } /** * {@inheritdoc} */ public function current() { return $this->iterators[$this->position]->current(); } /** * {@inheritdoc} */ public function key() { return $this->position + $this->iterators[$this->position]->key(); } }