Security update for permissions_by_term
[yaffs-website] / vendor / behat / gherkin / src / Behat / Gherkin / Node / ExampleNode.php
diff --git a/vendor/behat/gherkin/src/Behat/Gherkin/Node/ExampleNode.php b/vendor/behat/gherkin/src/Behat/Gherkin/Node/ExampleNode.php
new file mode 100644 (file)
index 0000000..d3366b9
--- /dev/null
@@ -0,0 +1,274 @@
+<?php
+
+/*
+ * This file is part of the Behat Gherkin.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Gherkin\Node;
+
+/**
+ * Represents Gherkin Outline Example.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class ExampleNode implements ScenarioInterface
+{
+    /**
+     * @var string
+     */
+    private $title;
+    /**
+     * @var string[]
+     */
+    private $tags;
+    /**
+     * @var StepNode[]
+     */
+    private $outlineSteps;
+    /**
+     * @var string[]
+     */
+    private $tokens;
+    /**
+     * @var integer
+     */
+    private $line;
+    /**
+     * @var null|StepNode[]
+     */
+    private $steps;
+    /**
+     * @var string
+     */
+    private $outlineTitle;
+
+    /**
+     * Initializes outline.
+     *
+     * @param string      $title
+     * @param string[]    $tags
+     * @param StepNode[]  $outlineSteps
+     * @param string[]    $tokens
+     * @param integer     $line
+     * @param string|null $outlineTitle
+     */
+    public function __construct($title, array $tags, $outlineSteps, array $tokens, $line, $outlineTitle = null)
+    {
+        $this->title = $title;
+        $this->tags = $tags;
+        $this->outlineSteps = $outlineSteps;
+        $this->tokens = $tokens;
+        $this->line = $line;
+        $this->outlineTitle = $outlineTitle;
+    }
+
+    /**
+     * Returns node type string
+     *
+     * @return string
+     */
+    public function getNodeType()
+    {
+        return 'Example';
+    }
+
+    /**
+     * Returns node keyword.
+     *
+     * @return string
+     */
+    public function getKeyword()
+    {
+        return $this->getNodeType();
+    }
+
+    /**
+     * Returns example title.
+     *
+     * @return string
+     */
+    public function getTitle()
+    {
+        return $this->title;
+    }
+
+    /**
+     * Checks if outline is tagged with tag.
+     *
+     * @param string $tag
+     *
+     * @return Boolean
+     */
+    public function hasTag($tag)
+    {
+        return in_array($tag, $this->getTags());
+    }
+
+    /**
+     * Checks if outline has tags (both inherited from feature and own).
+     *
+     * @return Boolean
+     */
+    public function hasTags()
+    {
+        return 0 < count($this->getTags());
+    }
+
+    /**
+     * Returns outline tags (including inherited from feature).
+     *
+     * @return string[]
+     */
+    public function getTags()
+    {
+        return $this->tags;
+    }
+
+    /**
+     * Checks if outline has steps.
+     *
+     * @return Boolean
+     */
+    public function hasSteps()
+    {
+        return 0 < count($this->outlineSteps);
+    }
+
+    /**
+     * Returns outline steps.
+     *
+     * @return StepNode[]
+     */
+    public function getSteps()
+    {
+        return $this->steps = $this->steps ? : $this->createExampleSteps();
+    }
+
+    /**
+     * Returns example tokens.
+     *
+     * @return string[]
+     */
+    public function getTokens()
+    {
+        return $this->tokens;
+    }
+
+    /**
+     * Returns outline declaration line number.
+     *
+     * @return integer
+     */
+    public function getLine()
+    {
+        return $this->line;
+    }
+
+    /**
+     * Returns outline title.
+     *
+     * @return string
+     */
+    public function getOutlineTitle()
+    {
+        return $this->outlineTitle;
+    }
+
+    /**
+     * Creates steps for this example from abstract outline steps.
+     *
+     * @return StepNode[]
+     */
+    protected function createExampleSteps()
+    {
+        $steps = array();
+        foreach ($this->outlineSteps as $outlineStep) {
+            $keyword = $outlineStep->getKeyword();
+            $keywordType = $outlineStep->getKeywordType();
+            $text = $this->replaceTextTokens($outlineStep->getText());
+            $args = $this->replaceArgumentsTokens($outlineStep->getArguments());
+            $line = $outlineStep->getLine();
+
+            $steps[] = new StepNode($keyword, $text, $args, $line, $keywordType);
+        }
+
+        return $steps;
+    }
+
+    /**
+     * Replaces tokens in arguments with row values.
+     *
+     * @param ArgumentInterface[] $arguments
+     *
+     * @return ArgumentInterface[]
+     */
+    protected function replaceArgumentsTokens(array $arguments)
+    {
+        foreach ($arguments as $num => $argument) {
+            if ($argument instanceof TableNode) {
+                $arguments[$num] = $this->replaceTableArgumentTokens($argument);
+            }
+            if ($argument instanceof PyStringNode) {
+                $arguments[$num] = $this->replacePyStringArgumentTokens($argument);
+            }
+        }
+
+        return $arguments;
+    }
+
+    /**
+     * Replaces tokens in table with row values.
+     *
+     * @param TableNode $argument
+     *
+     * @return TableNode
+     */
+    protected function replaceTableArgumentTokens(TableNode $argument)
+    {
+        $table = $argument->getTable();
+        foreach ($table as $line => $row) {
+            foreach (array_keys($row) as $col) {
+                $table[$line][$col] = $this->replaceTextTokens($table[$line][$col]);
+            }
+        }
+
+        return new TableNode($table);
+    }
+
+    /**
+     * Replaces tokens in PyString with row values.
+     *
+     * @param PyStringNode $argument
+     *
+     * @return PyStringNode
+     */
+    protected function replacePyStringArgumentTokens(PyStringNode $argument)
+    {
+        $strings = $argument->getStrings();
+        foreach ($strings as $line => $string) {
+            $strings[$line] = $this->replaceTextTokens($strings[$line]);
+        }
+
+        return new PyStringNode($strings, $argument->getLine());
+    }
+
+    /**
+     * Replaces tokens in text with row values.
+     *
+     * @param string $text
+     *
+     * @return string
+     */
+    protected function replaceTextTokens($text)
+    {
+        foreach ($this->tokens as $key => $val) {
+            $text = str_replace('<' . $key . '>', $val, $text);
+        }
+
+        return $text;
+    }
+}