Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Behat / Snippet / SnippetRegistry.php
1 <?php
2
3 /*
4  * This file is part of the Behat.
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\Behat\Snippet;
12
13 use Behat\Behat\Snippet\Generator\SnippetGenerator;
14 use Behat\Gherkin\Node\StepNode;
15 use Behat\Testwork\Environment\Environment;
16
17 /**
18  * Acts like a snippet repository by producing snippets from registered undefined steps using snippet generators.
19  *
20  * @author Konstantin Kudryashov <ever.zet@gmail.com>
21  */
22 final class SnippetRegistry implements SnippetRepository
23 {
24     /**
25      * @var SnippetGenerator[]
26      */
27     private $generators = array();
28     /**
29      * @var UndefinedStep[]
30      */
31     private $undefinedSteps = array();
32     /**
33      * @var AggregateSnippet[]
34      */
35     private $snippets = array();
36     /**
37      * @var Boolean
38      */
39     private $snippetsGenerated = false;
40
41     /**
42      * Registers snippet generator.
43      *
44      * @param SnippetGenerator $generator
45      */
46     public function registerSnippetGenerator(SnippetGenerator $generator)
47     {
48         $this->generators[] = $generator;
49         $this->snippetsGenerated = false;
50     }
51
52     /**
53      * Generates and registers snippet.
54      *
55      * @param Environment $environment
56      * @param StepNode    $step
57      *
58      * @return null|Snippet
59      */
60     public function registerUndefinedStep(Environment $environment, StepNode $step)
61     {
62         $this->undefinedSteps[] = new UndefinedStep($environment, $step);
63         $this->snippetsGenerated = false;
64     }
65
66     /**
67      * Returns all generated snippets.
68      *
69      * @return AggregateSnippet[]
70      */
71     public function getSnippets()
72     {
73         $this->generateSnippets();
74
75         return $this->snippets;
76     }
77
78     /**
79      * Returns steps for which there was no snippet generated.
80      *
81      * @return UndefinedStep[]
82      */
83     public function getUndefinedSteps()
84     {
85         $this->generateSnippets();
86
87         return $this->undefinedSteps;
88     }
89
90     /**
91      * Generates snippets for undefined steps.
92      */
93     private function generateSnippets()
94     {
95         if ($this->snippetsGenerated) {
96             return null;
97         }
98
99         $snippetsSet = array();
100         foreach ($this->undefinedSteps as $i => $undefinedStep) {
101             $snippet = $this->generateSnippet($undefinedStep->getEnvironment(), $undefinedStep->getStep());
102
103             if (!$snippet) {
104                 continue;
105             }
106
107             if (!isset($snippetsSet[$snippet->getHash()])) {
108                 $snippetsSet[$snippet->getHash()] = array();
109             }
110
111             $snippetsSet[$snippet->getHash()][] = $snippet;
112             unset($this->undefinedSteps[$i]);
113         }
114
115         $this->snippets = array_values(
116             array_map(
117                 function (array $snippets) {
118                     return new AggregateSnippet($snippets);
119                 },
120                 $snippetsSet
121             )
122         );
123         $this->undefinedSteps = array_values($this->undefinedSteps);
124         $this->snippetsGenerated = true;
125     }
126
127     /**
128      * @param Environment $environment
129      * @param StepNode    $step
130      *
131      * @return null|Snippet
132      */
133     private function generateSnippet(Environment $environment, StepNode $step)
134     {
135         foreach ($this->generators as $generator) {
136             if ($generator->supportsEnvironmentAndStep($environment, $step)) {
137                 return $generator->generateSnippet($environment, $step);
138             }
139         }
140
141         return null;
142     }
143 }