Security update for permissions_by_term
[yaffs-website] / vendor / behat / gherkin / tests / Behat / Gherkin / Keywords / KeywordsTest.php
diff --git a/vendor/behat/gherkin/tests/Behat/Gherkin/Keywords/KeywordsTest.php b/vendor/behat/gherkin/tests/Behat/Gherkin/Keywords/KeywordsTest.php
new file mode 100644 (file)
index 0000000..fdfc65e
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+namespace Tests\Behat\Gherkin\Keywords;
+
+use Behat\Gherkin\Keywords\KeywordsDumper;
+use Behat\Gherkin\Lexer;
+use Behat\Gherkin\Node\BackgroundNode;
+use Behat\Gherkin\Node\ExampleTableNode;
+use Behat\Gherkin\Node\FeatureNode;
+use Behat\Gherkin\Node\OutlineNode;
+use Behat\Gherkin\Node\ScenarioNode;
+use Behat\Gherkin\Parser;
+
+abstract class KeywordsTest extends \PHPUnit_Framework_TestCase
+{
+    abstract protected function getKeywords();
+    abstract protected function getKeywordsArray();
+    abstract protected function getSteps($keywords, $text, &$line, $keywordType);
+
+    public function translationTestDataProvider()
+    {
+        $keywords = $this->getKeywords();
+        $lexer = new Lexer($keywords);
+        $parser = new Parser($lexer);
+        $dumper = new KeywordsDumper($keywords);
+        $keywordsArray = $this->getKeywordsArray();
+
+        // Remove languages with repeated keywords
+        unset($keywordsArray['en-old'], $keywordsArray['uz']);
+
+        $data = array();
+        foreach ($keywordsArray as $lang => $i18nKeywords) {
+            $features = array();
+            foreach (explode('|', $i18nKeywords['feature']) as $transNum => $featureKeyword) {
+                $line = 1;
+                if ('en' !== $lang) {
+                    $line = 2;
+                }
+
+                $featureLine = $line;
+                $line += 5;
+
+                $keywords = explode('|', $i18nKeywords['background']);
+                $backgroundLine = $line;
+                $line += 1;
+                $background = new BackgroundNode(null, array_merge(
+                    $this->getSteps($i18nKeywords['given'], 'there is agent A', $line, 'Given'),
+                    $this->getSteps($i18nKeywords['and'], 'there is agent B', $line, 'Given')
+                ), $keywords[0], $backgroundLine);
+
+                $line += 1;
+
+                $scenarios = array();
+
+                foreach (explode('|', $i18nKeywords['scenario']) as $scenarioKeyword) {
+                    $scenarioLine = $line;
+                    $line += 1;
+
+                    $steps = array_merge(
+                        $this->getSteps($i18nKeywords['given'], 'there is agent J', $line, 'Given'),
+                        $this->getSteps($i18nKeywords['and'], 'there is agent K', $line, 'Given'),
+                        $this->getSteps($i18nKeywords['when'], 'I erase agent K\'s memory', $line, 'When'),
+                        $this->getSteps($i18nKeywords['then'], 'there should be agent J', $line, 'Then'),
+                        $this->getSteps($i18nKeywords['but'], 'there should not be agent K', $line, 'Then')
+                    );
+
+                    $scenarios[] = new ScenarioNode('Erasing agent memory', array(), $steps, $scenarioKeyword, $scenarioLine);
+                    $line += 1;
+                }
+                foreach (explode('|', $i18nKeywords['scenario_outline']) as $outlineKeyword) {
+                    $outlineLine = $line;
+                    $line += 1;
+
+                    $steps = array_merge(
+                        $this->getSteps($i18nKeywords['given'], 'there is agent <agent1>', $line, 'Given'),
+                        $this->getSteps($i18nKeywords['and'], 'there is agent <agent2>', $line, 'Given'),
+                        $this->getSteps($i18nKeywords['when'], 'I erase agent <agent2>\'s memory', $line, 'When'),
+                        $this->getSteps($i18nKeywords['then'], 'there should be agent <agent1>', $line, 'Then'),
+                        $this->getSteps($i18nKeywords['but'], 'there should not be agent <agent2>', $line, 'Then')
+                    );
+                    $line += 1;
+
+                    $keywords = explode('|', $i18nKeywords['examples']);
+                    $table = new ExampleTableNode(array(
+                        ++$line => array('agent1', 'agent2'),
+                        ++$line => array('D', 'M')
+                    ), $keywords[0]);
+                    $line += 1;
+
+                    $scenarios[] = new OutlineNode('Erasing other agents\' memory', array(), $steps, $table, $outlineKeyword, $outlineLine);
+                    $line += 1;
+                }
+
+                $features[] = new FeatureNode(
+                    'Internal operations',
+                    <<<DESC
+In order to stay secret
+As a secret organization
+We need to be able to erase past agents' memory
+DESC
+                    ,
+                    array(),
+                    $background,
+                    $scenarios,
+                    $featureKeyword,
+                    $lang,
+                    $lang . '_' . ($transNum + 1) . '.feature',
+                    $featureLine
+                );
+            }
+
+            $dumped = $dumper->dump($lang, false, true);
+            $parsed = array();
+            try {
+                foreach ($dumped as $num => $dumpedFeature) {
+                    $parsed[] = $parser->parse($dumpedFeature, $lang . '_' . ($num + 1) . '.feature');
+                }
+            } catch (\Exception $e) {
+                throw new \Exception($e->getMessage() . ":\n" . json_encode($dumped), 0, $e);
+            }
+
+            $data[] = array($lang, $features, $parsed);
+        }
+
+        return $data;
+    }
+
+    /**
+     * @dataProvider translationTestDataProvider
+     *
+     * @param string $language language name
+     * @param array  $etalon   etalon features (to test against)
+     * @param array  $features array of parsed feature(s)
+     */
+    public function testTranslation($language, array $etalon, array $features)
+    {
+        $this->assertEquals($etalon, $features);
+    }
+}