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

Breadcrumb

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

function File::renderSourceWithBranchCoverage

1 call to File::renderSourceWithBranchCoverage()
File::render in vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php

File

vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php, line 567

Class

File
@internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage

Namespace

SebastianBergmann\CodeCoverage\Report\Html

Code

private function renderSourceWithBranchCoverage(FileNode $node) : string {
    $linesTemplate = new Template($this->templatePath . 'lines.html.dist', '{{', '}}');
    $singleLineTemplate = new Template($this->templatePath . 'line.html.dist', '{{', '}}');
    $functionCoverageData = $node->functionCoverageData();
    $testData = $node->testData();
    $codeLines = $this->loadFile($node->pathAsString());
    $lineData = [];
    
    /** @var int $line */
    foreach (array_keys($codeLines) as $line) {
        $lineData[$line + 1] = [
            'includedInBranches' => 0,
            'includedInHitBranches' => 0,
            'tests' => [],
        ];
    }
    foreach ($functionCoverageData as $method) {
        foreach ($method['branches'] as $branch) {
            foreach (range($branch['line_start'], $branch['line_end']) as $line) {
                if (!isset($lineData[$line])) {
                    // blank line at end of file is sometimes included here
                    continue;
                }
                $lineData[$line]['includedInBranches']++;
                if ($branch['hit']) {
                    $lineData[$line]['includedInHitBranches']++;
                    $lineData[$line]['tests'] = array_unique(array_merge($lineData[$line]['tests'], $branch['hit']));
                }
            }
        }
    }
    $lines = '';
    $i = 1;
    
    /** @var string $line */
    foreach ($codeLines as $line) {
        $trClass = '';
        $popover = '';
        if ($lineData[$i]['includedInBranches'] > 0) {
            $lineCss = 'success';
            if ($lineData[$i]['includedInHitBranches'] === 0) {
                $lineCss = 'danger';
            }
            elseif ($lineData[$i]['includedInHitBranches'] !== $lineData[$i]['includedInBranches']) {
                $lineCss = 'warning';
            }
            $popoverContent = '<ul>';
            if (count($lineData[$i]['tests']) === 1) {
                $popoverTitle = '1 test covers line ' . $i;
            }
            else {
                $popoverTitle = count($lineData[$i]['tests']) . ' tests cover line ' . $i;
            }
            $popoverTitle .= '. These are covering ' . $lineData[$i]['includedInHitBranches'] . ' out of the ' . $lineData[$i]['includedInBranches'] . ' code branches.';
            foreach ($lineData[$i]['tests'] as $test) {
                $popoverContent .= $this->createPopoverContentForTest($test, $testData[$test]);
            }
            $popoverContent .= '</ul>';
            $trClass = $lineCss . ' popin';
            $popover = sprintf(' data-title="%s" data-content="%s" data-placement="top" data-html="true"', $popoverTitle, htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags));
        }
        $lines .= $this->renderLine($singleLineTemplate, $i, $line, $trClass, $popover);
        $i++;
    }
    $linesTemplate->setVar([
        'lines' => $lines,
    ]);
    return $linesTemplate->render();
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal