bac556d05f46df138efd43810feed38a95e53165
[yaffs-website] / vendor / behat / behat / src / Behat / Testwork / Specification / GroupedSpecificationIterator.php
1 <?php
2
3 /*
4  * This file is part of the Behat Testwork.
5  * (c) Konstantin Kudryashov <ever.zet@gmail.com>
6  *
7  * For the full copyright and license information, please view the LICENSE
8  * file that was distributed with this source code.
9  */
10
11 namespace Behat\Testwork\Specification;
12
13 use Behat\Testwork\Suite\Suite;
14
15 /**
16  * Iterates over specification iterators grouped by their suite.
17  *
18  * @author Konstantin Kudryashov <ever.zet@gmail.com>
19  */
20 final class GroupedSpecificationIterator implements SpecificationIterator
21 {
22     /**
23      * @var Suite
24      */
25     private $suite;
26     /**
27      * @var SpecificationIterator[]
28      */
29     private $iterators;
30     /**
31      * @var integer
32      */
33     private $position = 0;
34
35     /**
36      * Initializes iterator.
37      *
38      * @param Suite                   $suite
39      * @param SpecificationIterator[] $specificationIterators
40      */
41     public function __construct(Suite $suite, array $specificationIterators)
42     {
43         $this->suite = $suite;
44         $this->iterators = $specificationIterators;
45     }
46
47     /**
48      * Groups specifications by their suite.
49      *
50      * @param SpecificationIterator[] $specificationIterators
51      *
52      * @return GroupedSpecificationIterator[]
53      */
54     public static function group(array $specificationIterators)
55     {
56         $groupedSpecifications = array();
57         foreach ($specificationIterators as $specificationIterator) {
58             $groupedSpecifications[$specificationIterator->getSuite()->getName()][] = $specificationIterator;
59         }
60
61         return array_map(
62             function ($iterator) {
63                 return new GroupedSpecificationIterator($iterator[0]->getSuite(), $iterator);
64             },
65             $groupedSpecifications
66         );
67     }
68
69     /**
70      * {@inheritdoc}
71      */
72     public function getSuite()
73     {
74         return $this->suite;
75     }
76
77     /**
78      * {@inheritdoc}
79      */
80     public function rewind()
81     {
82         $this->position = 0;
83         while (isset($this->iterators[$this->position])) {
84             $this->iterators[$this->position]->rewind();
85
86             if ($this->iterators[$this->position]->valid()) {
87                 break;
88             }
89             $this->position++;
90         }
91     }
92
93     /**
94      * {@inheritdoc}
95      */
96     public function next()
97     {
98         if (!isset($this->iterators[$this->position])) {
99             return;
100         }
101
102         $this->iterators[$this->position]->next();
103         while (!$this->iterators[$this->position]->valid()) {
104             $this->position++;
105
106             if (!isset($this->iterators[$this->position])) {
107                 break;
108             }
109
110             $this->iterators[$this->position]->rewind();
111         }
112     }
113
114     /**
115      * {@inheritdoc}
116      */
117     public function valid()
118     {
119         return isset($this->iterators[$this->position]) && $this->iterators[$this->position]->valid();
120     }
121
122     /**
123      * {@inheritdoc}
124      */
125     public function current()
126     {
127         return $this->iterators[$this->position]->current();
128     }
129
130     /**
131      * {@inheritdoc}
132      */
133     public function key()
134     {
135         return $this->position + $this->iterators[$this->position]->key();
136     }
137 }