Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Text.php

class Text

Same name in this branch
  1. 11.1.x vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php \PHPUnit\TextUI\XmlConfiguration\CodeCoverage\Report\Text
  2. 11.1.x vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php \PHPUnit\TextUI\XmlConfiguration\Logging\TestDox\Text
  3. 11.1.x vendor/squizlabs/php_codesniffer/src/Generators/Text.php \PHP_CodeSniffer\Generators\Text
  4. 11.1.x core/modules/views/src/Plugin/views/area/Text.php \Drupal\views\Plugin\views\area\Text

Hierarchy

  • class \SebastianBergmann\CodeCoverage\Report\Text

Expanded class hierarchy of Text

1 file declares its use of Text
CodeCoverage.php in vendor/phpunit/phpunit/src/Runner/CodeCoverage.php
130 string references to 'Text'
badge.component.yml in core/profiles/demo_umami/themes/umami/components/badge/badge.component.yml
core/profiles/demo_umami/themes/umami/components/badge/badge.component.yml
block_content.schema.yml in core/modules/block_content/config/schema/block_content.schema.yml
core/modules/block_content/config/schema/block_content.schema.yml
claro_preprocess_input in core/themes/claro/claro.theme
Implements template_preprocess_HOOK() for input.
comment.schema.yml in core/modules/comment/config/schema/comment.schema.yml
core/modules/comment/config/schema/comment.schema.yml
contact.schema.yml in core/modules/contact/config/schema/contact.schema.yml
core/modules/contact/config/schema/contact.schema.yml

... See full list

File

vendor/phpunit/php-code-coverage/src/Report/Text.php, line 24

Namespace

SebastianBergmann\CodeCoverage\Report
View source
final class Text {
    
    /**
     * @var string
     */
    private const COLOR_GREEN = "\x1b[30;42m";
    
    /**
     * @var string
     */
    private const COLOR_YELLOW = "\x1b[30;43m";
    
    /**
     * @var string
     */
    private const COLOR_RED = "\x1b[37;41m";
    
    /**
     * @var string
     */
    private const COLOR_HEADER = "\x1b[1;37;40m";
    
    /**
     * @var string
     */
    private const COLOR_RESET = "\x1b[0m";
    private readonly Thresholds $thresholds;
    private readonly bool $showUncoveredFiles;
    private readonly bool $showOnlySummary;
    public function __construct(Thresholds $thresholds, bool $showUncoveredFiles = false, bool $showOnlySummary = false) {
        $this->thresholds = $thresholds;
        $this->showUncoveredFiles = $showUncoveredFiles;
        $this->showOnlySummary = $showOnlySummary;
    }
    public function process(CodeCoverage $coverage, bool $showColors = false) : string {
        $hasBranchCoverage = !empty($coverage->getData(true)
            ->functionCoverage());
        $output = PHP_EOL . PHP_EOL;
        $report = $coverage->getReport();
        $colors = [
            'header' => '',
            'classes' => '',
            'methods' => '',
            'lines' => '',
            'branches' => '',
            'paths' => '',
            'reset' => '',
        ];
        if ($showColors) {
            $colors['classes'] = $this->coverageColor($report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits());
            $colors['methods'] = $this->coverageColor($report->numberOfTestedMethods(), $report->numberOfMethods());
            $colors['lines'] = $this->coverageColor($report->numberOfExecutedLines(), $report->numberOfExecutableLines());
            $colors['branches'] = $this->coverageColor($report->numberOfExecutedBranches(), $report->numberOfExecutableBranches());
            $colors['paths'] = $this->coverageColor($report->numberOfExecutedPaths(), $report->numberOfExecutablePaths());
            $colors['reset'] = self::COLOR_RESET;
            $colors['header'] = self::COLOR_HEADER;
        }
        $classes = sprintf('  Classes: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits())
            ->asString(), $report->numberOfTestedClassesAndTraits(), $report->numberOfClassesAndTraits());
        $methods = sprintf('  Methods: %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfTestedMethods(), $report->numberOfMethods())
            ->asString(), $report->numberOfTestedMethods(), $report->numberOfMethods());
        $paths = '';
        $branches = '';
        if ($hasBranchCoverage) {
            $paths = sprintf('  Paths:   %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedPaths(), $report->numberOfExecutablePaths())
                ->asString(), $report->numberOfExecutedPaths(), $report->numberOfExecutablePaths());
            $branches = sprintf('  Branches:   %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedBranches(), $report->numberOfExecutableBranches())
                ->asString(), $report->numberOfExecutedBranches(), $report->numberOfExecutableBranches());
        }
        $lines = sprintf('  Lines:   %6s (%d/%d)', Percentage::fromFractionAndTotal($report->numberOfExecutedLines(), $report->numberOfExecutableLines())
            ->asString(), $report->numberOfExecutedLines(), $report->numberOfExecutableLines());
        $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');
            $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);
        if ($hasBranchCoverage) {
            $output .= $this->format($colors['paths'], $padding, $paths);
            $output .= $this->format($colors['branches'], $padding, $branches);
        }
        $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->classesAndTraits();
            foreach ($classes as $className => $class) {
                $classExecutableLines = 0;
                $classExecutedLines = 0;
                $classExecutableBranches = 0;
                $classExecutedBranches = 0;
                $classExecutablePaths = 0;
                $classExecutedPaths = 0;
                $coveredMethods = 0;
                $classMethods = 0;
                foreach ($class['methods'] as $method) {
                    if ($method['executableLines'] == 0) {
                        continue;
                    }
                    $classMethods++;
                    $classExecutableLines += $method['executableLines'];
                    $classExecutedLines += $method['executedLines'];
                    $classExecutableBranches += $method['executableBranches'];
                    $classExecutedBranches += $method['executedBranches'];
                    $classExecutablePaths += $method['executablePaths'];
                    $classExecutedPaths += $method['executedPaths'];
                    if ($method['coverage'] == 100) {
                        $coveredMethods++;
                    }
                }
                $classCoverage[$className] = [
                    'namespace' => $class['namespace'],
                    'className' => $className,
                    'methodsCovered' => $coveredMethods,
                    'methodCount' => $classMethods,
                    'statementsCovered' => $classExecutedLines,
                    'statementCount' => $classExecutableLines,
                    'branchesCovered' => $classExecutedBranches,
                    'branchesCount' => $classExecutableBranches,
                    'pathsCovered' => $classExecutedPaths,
                    'pathsCount' => $classExecutablePaths,
                ];
            }
        }
        ksort($classCoverage);
        $methodColor = '';
        $pathsColor = '';
        $branchesColor = '';
        $linesColor = '';
        $resetColor = '';
        foreach ($classCoverage as $fullQualifiedPath => $classInfo) {
            if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) {
                if ($showColors) {
                    $methodColor = $this->coverageColor($classInfo['methodsCovered'], $classInfo['methodCount']);
                    $pathsColor = $this->coverageColor($classInfo['pathsCovered'], $classInfo['pathsCount']);
                    $branchesColor = $this->coverageColor($classInfo['branchesCovered'], $classInfo['branchesCount']);
                    $linesColor = $this->coverageColor($classInfo['statementsCovered'], $classInfo['statementCount']);
                    $resetColor = $colors['reset'];
                }
                $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL . '  ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' ';
                if ($hasBranchCoverage) {
                    $output .= '  ' . $pathsColor . 'Paths: ' . $this->printCoverageCounts($classInfo['pathsCovered'], $classInfo['pathsCount'], 3) . $resetColor . ' ' . '  ' . $branchesColor . 'Branches: ' . $this->printCoverageCounts($classInfo['branchesCovered'], $classInfo['branchesCount'], 3) . $resetColor . ' ';
                }
                $output .= '  ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor;
            }
        }
        return $output . PHP_EOL;
    }
    private function coverageColor(int $numberOfCoveredElements, int $totalNumberOfElements) : string {
        $coverage = Percentage::fromFractionAndTotal($numberOfCoveredElements, $totalNumberOfElements);
        if ($coverage->asFloat() >= $this->thresholds
            ->highLowerBound()) {
            return self::COLOR_GREEN;
        }
        if ($coverage->asFloat() > $this->thresholds
            ->lowUpperBound()) {
            return self::COLOR_YELLOW;
        }
        return self::COLOR_RED;
    }
    private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision) : string {
        $format = '%' . $precision . 's';
        return Percentage::fromFractionAndTotal($numberOfCoveredElements, $totalNumberOfElements)->asFixedWidthString() . ' (' . sprintf($format, $numberOfCoveredElements) . '/' . sprintf($format, $totalNumberOfElements) . ')';
    }
    private function format(string $color, int $padding, false|string $string) : string {
        if ($color === '') {
            return (string) $string . PHP_EOL;
        }
        return $color . str_pad((string) $string, $padding) . self::COLOR_RESET . PHP_EOL;
    }

}

Members

Title Sort descending Modifiers Object type Summary
Text::$showOnlySummary private property
Text::$showUncoveredFiles private property
Text::$thresholds private property
Text::COLOR_GREEN private constant
Text::COLOR_HEADER private constant
Text::COLOR_RED private constant
Text::COLOR_RESET private constant
Text::COLOR_YELLOW private constant
Text::coverageColor private function
Text::format private function
Text::printCoverageCounts private function
Text::process public function
Text::__construct public function
RSS feed
Powered by Drupal