diff options
Diffstat (limited to 'vendor/phpunit/php-code-coverage/src/Report/Text.php')
-rw-r--r-- | vendor/phpunit/php-code-coverage/src/Report/Text.php | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/vendor/phpunit/php-code-coverage/src/Report/Text.php b/vendor/phpunit/php-code-coverage/src/Report/Text.php new file mode 100644 index 0000000..1e66022 --- /dev/null +++ b/vendor/phpunit/php-code-coverage/src/Report/Text.php @@ -0,0 +1,257 @@ +<?php +/* + * This file is part of the php-code-coverage package. + * + * (c) Sebastian Bergmann <sebastian@phpunit.de> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\File; +use SebastianBergmann\CodeCoverage\Util; + +/** + * Generates human readable output from a code coverage object. + * + * The output gets put into a text file our written to the CLI. + */ +class Text +{ + private $lowUpperBound; + private $highLowerBound; + private $showUncoveredFiles; + private $showOnlySummary; + + private $colors = [ + 'green' => "\x1b[30;42m", + 'yellow' => "\x1b[30;43m", + 'red' => "\x1b[37;41m", + 'header' => "\x1b[1;37;40m", + 'reset' => "\x1b[0m", + 'eol' => "\x1b[2K", + ]; + + /** + * @param int $lowUpperBound + * @param int $highLowerBound + * @param bool $showUncoveredFiles + * @param bool $showOnlySummary + */ + public function __construct($lowUpperBound = 50, $highLowerBound = 90, $showUncoveredFiles = false, $showOnlySummary = false) + { + $this->lowUpperBound = $lowUpperBound; + $this->highLowerBound = $highLowerBound; + $this->showUncoveredFiles = $showUncoveredFiles; + $this->showOnlySummary = $showOnlySummary; + } + + /** + * @param CodeCoverage $coverage + * @param bool $showColors + * + * @return string + */ + public function process(CodeCoverage $coverage, $showColors = false) + { + $output = PHP_EOL . PHP_EOL; + $report = $coverage->getReport(); + unset($coverage); + + $colors = [ + 'header' => '', + 'classes' => '', + 'methods' => '', + 'lines' => '', + 'reset' => '', + 'eol' => '' + ]; + + if ($showColors) { + $colors['classes'] = $this->getCoverageColor( + $report->getNumTestedClassesAndTraits(), + $report->getNumClassesAndTraits() + ); + $colors['methods'] = $this->getCoverageColor( + $report->getNumTestedMethods(), + $report->getNumMethods() + ); + $colors['lines'] = $this->getCoverageColor( + $report->getNumExecutedLines(), + $report->getNumExecutableLines() + ); + $colors['reset'] = $this->colors['reset']; + $colors['header'] = $this->colors['header']; + $colors['eol'] = $this->colors['eol']; + } + + $classes = sprintf( + ' Classes: %6s (%d/%d)', + Util::percent( + $report->getNumTestedClassesAndTraits(), + $report->getNumClassesAndTraits(), + true + ), + $report->getNumTestedClassesAndTraits(), + $report->getNumClassesAndTraits() + ); + + $methods = sprintf( + ' Methods: %6s (%d/%d)', + Util::percent( + $report->getNumTestedMethods(), + $report->getNumMethods(), + true + ), + $report->getNumTestedMethods(), + $report->getNumMethods() + ); + + $lines = sprintf( + ' Lines: %6s (%d/%d)', + Util::percent( + $report->getNumExecutedLines(), + $report->getNumExecutableLines(), + true + ), + $report->getNumExecutedLines(), + $report->getNumExecutableLines() + ); + + $padding = max(array_map('strlen', [$classes, $methods, $lines])); + + if ($this->showOnlySummary) { + $title = 'Code Coverage Report Summary:'; + $padding = max($padding, strlen($title)); + + $output .= $this->format($colors['header'], $padding, $title); + } else { + $date = date(' Y-m-d H:i:s', $_SERVER['REQUEST_TIME']); + $title = 'Code Coverage Report:'; + + $output .= $this->format($colors['header'], $padding, $title); + $output .= $this->format($colors['header'], $padding, $date); + $output .= $this->format($colors['header'], $padding, ''); + $output .= $this->format($colors['header'], $padding, ' Summary:'); + } + + $output .= $this->format($colors['classes'], $padding, $classes); + $output .= $this->format($colors['methods'], $padding, $methods); + $output .= $this->format($colors['lines'], $padding, $lines); + + if ($this->showOnlySummary) { + return $output . PHP_EOL; + } + + $classCoverage = []; + + foreach ($report as $item) { + if (!$item instanceof File) { + continue; + } + + $classes = $item->getClassesAndTraits(); + + foreach ($classes as $className => $class) { + $classStatements = 0; + $coveredClassStatements = 0; + $coveredMethods = 0; + $classMethods = 0; + + foreach ($class['methods'] as $method) { + if ($method['executableLines'] == 0) { + continue; + } + + $classMethods++; + $classStatements += $method['executableLines']; + $coveredClassStatements += $method['executedLines']; + if ($method['coverage'] == 100) { + $coveredMethods++; + } + } + + if (!empty($class['package']['namespace'])) { + $namespace = '\\' . $class['package']['namespace'] . '::'; + } elseif (!empty($class['package']['fullPackage'])) { + $namespace = '@' . $class['package']['fullPackage'] . '::'; + } else { + $namespace = ''; + } + + $classCoverage[$namespace . $className] = [ + 'namespace' => $namespace, + 'className ' => $className, + 'methodsCovered' => $coveredMethods, + 'methodCount' => $classMethods, + 'statementsCovered' => $coveredClassStatements, + 'statementCount' => $classStatements, + ]; + } + } + + ksort($classCoverage); + + $methodColor = ''; + $linesColor = ''; + $resetColor = ''; + + foreach ($classCoverage as $fullQualifiedPath => $classInfo) { + if ($classInfo['statementsCovered'] != 0 || + $this->showUncoveredFiles) { + if ($showColors) { + $methodColor = $this->getCoverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); + $linesColor = $this->getCoverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); + $resetColor = $colors['reset']; + } + + $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL + . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' ' + . ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor + ; + } + } + + return $output . PHP_EOL; + } + + protected function getCoverageColor($numberOfCoveredElements, $totalNumberOfElements) + { + $coverage = Util::percent( + $numberOfCoveredElements, + $totalNumberOfElements + ); + + if ($coverage >= $this->highLowerBound) { + return $this->colors['green']; + } elseif ($coverage > $this->lowUpperBound) { + return $this->colors['yellow']; + } + + return $this->colors['red']; + } + + protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfElements, $precision) + { + $format = '%' . $precision . 's'; + + return Util::percent( + $numberOfCoveredElements, + $totalNumberOfElements, + true, + true + ) . + ' (' . sprintf($format, $numberOfCoveredElements) . '/' . + sprintf($format, $totalNumberOfElements) . ')'; + } + + private function format($color, $padding, $string) + { + $reset = $color ? $this->colors['reset'] : ''; + + return $color . str_pad($string, $padding) . $reset . PHP_EOL; + } +} |