You are here

class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php \PHP_CodeCoverage_Report_HTML_Renderer_Dashboard

Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node.

@since Class available since Release 1.1.0

Hierarchy

Expanded class hierarchy of PHP_CodeCoverage_Report_HTML_Renderer_Dashboard

File

vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php, line 16

View source
class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer {

  /**
   * @param PHP_CodeCoverage_Report_Node_Directory $node
   * @param string                                 $file
   */
  public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) {
    $classes = $node
      ->getClassesAndTraits();
    $template = new Text_Template($this->templatePath . 'dashboard.html', '{{', '}}');
    $this
      ->setCommonTemplateVariables($template, $node);
    $baseLink = $node
      ->getId() . '/';
    $complexity = $this
      ->complexity($classes, $baseLink);
    $coverageDistribution = $this
      ->coverageDistribution($classes);
    $insufficientCoverage = $this
      ->insufficientCoverage($classes, $baseLink);
    $projectRisks = $this
      ->projectRisks($classes, $baseLink);
    $template
      ->setVar(array(
      'insufficient_coverage_classes' => $insufficientCoverage['class'],
      'insufficient_coverage_methods' => $insufficientCoverage['method'],
      'project_risks_classes' => $projectRisks['class'],
      'project_risks_methods' => $projectRisks['method'],
      'complexity_class' => $complexity['class'],
      'complexity_method' => $complexity['method'],
      'class_coverage_distribution' => $coverageDistribution['class'],
      'method_coverage_distribution' => $coverageDistribution['method'],
    ));
    $template
      ->renderTo($file);
  }

  /**
   * Returns the data for the Class/Method Complexity charts.
   *
   * @param  array  $classes
   * @param  string $baseLink
   * @return array
   */
  protected function complexity(array $classes, $baseLink) {
    $result = array(
      'class' => array(),
      'method' => array(),
    );
    foreach ($classes as $className => $class) {
      foreach ($class['methods'] as $methodName => $method) {
        if ($className != '*') {
          $methodName = $className . '::' . $methodName;
        }
        $result['method'][] = array(
          $method['coverage'],
          $method['ccn'],
          sprintf('<a href="%s">%s</a>', str_replace($baseLink, '', $method['link']), $methodName),
        );
      }
      $result['class'][] = array(
        $class['coverage'],
        $class['ccn'],
        sprintf('<a href="%s">%s</a>', str_replace($baseLink, '', $class['link']), $className),
      );
    }
    return array(
      'class' => json_encode($result['class']),
      'method' => json_encode($result['method']),
    );
  }

  /**
   * Returns the data for the Class / Method Coverage Distribution chart.
   *
   * @param  array $classes
   * @return array
   */
  protected function coverageDistribution(array $classes) {
    $result = array(
      'class' => array(
        '0%' => 0,
        '0-10%' => 0,
        '10-20%' => 0,
        '20-30%' => 0,
        '30-40%' => 0,
        '40-50%' => 0,
        '50-60%' => 0,
        '60-70%' => 0,
        '70-80%' => 0,
        '80-90%' => 0,
        '90-100%' => 0,
        '100%' => 0,
      ),
      'method' => array(
        '0%' => 0,
        '0-10%' => 0,
        '10-20%' => 0,
        '20-30%' => 0,
        '30-40%' => 0,
        '40-50%' => 0,
        '50-60%' => 0,
        '60-70%' => 0,
        '70-80%' => 0,
        '80-90%' => 0,
        '90-100%' => 0,
        '100%' => 0,
      ),
    );
    foreach ($classes as $class) {
      foreach ($class['methods'] as $methodName => $method) {
        if ($method['coverage'] == 0) {
          $result['method']['0%']++;
        }
        elseif ($method['coverage'] == 100) {
          $result['method']['100%']++;
        }
        else {
          $key = floor($method['coverage'] / 10) * 10;
          $key = $key . '-' . ($key + 10) . '%';
          $result['method'][$key]++;
        }
      }
      if ($class['coverage'] == 0) {
        $result['class']['0%']++;
      }
      elseif ($class['coverage'] == 100) {
        $result['class']['100%']++;
      }
      else {
        $key = floor($class['coverage'] / 10) * 10;
        $key = $key . '-' . ($key + 10) . '%';
        $result['class'][$key]++;
      }
    }
    return array(
      'class' => json_encode(array_values($result['class'])),
      'method' => json_encode(array_values($result['method'])),
    );
  }

  /**
   * Returns the classes / methods with insufficient coverage.
   *
   * @param  array  $classes
   * @param  string $baseLink
   * @return array
   */
  protected function insufficientCoverage(array $classes, $baseLink) {
    $leastTestedClasses = array();
    $leastTestedMethods = array();
    $result = array(
      'class' => '',
      'method' => '',
    );
    foreach ($classes as $className => $class) {
      foreach ($class['methods'] as $methodName => $method) {
        if ($method['coverage'] < $this->highLowerBound) {
          if ($className != '*') {
            $key = $className . '::' . $methodName;
          }
          else {
            $key = $methodName;
          }
          $leastTestedMethods[$key] = $method['coverage'];
        }
      }
      if ($class['coverage'] < $this->highLowerBound) {
        $leastTestedClasses[$className] = $class['coverage'];
      }
    }
    asort($leastTestedClasses);
    asort($leastTestedMethods);
    foreach ($leastTestedClasses as $className => $coverage) {
      $result['class'] .= sprintf('       <tr><td><a href="%s">%s</a></td><td class="text-right">%d%%</td></tr>' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $coverage);
    }
    foreach ($leastTestedMethods as $methodName => $coverage) {
      list($class, $method) = explode('::', $methodName);
      $result['method'] .= sprintf('       <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d%%</td></tr>' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $coverage);
    }
    return $result;
  }

  /**
   * Returns the project risks according to the CRAP index.
   *
   * @param  array  $classes
   * @param  string $baseLink
   * @return array
   */
  protected function projectRisks(array $classes, $baseLink) {
    $classRisks = array();
    $methodRisks = array();
    $result = array(
      'class' => '',
      'method' => '',
    );
    foreach ($classes as $className => $class) {
      foreach ($class['methods'] as $methodName => $method) {
        if ($method['coverage'] < $this->highLowerBound && $method['ccn'] > 1) {
          if ($className != '*') {
            $key = $className . '::' . $methodName;
          }
          else {
            $key = $methodName;
          }
          $methodRisks[$key] = $method['crap'];
        }
      }
      if ($class['coverage'] < $this->highLowerBound && $class['ccn'] > count($class['methods'])) {
        $classRisks[$className] = $class['crap'];
      }
    }
    arsort($classRisks);
    arsort($methodRisks);
    foreach ($classRisks as $className => $crap) {
      $result['class'] .= sprintf('       <tr><td><a href="%s">%s</a></td><td class="text-right">%d</td></tr>' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $crap);
    }
    foreach ($methodRisks as $methodName => $crap) {
      list($class, $method) = explode('::', $methodName);
      $result['method'] .= sprintf('       <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d</td></tr>' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $crap);
    }
    return $result;
  }
  protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) {
    return sprintf('        <li><a href="index.html">%s</a></li>' . "\n" . '        <li class="active">(Dashboard)</li>' . "\n", $node
      ->getName());
  }

}

Members

Namesort descending Modifiers Type Description Overrides
PHP_CodeCoverage_Report_HTML_Renderer::$date protected property
PHP_CodeCoverage_Report_HTML_Renderer::$generator protected property
PHP_CodeCoverage_Report_HTML_Renderer::$highLowerBound protected property
PHP_CodeCoverage_Report_HTML_Renderer::$lowUpperBound protected property
PHP_CodeCoverage_Report_HTML_Renderer::$templatePath protected property
PHP_CodeCoverage_Report_HTML_Renderer::$version protected property
PHP_CodeCoverage_Report_HTML_Renderer::getBreadcrumbs protected function
PHP_CodeCoverage_Report_HTML_Renderer::getColorLevel protected function
PHP_CodeCoverage_Report_HTML_Renderer::getCoverageBar protected function
PHP_CodeCoverage_Report_HTML_Renderer::getInactiveBreadcrumb protected function
PHP_CodeCoverage_Report_HTML_Renderer::getPathToRoot protected function
PHP_CodeCoverage_Report_HTML_Renderer::renderItemTemplate protected function
PHP_CodeCoverage_Report_HTML_Renderer::setCommonTemplateVariables protected function
PHP_CodeCoverage_Report_HTML_Renderer::__construct public function Constructor. 1
PHP_CodeCoverage_Report_HTML_Renderer_Dashboard::complexity protected function Returns the data for the Class/Method Complexity charts.
PHP_CodeCoverage_Report_HTML_Renderer_Dashboard::coverageDistribution protected function Returns the data for the Class / Method Coverage Distribution chart.
PHP_CodeCoverage_Report_HTML_Renderer_Dashboard::getActiveBreadcrumb protected function Overrides PHP_CodeCoverage_Report_HTML_Renderer::getActiveBreadcrumb
PHP_CodeCoverage_Report_HTML_Renderer_Dashboard::insufficientCoverage protected function Returns the classes / methods with insufficient coverage.
PHP_CodeCoverage_Report_HTML_Renderer_Dashboard::projectRisks protected function Returns the project risks according to the CRAP index.
PHP_CodeCoverage_Report_HTML_Renderer_Dashboard::render public function