Security update for permissions_by_term
[yaffs-website] / vendor / behat / gherkin / src / Behat / Gherkin / Keywords / KeywordsDumper.php
diff --git a/vendor/behat/gherkin/src/Behat/Gherkin/Keywords/KeywordsDumper.php b/vendor/behat/gherkin/src/Behat/Gherkin/Keywords/KeywordsDumper.php
new file mode 100644 (file)
index 0000000..fcd9769
--- /dev/null
@@ -0,0 +1,365 @@
+<?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\Keywords;
+
+/**
+ * Gherkin keywords dumper.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class KeywordsDumper
+{
+    private $keywords;
+    private $keywordsDumper;
+
+    /**
+     * Initializes dumper.
+     *
+     * @param KeywordsInterface $keywords Keywords instance
+     */
+    public function __construct(KeywordsInterface $keywords)
+    {
+        $this->keywords = $keywords;
+        $this->keywordsDumper = array($this, 'dumpKeywords');
+    }
+
+    /**
+     * Sets keywords mapper function.
+     *
+     * Callable should accept 2 arguments (array $keywords and Boolean $isShort)
+     *
+     * @param callable $mapper Mapper function
+     */
+    public function setKeywordsDumperFunction($mapper)
+    {
+        $this->keywordsDumper = $mapper;
+    }
+
+    /**
+     * Defaults keywords dumper.
+     *
+     * @param array   $keywords Keywords list
+     * @param Boolean $isShort  Is short version
+     *
+     * @return string
+     */
+    public function dumpKeywords(array $keywords, $isShort)
+    {
+        if ($isShort) {
+            return 1 < count($keywords) ? '(' . implode('|', $keywords) . ')' : $keywords[0];
+        }
+
+        return $keywords[0];
+    }
+
+    /**
+     * Dumps keyworded feature into string.
+     *
+     * @param string  $language Keywords language
+     * @param Boolean $short    Dump short version
+     * @param bool    $excludeAsterisk
+     *
+     * @return string|array String for short version and array of features for extended
+     */
+    public function dump($language, $short = true, $excludeAsterisk = false)
+    {
+        $this->keywords->setLanguage($language);
+        $languageComment = '';
+        if ('en' !== $language) {
+            $languageComment = "# language: $language\n";
+        }
+
+        $keywords = explode('|', $this->keywords->getFeatureKeywords());
+
+        if ($short) {
+            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
+
+            return trim($languageComment . $this->dumpFeature($keywords, $short, $excludeAsterisk));
+        }
+
+        $features = array();
+        foreach ($keywords as $keyword) {
+            $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
+            $features[] = trim($languageComment . $this->dumpFeature($keyword, $short, $excludeAsterisk));
+        }
+
+        return $features;
+    }
+
+    /**
+     * Dumps feature example.
+     *
+     * @param string  $keyword Item keyword
+     * @param Boolean $short   Dump short version?
+     *
+     * @return string
+     */
+    protected function dumpFeature($keyword, $short = true, $excludeAsterisk = false)
+    {
+        $dump = <<<GHERKIN
+{$keyword}: Internal operations
+  In order to stay secret
+  As a secret organization
+  We need to be able to erase past agents' memory
+
+
+GHERKIN;
+
+        // Background
+        $keywords = explode('|', $this->keywords->getBackgroundKeywords());
+        if ($short) {
+            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
+            $dump .= $this->dumpBackground($keywords, $short, $excludeAsterisk);
+        } else {
+            $keyword = call_user_func($this->keywordsDumper, array($keywords[0]), $short);
+            $dump .= $this->dumpBackground($keyword, $short, $excludeAsterisk);
+        }
+
+        // Scenario
+        $keywords = explode('|', $this->keywords->getScenarioKeywords());
+        if ($short) {
+            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
+            $dump .= $this->dumpScenario($keywords, $short, $excludeAsterisk);
+        } else {
+            foreach ($keywords as $keyword) {
+                $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
+                $dump .= $this->dumpScenario($keyword, $short, $excludeAsterisk);
+            }
+        }
+
+        // Outline
+        $keywords = explode('|', $this->keywords->getOutlineKeywords());
+        if ($short) {
+            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
+            $dump .= $this->dumpOutline($keywords, $short, $excludeAsterisk);
+        } else {
+            foreach ($keywords as $keyword) {
+                $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
+                $dump .= $this->dumpOutline($keyword, $short, $excludeAsterisk);
+            }
+        }
+
+        return $dump;
+    }
+
+    /**
+     * Dumps background example.
+     *
+     * @param string  $keyword Item keyword
+     * @param Boolean $short   Dump short version?
+     *
+     * @return string
+     */
+    protected function dumpBackground($keyword, $short = true, $excludeAsterisk = false)
+    {
+        $dump = <<<GHERKIN
+  {$keyword}:
+
+GHERKIN;
+
+        // Given
+        $dump .= $this->dumpStep(
+            $this->keywords->getGivenKeywords(),
+            'there is agent A',
+            $short,
+            $excludeAsterisk
+        );
+
+        // And
+        $dump .= $this->dumpStep(
+            $this->keywords->getAndKeywords(),
+            'there is agent B',
+            $short,
+            $excludeAsterisk
+        );
+
+        return $dump . "\n";
+    }
+
+    /**
+     * Dumps scenario example.
+     *
+     * @param string  $keyword Item keyword
+     * @param Boolean $short   Dump short version?
+     *
+     * @return string
+     */
+    protected function dumpScenario($keyword, $short = true, $excludeAsterisk = false)
+    {
+        $dump = <<<GHERKIN
+  {$keyword}: Erasing agent memory
+
+GHERKIN;
+
+        // Given
+        $dump .= $this->dumpStep(
+            $this->keywords->getGivenKeywords(),
+            'there is agent J',
+            $short,
+            $excludeAsterisk
+        );
+
+        // And
+        $dump .= $this->dumpStep(
+            $this->keywords->getAndKeywords(),
+            'there is agent K',
+            $short,
+            $excludeAsterisk
+        );
+
+        // When
+        $dump .= $this->dumpStep(
+            $this->keywords->getWhenKeywords(),
+            'I erase agent K\'s memory',
+            $short,
+            $excludeAsterisk
+        );
+
+        // Then
+        $dump .= $this->dumpStep(
+            $this->keywords->getThenKeywords(),
+            'there should be agent J',
+            $short,
+            $excludeAsterisk
+        );
+
+        // But
+        $dump .= $this->dumpStep(
+            $this->keywords->getButKeywords(),
+            'there should not be agent K',
+            $short,
+            $excludeAsterisk
+        );
+
+        return $dump . "\n";
+    }
+
+    /**
+     * Dumps outline example.
+     *
+     * @param string  $keyword Item keyword
+     * @param Boolean $short   Dump short version?
+     *
+     * @return string
+     */
+    protected function dumpOutline($keyword, $short = true, $excludeAsterisk = false)
+    {
+        $dump = <<<GHERKIN
+  {$keyword}: Erasing other agents' memory
+
+GHERKIN;
+
+        // Given
+        $dump .= $this->dumpStep(
+            $this->keywords->getGivenKeywords(),
+            'there is agent <agent1>',
+            $short,
+            $excludeAsterisk
+        );
+
+        // And
+        $dump .= $this->dumpStep(
+            $this->keywords->getAndKeywords(),
+            'there is agent <agent2>',
+            $short,
+            $excludeAsterisk
+        );
+
+        // When
+        $dump .= $this->dumpStep(
+            $this->keywords->getWhenKeywords(),
+            'I erase agent <agent2>\'s memory',
+            $short,
+            $excludeAsterisk
+        );
+
+        // Then
+        $dump .= $this->dumpStep(
+            $this->keywords->getThenKeywords(),
+            'there should be agent <agent1>',
+            $short,
+            $excludeAsterisk
+        );
+
+        // But
+        $dump .= $this->dumpStep(
+            $this->keywords->getButKeywords(),
+            'there should not be agent <agent2>',
+            $short,
+            $excludeAsterisk
+        );
+
+        $keywords = explode('|', $this->keywords->getExamplesKeywords());
+        if ($short) {
+            $keyword = call_user_func($this->keywordsDumper, $keywords, $short);
+        } else {
+            $keyword = call_user_func($this->keywordsDumper, array($keywords[0]), $short);
+        }
+
+        $dump .= <<<GHERKIN
+
+    {$keyword}:
+      | agent1 | agent2 |
+      | D      | M      |
+
+GHERKIN;
+
+        return $dump . "\n";
+    }
+
+    /**
+     * Dumps step example.
+     *
+     * @param string  $keywords Item keyword
+     * @param string  $text     Step text
+     * @param Boolean $short    Dump short version?
+     *
+     * @return string
+     */
+    protected function dumpStep($keywords, $text, $short = true, $excludeAsterisk = false)
+    {
+        $dump = '';
+
+        $keywords = explode('|', $keywords);
+        if ($short) {
+            $keywords = array_map(
+                function ($keyword) {
+                    return str_replace('<', '', $keyword);
+                },
+                $keywords
+            );
+            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
+            $dump .= <<<GHERKIN
+    {$keywords} {$text}
+
+GHERKIN;
+        } else {
+            foreach ($keywords as $keyword) {
+                if ($excludeAsterisk && '*' === $keyword) {
+                    continue;
+                }
+
+                $indent = ' ';
+                if (false !== mb_strpos($keyword, '<', 0, 'utf8')) {
+                    $keyword = mb_substr($keyword, 0, -1, 'utf8');
+                    $indent = '';
+                }
+                $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
+                $dump .= <<<GHERKIN
+    {$keyword}{$indent}{$text}
+
+GHERKIN;
+            }
+        }
+
+        return $dump;
+    }
+}