--- /dev/null
+<?php
+
+namespace Tests\Behat\Gherkin;
+
+use Behat\Gherkin\Node\FeatureNode;
+use Behat\Gherkin\Lexer;
+use Behat\Gherkin\Parser;
+use Behat\Gherkin\Keywords\ArrayKeywords;
+use Behat\Gherkin\Loader\YamlFileLoader;
+
+class ParserTest extends \PHPUnit_Framework_TestCase
+{
+ private $gherkin;
+ private $yaml;
+
+ public function parserTestDataProvider()
+ {
+ $data = array();
+
+ foreach (glob(__DIR__ . '/Fixtures/etalons/*.yml') as $file) {
+ $testname = basename($file, '.yml');
+
+ $data[] = array($testname);
+ }
+
+ return $data;
+ }
+
+ /**
+ * @dataProvider parserTestDataProvider
+ *
+ * @param string $fixtureName name of the fixture
+ */
+ public function testParser($fixtureName)
+ {
+ $etalon = $this->parseEtalon($fixtureName . '.yml');
+ $features = $this->parseFixture($fixtureName . '.feature');
+
+ $this->assertInternalType('array', $features);
+ $this->assertEquals(1, count($features));
+ $fixture = $features[0];
+
+ $this->assertEquals($etalon, $fixture);
+ }
+
+ public function testParserResetsTagsBetweenFeatures()
+ {
+ $parser = $this->getGherkinParser();
+
+ $parser->parse(<<<FEATURE
+Feature:
+Scenario:
+Given step
+@skipped
+FEATURE
+ );
+ $feature2 = $parser->parse(<<<FEATURE
+Feature:
+Scenario:
+Given step
+FEATURE
+ );
+
+ $this->assertFalse($feature2->hasTags());
+ }
+
+ protected function getGherkinParser()
+ {
+ if (null === $this->gherkin) {
+ $keywords = new ArrayKeywords(array(
+ 'en' => array(
+ 'feature' => 'Feature',
+ 'background' => 'Background',
+ 'scenario' => 'Scenario',
+ 'scenario_outline' => 'Scenario Outline',
+ 'examples' => 'Examples',
+ 'given' => 'Given',
+ 'when' => 'When',
+ 'then' => 'Then',
+ 'and' => 'And',
+ 'but' => 'But'
+ ),
+ 'ru' => array(
+ 'feature' => 'Функционал',
+ 'background' => 'Предыстория',
+ 'scenario' => 'Сценарий',
+ 'scenario_outline' => 'Структура сценария',
+ 'examples' => 'Значения',
+ 'given' => 'Допустим',
+ 'when' => 'То',
+ 'then' => 'Если',
+ 'and' => 'И',
+ 'but' => 'Но'
+ ),
+ 'ja' => array (
+ 'feature' => 'フィーチャ',
+ 'background' => '背景',
+ 'scenario' => 'シナリオ',
+ 'scenario_outline' => 'シナリオアウトライン',
+ 'examples' => '例|サンプル',
+ 'given' => '前提<',
+ 'when' => 'もし<',
+ 'then' => 'ならば<',
+ 'and' => 'かつ<',
+ 'but' => 'しかし<'
+ )
+ ));
+ $this->gherkin = new Parser(new Lexer($keywords));
+ }
+
+ return $this->gherkin;
+ }
+
+ protected function getYamlParser()
+ {
+ if (null === $this->yaml) {
+ $this->yaml = new YamlFileLoader();
+ }
+
+ return $this->yaml;
+ }
+
+ protected function parseFixture($fixture)
+ {
+ $file = __DIR__ . '/Fixtures/features/' . $fixture;
+
+ return array($this->getGherkinParser()->parse(file_get_contents($file), $file));
+ }
+
+ protected function parseEtalon($etalon)
+ {
+ $features = $this->getYamlParser()->load(__DIR__ . '/Fixtures/etalons/' . $etalon);
+ $feature = $features[0];
+
+ return new FeatureNode(
+ $feature->getTitle(),
+ $feature->getDescription(),
+ $feature->getTags(),
+ $feature->getBackground(),
+ $feature->getScenarios(),
+ $feature->getKeyword(),
+ $feature->getLanguage(),
+ __DIR__ . '/Fixtures/features/' . basename($etalon, '.yml') . '.feature',
+ $feature->getLine()
+ );
+ }
+}