canyin-project/ybcy/vendor/behat/gherkin/tests/Behat/Gherkin/ParserTest.php

148 lines
4.5 KiB
PHP
Raw Normal View History

2024-11-01 16:07:54 +08:00
<?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()
);
}
}