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\Appender\SnippetAppender;
14 use Behat\Behat\Snippet\Printer\SnippetPrinter;
17 * Prints or appends snippets to a specific environment using registered appenders and printers.
19 * @author Konstantin Kudryashov <ever.zet@gmail.com>
21 final class SnippetWriter
24 * @var SnippetAppender[]
26 private $appenders = array();
29 * Registers snippet appender.
31 * @param SnippetAppender $appender
33 public function registerSnippetAppender(SnippetAppender $appender)
35 $this->appenders[] = $appender;
39 * Appends snippets to appropriate targets.
41 * @param AggregateSnippet[] $snippets
43 public function appendSnippets(array $snippets)
45 foreach ($snippets as $snippet) {
46 $this->appendSnippet($snippet);
51 * Prints snippets using provided printer.
53 * @param SnippetPrinter $printer
54 * @param AggregateSnippet[] $snippets
56 public function printSnippets(SnippetPrinter $printer, array $snippets)
58 $printableSnippets = array();
59 foreach ($snippets as $snippet) {
60 foreach ($snippet->getTargets() as $target) {
61 $targetSnippets = array();
63 if (isset($printableSnippets[$target])) {
64 $targetSnippets = $printableSnippets[$target];
67 $targetSnippets[] = $snippet;
68 $printableSnippets[$target] = $targetSnippets;
72 foreach ($printableSnippets as $target => $targetSnippets) {
73 $printer->printSnippets($target, $targetSnippets);
78 * Prints undefined steps using provided printer.
80 * @param SnippetPrinter $printer
81 * @param UndefinedStep[] $undefinedSteps
83 public function printUndefinedSteps(SnippetPrinter $printer, array $undefinedSteps)
85 $printableSteps = array();
86 foreach ($undefinedSteps as $undefinedStep) {
87 $suiteName = $undefinedStep->getEnvironment()->getSuite()->getName();
88 $step = $undefinedStep->getStep();
90 if (!isset($printableSteps[$suiteName])) {
91 $printableSteps[$suiteName] = array();
94 $printableSteps[$suiteName][$step->getText()] = $step;
97 foreach ($printableSteps as $suiteName => $steps) {
98 $printer->printUndefinedSteps($suiteName, array_values($steps));
103 * Appends snippet to appropriate targets.
105 * @param AggregateSnippet $snippet
107 private function appendSnippet(AggregateSnippet $snippet)
109 foreach ($this->appenders as $appender) {
110 if (!$appender->supportsSnippet($snippet)) {
114 $appender->appendSnippet($snippet);