/** * Extracts the formatted header from the definition. * * @param Suite $suite * @param Definition $definition * * @return string[] */ private function extractHeader(Suite $suite, Definition $definition) { $pattern = $definition->getPattern(); $lines = array(); $lines[] = strtr('{suite} <def_dimmed>|</def_dimmed> <info>{type}</info> <def_regex>{regex}</def_regex>', array('{suite}' => $suite->getName(), '{type}' => $this->getDefinitionType($definition), '{regex}' => $pattern)); return $lines; }
/** * Attempts to translate definition using translator and produce translated one on success. * * @param Suite $suite * @param Definition $definition * @param null|string $language * * @return Definition|TranslatedDefinition */ public function translateDefinition(Suite $suite, Definition $definition, $language = null) { $assetsId = $suite->getName(); $pattern = $definition->getPattern(); $translatedPattern = $this->translator->trans($pattern, array(), $assetsId, $language); if ($pattern != $translatedPattern) { return new TranslatedDefinition($definition, $translatedPattern, $language); } return $definition; }
/** * Colorizes step text arguments according to definition. * * @param string $text * @param Definition $definition * @param TestResult $result * * @return string */ public function paintText($text, Definition $definition, TestResult $result) { $regex = $this->patternTransformer->transformPatternToRegex($definition->getPattern()); $style = $this->resultConverter->convertResultToString($result); $paramStyle = $style . '_param'; // If it's just a string - skip if ('/' !== substr($regex, 0, 1)) { return $text; } // Find arguments with offsets $matches = array(); preg_match($regex, $text, $matches, PREG_OFFSET_CAPTURE); array_shift($matches); // Replace arguments with colorized ones $shift = 0; $lastReplacementPosition = 0; foreach ($matches as $key => $match) { if (!is_numeric($key) || -1 === $match[1] || false !== strpos($match[0], '<')) { continue; } $offset = $match[1] + $shift; $value = $match[0]; // Skip inner matches if ($lastReplacementPosition > $offset) { continue; } $lastReplacementPosition = $offset + strlen($value); $begin = substr($text, 0, $offset); $end = substr($text, $lastReplacementPosition); $format = "{-{$style}}{+{$paramStyle}}%s{-{$paramStyle}}{+{$style}}"; $text = sprintf("%s{$format}%s", $begin, $value, $end); // Keep track of how many extra characters are added $shift += strlen($format) - 2; $lastReplacementPosition += strlen($format) - 2; } // Replace "<", ">" with colorized ones $text = preg_replace('/(<[^>]+>)/', "{-{$style}}{+{$paramStyle}}\$1{-{$paramStyle}}{+{$style}}", $text); return $text; }
/** * Attempts to match provided definition against a step text. * * @param Definition $definition * @param string $stepText * @param ArgumentInterface[] $multiline * * @return null|SearchResult */ private function match(Definition $definition, $stepText, array $multiline) { $regex = $this->patternTransformer->transformPatternToRegex($definition->getPattern()); if (!preg_match($regex, $stepText, $match)) { return null; } $function = $definition->getReflection(); $match = array_merge($match, array_values($multiline)); $arguments = $this->argumentOrganiser->organiseArguments($function, $match); return new SearchResult($definition, $stepText, $arguments); }
/** * Returns original (not translated) pattern. * * @return string */ public function getOriginalPattern() { return $this->definition->getPattern(); }
/** * Initializes redundant exception. * * @param Definition $step2 duplicate step definition * @param Definition $step1 firstly matched step definition */ public function __construct(Definition $step2, Definition $step1) { $message = sprintf("Step \"%s\" is already defined in %s\n\n%s\n%s", $step2->getPattern(), $step1->getPath(), $step1->getPath(), $step2->getPath()); parent::__construct($message); }