4 * This file is part of the Behat.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Behat\Snippet;
13 use Behat\Behat\Snippet\Generator\SnippetGenerator;
14 use Behat\Gherkin\Node\StepNode;
15 use Behat\Testwork\Environment\Environment;
18 * Acts like a snippet repository by producing snippets from registered undefined steps using snippet generators.
20 * @author Konstantin Kudryashov <ever.zet@gmail.com>
22 final class SnippetRegistry implements SnippetRepository
25 * @var SnippetGenerator[]
27 private $generators = array();
29 * @var UndefinedStep[]
31 private $undefinedSteps = array();
33 * @var AggregateSnippet[]
35 private $snippets = array();
39 private $snippetsGenerated = false;
42 * Registers snippet generator.
44 * @param SnippetGenerator $generator
46 public function registerSnippetGenerator(SnippetGenerator $generator)
48 $this->generators[] = $generator;
49 $this->snippetsGenerated = false;
53 * Generates and registers snippet.
55 * @param Environment $environment
56 * @param StepNode $step
58 * @return null|Snippet
60 public function registerUndefinedStep(Environment $environment, StepNode $step)
62 $this->undefinedSteps[] = new UndefinedStep($environment, $step);
63 $this->snippetsGenerated = false;
67 * Returns all generated snippets.
69 * @return AggregateSnippet[]
71 public function getSnippets()
73 $this->generateSnippets();
75 return $this->snippets;
79 * Returns steps for which there was no snippet generated.
81 * @return UndefinedStep[]
83 public function getUndefinedSteps()
85 $this->generateSnippets();
87 return $this->undefinedSteps;
91 * Generates snippets for undefined steps.
93 private function generateSnippets()
95 if ($this->snippetsGenerated) {
99 $snippetsSet = array();
100 foreach ($this->undefinedSteps as $i => $undefinedStep) {
101 $snippet = $this->generateSnippet($undefinedStep->getEnvironment(), $undefinedStep->getStep());
107 if (!isset($snippetsSet[$snippet->getHash()])) {
108 $snippetsSet[$snippet->getHash()] = array();
111 $snippetsSet[$snippet->getHash()][] = $snippet;
112 unset($this->undefinedSteps[$i]);
115 $this->snippets = array_values(
117 function (array $snippets) {
118 return new AggregateSnippet($snippets);
123 $this->undefinedSteps = array_values($this->undefinedSteps);
124 $this->snippetsGenerated = true;
128 * @param Environment $environment
129 * @param StepNode $step
131 * @return null|Snippet
133 private function generateSnippet(Environment $environment, StepNode $step)
135 foreach ($this->generators as $generator) {
136 if ($generator->supportsEnvironmentAndStep($environment, $step)) {
137 return $generator->generateSnippet($environment, $step);