diff --git a/.travis.yml b/.travis.yml index b9c764b5..8075f52f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,6 +61,7 @@ jobs: allow_failures: - stage: Static Analysis (informative) - stage: Code Coverage + - php: nightly dist: xenial diff --git a/src/CodeCoverage/Collector.php b/src/CodeCoverage/Collector.php index 1e80412d..585b6b52 100644 --- a/src/CodeCoverage/Collector.php +++ b/src/CodeCoverage/Collector.php @@ -30,9 +30,9 @@ class Collector public static function detectEngines(): array { return array_filter([ - extension_loaded('pcov') ? self::ENGINE_PCOV : null, - defined('PHPDBG_VERSION') ? self::ENGINE_PHPDBG : null, - extension_loaded('xdebug') ? self::ENGINE_XDEBUG : null, + extension_loaded('pcov') ? [self::ENGINE_PCOV, phpversion('pcov')] : null, + defined('PHPDBG_VERSION') ? [self::ENGINE_PHPDBG, PHPDBG_VERSION] : null, + extension_loaded('xdebug') ? [self::ENGINE_XDEBUG, phpversion('xdebug')] : null, ]); } @@ -52,7 +52,11 @@ public static function start(string $file, string $engine): void if (self::isStarted()) { throw new \LogicException('Code coverage collector has been already started.'); - } elseif (!in_array($engine, self::detectEngines(), true)) { + } elseif (!in_array( + $engine, + array_map(function (array $engineInfo) { return $engineInfo[0]; }, self::detectEngines()), + true + )) { throw new \LogicException("Code coverage engine '$engine' is not supported."); } diff --git a/src/CodeCoverage/Generators/template.phtml b/src/CodeCoverage/Generators/template.phtml index 4db2a3e3..0fb4e126 100644 --- a/src/CodeCoverage/Generators/template.phtml +++ b/src/CodeCoverage/Generators/template.phtml @@ -10,12 +10,12 @@
-' => "",
+ '' => '',
+ '
' => '
',
+ ]);
+ $jsonData[$currentId] = $data;
+} ?>
+
+
+ = $title ? htmlspecialchars("$title - ") : ''; ?>Code coverage = round($coveredPercent) ?> %
+ sources have = number_format($allLinesCount) ?> lines of code in = number_format(count($files)) ?> files
+
+
+
+
+
+
- class ? " class='$info->class'" : '' ?>>
- = $info->coverage ?> %
-
- = $info->name ?>
-
+
+
+
+ ↓↑ %
+
+
+
+
+
+ path↓↑
+
+
+
+
+
+
+
+
+
+
+
+ addClickListener('tab-item', function(e) {
+ e.preventDefault();
+ let tabs = document.getElementsByClassName('tab-content');
+ for (let i = 0; i < tabs.length; i++) {
+ tabs[i].style.display = 'none';
+ }
+ let tabItems = document.getElementsByClassName('tab-item');
+ for (let i = 0; i < tabItems.length; i++) {
+ tabItems[i].classList.remove('active');
+ }
+ this.classList.add('active');
+
+ let id = this.href.split('#')[1];
+ if (id === 'files') {
+ initFiles();
+ } else {
+ initDirectories();
+ }
+
+ let el = document.getElementById(id);
+ if (el.style.display === 'block') {
+ el.style.display = 'none';
+ } else {
+ el.style.display = 'block';
+ }
+ });
+
+ document.addEventListener("DOMContentLoaded", function(event) {
+ initFiles(true);
+
+ let el = document.getElementById(window.location.hash.replace(/^#|L\d+$/g, ''));
+ if (el) {
+ initFileContent(el);
+ el.style.display = 'block';
+ }
+ });
+ })();
+