| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- <?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 bool
- */
- public function hasTag($tag)
- {
- return in_array($tag, $this->getTags());
- }
- /**
- * Checks if outline has tags (both inherited from feature and own).
- *
- * @return bool
- */
- 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 bool
- */
- 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;
- }
- }
|