/** * {@inheritdoc} */ public function generateRegex($suiteName, $pattern, $language) { $translatedPattern = $this->translator->trans($pattern, array(), $suiteName, $language); if ($pattern == $translatedPattern) { return $this->patternTransformer->transformPatternToRegex($pattern); } return $this->patternTransformer->transformPatternToRegex($translatedPattern); }
/** * {@inheritdoc} */ public function generateSnippet(Environment $environment, StepNode $step) { if (!$environment instanceof ContextEnvironment) { throw new EnvironmentSnippetGenerationException(sprintf('ContextSnippetGenerator does not support `%s` environment.', get_class($environment)), $environment); } $contextClass = $this->getSnippetAcceptingContextClass($environment); $patternType = $this->getPatternType($contextClass); $stepText = $step->getText(); $pattern = $this->patternTransformer->generatePattern($patternType, $stepText); $methodName = $this->getMethodName($contextClass, $pattern->getCanonicalText(), $pattern->getPattern()); $methodArguments = $this->getMethodArguments($step, $pattern->getPlaceholderCount()); $snippetTemplate = $this->getSnippetTemplate($pattern->getPattern(), $methodName, $methodArguments); return new ContextSnippet($step, $snippetTemplate, $contextClass); }
/** * Returns transformation regex. * * @param string $assetsId * @param string $pattern * @param string $language * * @return string */ private function getRegex($assetsId, $pattern, $language) { $translatedPattern = $this->translator->trans($pattern, array(), $assetsId, $language); if ($pattern == $translatedPattern) { return $this->patternTransformer->transformPatternToRegex($pattern); } return $this->patternTransformer->transformPatternToRegex($translatedPattern); }
/** * 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); }
/** * 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; }