From 4a5e731701153a2952e7d3b383b85589e0ac159d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 15 Jul 2015 18:03:57 +0200 Subject: [PATCH 001/114] Added a phpdbg based code coverage driver. Uses phpdbg to create code coverage reports, without x-debug. Phpdbg works on opcode basis therefore code coverage numbers differ in comparison to x-debug. --- src/CodeCoverage/Driver.php | 6 ++ src/CodeCoverage/Driver/Phpdbg.php | 108 +++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 src/CodeCoverage/Driver/Phpdbg.php diff --git a/src/CodeCoverage/Driver.php b/src/CodeCoverage/Driver.php index 0c5f6d5ac..71d4b83a4 100644 --- a/src/CodeCoverage/Driver.php +++ b/src/CodeCoverage/Driver.php @@ -15,6 +15,12 @@ */ interface PHP_CodeCoverage_Driver { + // const values map to the defaults provided by xdebug-code-coverage + // see http://xdebug.org/docs/code_coverage + const LINE_EXECUTED = 1; + const LINE_NOT_EXECUTED = -1; + const LINE_NOT_EXECUTABLE = -2; + /** * Start collection of code coverage information. */ diff --git a/src/CodeCoverage/Driver/Phpdbg.php b/src/CodeCoverage/Driver/Phpdbg.php new file mode 100644 index 000000000..61632b625 --- /dev/null +++ b/src/CodeCoverage/Driver/Phpdbg.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Driver for Phpdbg's code coverage functionality. + * + * @since Class available since Release 2.2.0 + * @codeCoverageIgnore + */ +class PHP_CodeCoverage_Driver_Phpdbg implements PHP_CodeCoverage_Driver +{ + /** + * Constructor. + */ + public function __construct() + { + if (PHP_SAPI !== 'phpdbg') { + throw new PHP_CodeCoverage_Exception('This driver requires the phpdbg sapi'); + } + + if (version_compare(phpversion(), '7.0', '<')) { + // actually we require the phpdbg version shipped with php7, not php7 itself + throw new PHP_CodeCoverage_Exception( + 'phpdbg based code coverage requires at least php7' + ); + } + } + + /** + * Start collection of code coverage information. + */ + public function start() + { + phpdbg_start_oplog(); + } + + /** + * Stop collection of code coverage information. + * + * @return array + */ + public function stop() + { + $sourceLines = $this->fetchSourceLines(); + + $dbgData = phpdbg_end_oplog(array('show_unexecuted' => true)); + $data = $this->detectExecutedLines($sourceLines, $dbgData); + + return $data; + } + + /** + * Fetches all lines loaded at the time of calling, each source line marked as not executed. + * + * @return string + */ + private function fetchSourceLines() + { + $sourceLines = array(); + + foreach(get_included_files() as $file) { + foreach(token_get_all(file_get_contents($file)) as $token) { + + if (is_array($token)) { + list($name, $data, $lineNo) = $token; + + switch($name) { + case T_COMMENT: + case T_DOC_COMMENT: + case T_WHITESPACE: + // comments and whitespaces can never be executed, therefore skip them. + break; + default: { + $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; + } + } + } + } + } + + return $sourceLines; + } + + /** + * Convert phpdbg based data into the format CodeCoverage expects + * + * @param array $sourceLines + * @param array $dbgData + * @return array + */ + private function detectExecutedLines(array $sourceLines, array $dbgData) + { + foreach ($dbgData as $file => $coveredLines) { + foreach($coveredLines as $lineNo => $numExecuted) { + $sourceLines[$file][$lineNo] = $numExecuted > 0 ? self::LINE_EXECUTED : self::LINE_NOT_EXECUTED; + } + } + + return $sourceLines; + } +} From 5a952f430e9a4e6066ea53a93312fc28e5bff5aa Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 22 Jul 2015 17:35:36 +0200 Subject: [PATCH 002/114] Better coverage info --- src/CodeCoverage/Driver/Phpdbg.php | 46 +++++++----------------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/src/CodeCoverage/Driver/Phpdbg.php b/src/CodeCoverage/Driver/Phpdbg.php index 61632b625..ac06d8ed1 100644 --- a/src/CodeCoverage/Driver/Phpdbg.php +++ b/src/CodeCoverage/Driver/Phpdbg.php @@ -48,44 +48,18 @@ public function start() */ public function stop() { - $sourceLines = $this->fetchSourceLines(); + $dbgData = phpdbg_end_oplog(); - $dbgData = phpdbg_end_oplog(array('show_unexecuted' => true)); - $data = $this->detectExecutedLines($sourceLines, $dbgData); - - return $data; - } - - /** - * Fetches all lines loaded at the time of calling, each source line marked as not executed. - * - * @return string - */ - private function fetchSourceLines() - { - $sourceLines = array(); - - foreach(get_included_files() as $file) { - foreach(token_get_all(file_get_contents($file)) as $token) { - - if (is_array($token)) { - list($name, $data, $lineNo) = $token; - - switch($name) { - case T_COMMENT: - case T_DOC_COMMENT: - case T_WHITESPACE: - // comments and whitespaces can never be executed, therefore skip them. - break; - default: { - $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; - } - } - } + $sourceLines = phpdbg_get_executable(); + foreach ($sourceLines as &$lines) { + foreach ($lines as &$line) { + $line = self::LINE_NOT_EXECUTED; } } - return $sourceLines; + $data = $this->detectExecutedLines($sourceLines, $dbgData); + + return $data; } /** @@ -98,8 +72,8 @@ private function fetchSourceLines() private function detectExecutedLines(array $sourceLines, array $dbgData) { foreach ($dbgData as $file => $coveredLines) { - foreach($coveredLines as $lineNo => $numExecuted) { - $sourceLines[$file][$lineNo] = $numExecuted > 0 ? self::LINE_EXECUTED : self::LINE_NOT_EXECUTED; + foreach ($coveredLines as $lineNo => $numExecuted) { + $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; } } From 8fc8dfdb0a9cdcf13b812c05380a4108d197cb99 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 22 Jul 2015 18:26:05 +0200 Subject: [PATCH 003/114] Add caching of source line fetching --- src/CodeCoverage/Driver/Phpdbg.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/CodeCoverage/Driver/Phpdbg.php b/src/CodeCoverage/Driver/Phpdbg.php index ac06d8ed1..ccdc9a342 100644 --- a/src/CodeCoverage/Driver/Phpdbg.php +++ b/src/CodeCoverage/Driver/Phpdbg.php @@ -48,16 +48,30 @@ public function start() */ public function stop() { + static $fetchedLines = array(); + $dbgData = phpdbg_end_oplog(); - $sourceLines = phpdbg_get_executable(); + if ($fetchedLines == array()) { + $sourceLines = phpdbg_get_executable(); + } else { + $newFiles = array_diff(get_included_files(), array_keys($fetchedLines)); + if ($newFiles) { + $sourceLines = phpdbg_get_executable(array("files" => $newFiles)); + } else { + $sourceLines = array(); + } + } + foreach ($sourceLines as &$lines) { foreach ($lines as &$line) { $line = self::LINE_NOT_EXECUTED; } } - $data = $this->detectExecutedLines($sourceLines, $dbgData); + $fetchedLines += $sourceLines; + + $data = $this->detectExecutedLines($fetchedLines, $dbgData); return $data; } From fa3d8806bd6895461e68b3d333930ef036954a65 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 24 Jul 2015 15:26:12 +0200 Subject: [PATCH 004/114] detect phpdbg and use the driver subsequently TODO: Move this check into Environment\Runtime --- composer.json | 11 +++++++++-- src/CodeCoverage.php | 14 +++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index 77d41ce79..0bcff5bce 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", - "sebastian/environment": "~1.0", + "sebastian/environment": "dev-phpdbg_cc", "sebastian/version": "~1.0" }, "require-dev": { @@ -46,5 +46,12 @@ "branch-alias": { "dev-master": "2.2.x-dev" } - } + }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/staabm/environment" + } + ] + } diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index a77333c93..09269f02e 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -96,13 +96,17 @@ class PHP_CodeCoverage public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null) { if ($driver === null) { - $runtime = new Runtime; + if (PHP_SAPI === 'phpdbg') { + $driver = new PHP_CodeCoverage_Driver_Phpdbg; + } else { + $runtime = new Runtime; - if (!$runtime->hasXdebug()) { - throw new PHP_CodeCoverage_Exception('No code coverage driver available'); - } + if (!$runtime->hasXdebug()) { + throw new PHP_CodeCoverage_Exception('No code coverage driver available'); + } - $driver = new PHP_CodeCoverage_Driver_Xdebug; + $driver = new PHP_CodeCoverage_Driver_Xdebug; + } } if ($filter === null) { From 16314f98e2e6a50368d3290d88380f317d12b5f8 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 10:52:16 +0200 Subject: [PATCH 005/114] Do not use a fork of sebastian/environment --- composer.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index 0bcff5bce..ad87252ed 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", - "sebastian/environment": "dev-phpdbg_cc", + "sebastian/environment": "~1.3", "sebastian/version": "~1.0" }, "require-dev": { @@ -46,12 +46,5 @@ "branch-alias": { "dev-master": "2.2.x-dev" } - }, - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/staabm/environment" - } - ] - + } } From e5852f2e99e4164ade831058f7aea01939bebd5b Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 11:02:40 +0200 Subject: [PATCH 006/114] Fix CS/WS issues --- .../Driver/{Phpdbg.php => PHPDBG.php} | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) rename src/CodeCoverage/Driver/{Phpdbg.php => PHPDBG.php} (70%) diff --git a/src/CodeCoverage/Driver/Phpdbg.php b/src/CodeCoverage/Driver/PHPDBG.php similarity index 70% rename from src/CodeCoverage/Driver/Phpdbg.php rename to src/CodeCoverage/Driver/PHPDBG.php index ccdc9a342..e18f47f40 100644 --- a/src/CodeCoverage/Driver/Phpdbg.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -9,12 +9,12 @@ */ /** - * Driver for Phpdbg's code coverage functionality. + * Driver for PHPDBG's code coverage functionality. * * @since Class available since Release 2.2.0 * @codeCoverageIgnore */ -class PHP_CodeCoverage_Driver_Phpdbg implements PHP_CodeCoverage_Driver +class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver { /** * Constructor. @@ -22,13 +22,14 @@ class PHP_CodeCoverage_Driver_Phpdbg implements PHP_CodeCoverage_Driver public function __construct() { if (PHP_SAPI !== 'phpdbg') { - throw new PHP_CodeCoverage_Exception('This driver requires the phpdbg sapi'); + throw new PHP_CodeCoverage_Exception( + 'This driver requires the PHPDBG SAPI' + ); } - if (version_compare(phpversion(), '7.0', '<')) { - // actually we require the phpdbg version shipped with php7, not php7 itself + if (!function_exists('phpdbg_start_oplog')) { throw new PHP_CodeCoverage_Exception( - 'phpdbg based code coverage requires at least php7' + 'This build of PHPDBG does not support code coverage' ); } } @@ -55,9 +56,15 @@ public function stop() if ($fetchedLines == array()) { $sourceLines = phpdbg_get_executable(); } else { - $newFiles = array_diff(get_included_files(), array_keys($fetchedLines)); + $newFiles = array_diff( + get_included_files(), + array_keys($fetchedLines) + ); + if ($newFiles) { - $sourceLines = phpdbg_get_executable(array("files" => $newFiles)); + $sourceLines = phpdbg_get_executable( + array('files' => $newFiles) + ); } else { $sourceLines = array(); } @@ -69,11 +76,9 @@ public function stop() } } - $fetchedLines += $sourceLines; - - $data = $this->detectExecutedLines($fetchedLines, $dbgData); + $fetchedLines = array_merge($fetchedLines, $sourceLines); - return $data; + return $this->detectExecutedLines($fetchedLines, $dbgData); } /** From 245f47cf97a1b075b4f8e2f66e36c6dec1565a06 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 11:05:00 +0200 Subject: [PATCH 007/114] Refactor selection of code coverage driver --- src/CodeCoverage.php | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 09269f02e..6b63d967f 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -96,17 +96,7 @@ class PHP_CodeCoverage public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null) { if ($driver === null) { - if (PHP_SAPI === 'phpdbg') { - $driver = new PHP_CodeCoverage_Driver_Phpdbg; - } else { - $runtime = new Runtime; - - if (!$runtime->hasXdebug()) { - throw new PHP_CodeCoverage_Exception('No code coverage driver available'); - } - - $driver = new PHP_CodeCoverage_Driver_Xdebug; - } + $driver = $this->selectDriver(); } if ($filter === null) { @@ -905,4 +895,23 @@ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) return $allowedLines; } + + /** + * @return PHP_CodeCoverage_Driver + * @throws PHP_CodeCoverage_Exception + */ + private function selectDriver() + { + $runtime = new Runtime; + + if (!$runtime->canCollectCodeCoverage()) { + throw new PHP_CodeCoverage_Exception('No code coverage driver available'); + } + + if ($runtime->isPHPDBG()) { + return new PHP_CodeCoverage_Driver_PHPDBG; + } else { + return new PHP_CodeCoverage_Driver_Xdebug; + } + } } From 220148ee11c4384e9c7da4fed72b31b4b14fc0dd Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 11:14:30 +0200 Subject: [PATCH 008/114] This is still 2.2-dev for now --- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index e0c776ad8..350ff0bd9 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('2.2', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From f947634222ffa0db9515f723d41f31bf43acbca2 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 11:15:15 +0200 Subject: [PATCH 009/114] Fix CS/WS issues --- src/CodeCoverage/Driver/PHPDBG.php | 2 +- src/CodeCoverage/Report/HTML/Renderer/File.php | 2 +- src/CodeCoverage/Report/XML/Tests.php | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index e18f47f40..bc6ed858f 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -39,7 +39,7 @@ public function __construct() */ public function start() { - phpdbg_start_oplog(); + phpdbg_start_oplog(); } /** diff --git a/src/CodeCoverage/Report/HTML/Renderer/File.php b/src/CodeCoverage/Report/HTML/Renderer/File.php index cc8278b36..d52345d50 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/File.php +++ b/src/CodeCoverage/Report/HTML/Renderer/File.php @@ -439,7 +439,7 @@ protected function loadFile($file) continue; } - list ($token, $value) = $token; + list($token, $value) = $token; $value = str_replace( array("\t", ' '), diff --git a/src/CodeCoverage/Report/XML/Tests.php b/src/CodeCoverage/Report/XML/Tests.php index bca884ea6..46214679b 100644 --- a/src/CodeCoverage/Report/XML/Tests.php +++ b/src/CodeCoverage/Report/XML/Tests.php @@ -41,6 +41,5 @@ public function addTest($test, array $result) $node->setAttribute('size', $result['size']); $node->setAttribute('result', (int) $result['status']); $node->setAttribute('status', $this->codeMap[(int) $result['status']]); - } } From d0f0ce5a31b99ddf571332e5986785da7c57154c Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 11:18:41 +0200 Subject: [PATCH 010/114] Add docblocks --- src/CodeCoverage/Driver.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/CodeCoverage/Driver.php b/src/CodeCoverage/Driver.php index 71d4b83a4..8635acefe 100644 --- a/src/CodeCoverage/Driver.php +++ b/src/CodeCoverage/Driver.php @@ -15,10 +15,22 @@ */ interface PHP_CodeCoverage_Driver { - // const values map to the defaults provided by xdebug-code-coverage - // see http://xdebug.org/docs/code_coverage + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ const LINE_EXECUTED = 1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ const LINE_NOT_EXECUTED = -1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ const LINE_NOT_EXECUTABLE = -2; /** From 48bea1f4aa5fe4eb5547bb578bca39a5b2431915 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 26 Jul 2015 11:20:10 +0200 Subject: [PATCH 011/114] Move constant declarations to only class where they are used --- src/CodeCoverage/Driver.php | 18 ------------------ src/CodeCoverage/Driver/PHPDBG.php | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/CodeCoverage/Driver.php b/src/CodeCoverage/Driver.php index 8635acefe..0c5f6d5ac 100644 --- a/src/CodeCoverage/Driver.php +++ b/src/CodeCoverage/Driver.php @@ -15,24 +15,6 @@ */ interface PHP_CodeCoverage_Driver { - /** - * @var int - * @see http://xdebug.org/docs/code_coverage - */ - const LINE_EXECUTED = 1; - - /** - * @var int - * @see http://xdebug.org/docs/code_coverage - */ - const LINE_NOT_EXECUTED = -1; - - /** - * @var int - * @see http://xdebug.org/docs/code_coverage - */ - const LINE_NOT_EXECUTABLE = -2; - /** * Start collection of code coverage information. */ diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index bc6ed858f..54dfafe31 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -16,6 +16,24 @@ */ class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver { + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_EXECUTED = 1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_NOT_EXECUTED = -1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_NOT_EXECUTABLE = -2; + /** * Constructor. */ From 806e403ac56351b52ee771d47ff6e9fa2770c616 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Jul 2015 12:26:39 +0200 Subject: [PATCH 012/114] fixes most false-positives in phpdbg code coverage. refs #361 --- src/CodeCoverage/Driver/PHPDBG.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index 54dfafe31..7f8c1240f 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -88,9 +88,9 @@ public function stop() } } - foreach ($sourceLines as &$lines) { - foreach ($lines as &$line) { - $line = self::LINE_NOT_EXECUTED; + foreach ($sourceLines as $file => $lines) { + foreach ($lines as $lineNo => $numExecuted) { + $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; } } From 2aea161c61aaa7780a8416c736146757331cb601 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 27 Jul 2015 12:57:15 +0200 Subject: [PATCH 013/114] Revert "Move constant declarations to only class where they are used" This reverts commit 48bea1f4aa5fe4eb5547bb578bca39a5b2431915. --- src/CodeCoverage/Driver.php | 18 ++++++++++++++++++ src/CodeCoverage/Driver/PHPDBG.php | 18 ------------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/CodeCoverage/Driver.php b/src/CodeCoverage/Driver.php index 0c5f6d5ac..8635acefe 100644 --- a/src/CodeCoverage/Driver.php +++ b/src/CodeCoverage/Driver.php @@ -15,6 +15,24 @@ */ interface PHP_CodeCoverage_Driver { + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_EXECUTED = 1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_NOT_EXECUTED = -1; + + /** + * @var int + * @see http://xdebug.org/docs/code_coverage + */ + const LINE_NOT_EXECUTABLE = -2; + /** * Start collection of code coverage information. */ diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index 7f8c1240f..3aac8f9dd 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -16,24 +16,6 @@ */ class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver { - /** - * @var int - * @see http://xdebug.org/docs/code_coverage - */ - const LINE_EXECUTED = 1; - - /** - * @var int - * @see http://xdebug.org/docs/code_coverage - */ - const LINE_NOT_EXECUTED = -1; - - /** - * @var int - * @see http://xdebug.org/docs/code_coverage - */ - const LINE_NOT_EXECUTABLE = -2; - /** * Constructor. */ From 65a34734fa1d96c84ea3582151214ac1728ad221 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Jul 2015 14:20:27 +0200 Subject: [PATCH 014/114] fixed coverage errors, when phpgdb reports line-no 0. refs #361. --- src/CodeCoverage/Driver/PHPDBG.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index 3aac8f9dd..f3eb6214a 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -92,7 +92,11 @@ private function detectExecutedLines(array $sourceLines, array $dbgData) { foreach ($dbgData as $file => $coveredLines) { foreach ($coveredLines as $lineNo => $numExecuted) { - $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; + // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown. + // make sure we only mark lines executed which are actually executable. + if (isset($sourceLines[$file][$lineNo])) { + $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; + } } } From df29d420311aa94ed1eb26560b573710f3603b2d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 27 Jul 2015 14:26:22 +0200 Subject: [PATCH 015/114] use PHP_CodeCoverage_Driver::* constants instead of magic values. --- src/CodeCoverage.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 6b63d967f..6c6061538 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -324,7 +324,7 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere } foreach ($lines as $k => $v) { - if ($v == 1) { + if ($v == PHP_CodeCoverage_Driver::LINE_EXECUTED) { if (empty($this->data[$file][$k]) || !in_array($id, $this->data[$file][$k])) { $this->data[$file][$k][] = $id; } @@ -613,7 +613,7 @@ private function addUncoveredFilesFromWhitelist() $lines = count(file($uncoveredFile)); for ($i = 1; $i <= $lines; $i++) { - $data[$uncoveredFile][$i] = -1; + $data[$uncoveredFile][$i] = PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED; } } } @@ -636,8 +636,8 @@ private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, if (!isset($data[$file]) && in_array($file, $uncoveredFiles)) { foreach (array_keys($fileCoverage) as $key) { - if ($fileCoverage[$key] == 1) { - $fileCoverage[$key] = -1; + if ($fileCoverage[$key] == PHP_CodeCoverage_Driver::LINE_EXECUTED) { + $fileCoverage[$key] = PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED; } } From e6577d90f61a9adbe94544a6e9a7ca18b5fd9c8f Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sat, 1 Aug 2015 07:09:57 +0200 Subject: [PATCH 016/114] Prepare release --- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 350ff0bd9..fb343477b 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('2.2', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('2.2.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From a5402c806385366dc0bb5a885ff47685d129ddac Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sat, 1 Aug 2015 07:20:12 +0200 Subject: [PATCH 017/114] Initial work on ChangeLog --- ChangeLog-2.2.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 ChangeLog-2.2.md diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md new file mode 100644 index 000000000..877f02d6b --- /dev/null +++ b/ChangeLog-2.2.md @@ -0,0 +1,21 @@ +# Changes in PHP_CodeCoverage 2.2 + +All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [2.2.0] - 2015-08-01 + +### Added + +* Added a driver for PHPDBG (requires PHP 7) +* Added `PHP_CodeCoverage::setDisableIgnoredLines()` to disable the ignoring of lines using annotations such as `@codeCoverageIgnore` + +### Changed + +* Annotating a method with `@deprecated` now has the same effect as annotating it with `@codeCoverageIgnore` + +### Removed + +* The dedicated driver for HHVM, `PHP_CodeCoverage_Driver_HHVM` has been removed + +[2.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.1...2.2.0 + From 0edb5c652776cf21a84a8b5cbb38ef79167b7ffe Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 2 Aug 2015 06:45:03 +0200 Subject: [PATCH 018/114] Bump dependency --- ChangeLog-2.2.md | 6 ++++++ composer.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 877f02d6b..139a0fb5b 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [2.2.0] - 2015-08-02 + +### Changed + +* Bumped required version of `sebastian/environment` to 1.3.1 for [#365](https://github.com/sebastianbergmann/php-code-coverage/issues/365) + ## [2.2.0] - 2015-08-01 ### Added diff --git a/composer.json b/composer.json index ad87252ed..f369f8b06 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", - "sebastian/environment": "~1.3", + "sebastian/environment": "~1.3.1", "sebastian/version": "~1.0" }, "require-dev": { From 6526d9bdb56e2af1e8950114d42391044d18cfa7 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 2 Aug 2015 06:45:08 +0200 Subject: [PATCH 019/114] Prepare release --- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index fb343477b..a025cd505 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('2.2.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('2.2.1', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From d12d0008c34f8323d87571ff52cc66d8749d26d8 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 2 Aug 2015 09:32:17 +0200 Subject: [PATCH 020/114] See https://github.com/sebastianbergmann/php-code-coverage/commit/0edb5c652776cf21a84a8b5cbb38ef79167b7ffe#commitcomment-12482120 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f369f8b06..8292051d8 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", - "sebastian/environment": "~1.3.1", + "sebastian/environment": "^1.3.1", "sebastian/version": "~1.0" }, "require-dev": { From 368bf98197397b5a03c9ffeaedacd17d77bd8e8a Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Sun, 2 Aug 2015 11:11:38 +0100 Subject: [PATCH 021/114] Fixed typo --- ChangeLog-2.2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 139a0fb5b..dcebc10a0 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [2.2.0] - 2015-08-02 +## [2.2.1] - 2015-08-02 ### Changed From f41108eb9d8282cad3274e87a6b1b3478d9f8ce0 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 2 Aug 2015 12:50:04 +0200 Subject: [PATCH 022/114] Leftover from 368bf98197397b5a03c9ffeaedacd17d77bd8e8a --- ChangeLog-2.2.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index dcebc10a0..807ff0de5 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -23,5 +23,6 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in * The dedicated driver for HHVM, `PHP_CodeCoverage_Driver_HHVM` has been removed +[2.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.0...2.2.1 [2.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.1...2.2.0 From f1f69521a39f9e841a9b300cffcc5c213efcb5ba Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 3 Aug 2015 08:17:31 +0200 Subject: [PATCH 023/114] Bump dependency --- ChangeLog-2.2.md | 7 +++++++ composer.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 807ff0de5..de44ef62d 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [2.2.2] - 2015-08-DD + +### Changed + +* Bumped required version of `sebastian/environment` to 1.3.2 for [#365](https://github.com/sebastianbergmann/php-code-coverage/issues/365) + ## [2.2.1] - 2015-08-02 ### Changed @@ -23,6 +29,7 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in * The dedicated driver for HHVM, `PHP_CodeCoverage_Driver_HHVM` has been removed +[2.2.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.1...2.2.2 [2.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.0...2.2.1 [2.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.1...2.2.0 diff --git a/composer.json b/composer.json index 8292051d8..55f9fd077 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", - "sebastian/environment": "^1.3.1", + "sebastian/environment": "^1.3.2", "sebastian/version": "~1.0" }, "require-dev": { From 02f5f134b38ad6001dc9cff18488353161520d85 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 3 Aug 2015 08:35:59 +0200 Subject: [PATCH 024/114] Closes #365 --- ChangeLog-2.2.md | 4 ++++ src/CodeCoverage.php | 4 +++- src/CodeCoverage/Driver/HHVM.php | 26 ++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/CodeCoverage/Driver/HHVM.php diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index de44ef62d..61555038e 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -4,6 +4,10 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in ## [2.2.2] - 2015-08-DD +### Added + +* Reintroduced the `PHP_CodeCoverage_Driver_HHVM` driver as an extension of `PHP_CodeCoverage_Driver_Xdebug` that does not use `xdebug_start_code_coverage()` with options not supported by HHVM + ### Changed * Bumped required version of `sebastian/environment` to 1.3.2 for [#365](https://github.com/sebastianbergmann/php-code-coverage/issues/365) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 6c6061538..0bb582e5b 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -908,7 +908,9 @@ private function selectDriver() throw new PHP_CodeCoverage_Exception('No code coverage driver available'); } - if ($runtime->isPHPDBG()) { + if ($runtime->isHHVM()) { + return new PHP_CodeCoverage_Driver_HHVM; + } elseif ($runtime->isPHPDBG()) { return new PHP_CodeCoverage_Driver_PHPDBG; } else { return new PHP_CodeCoverage_Driver_Xdebug; diff --git a/src/CodeCoverage/Driver/HHVM.php b/src/CodeCoverage/Driver/HHVM.php new file mode 100644 index 000000000..a9d8f0cef --- /dev/null +++ b/src/CodeCoverage/Driver/HHVM.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Driver for HHVM's code coverage functionality. + * + * @since Class available since Release 2.2.2 + * @codeCoverageIgnore + */ +class PHP_CodeCoverage_Driver_HHVM extends PHP_CodeCoverage_Driver_Xdebug +{ + /** + * Start collection of code coverage information. + */ + public function start() + { + xdebug_start_code_coverage(); + } +} From 2d7c03c0e4e080901b8f33b2897b0577be18a13c Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 4 Aug 2015 05:42:15 +0200 Subject: [PATCH 025/114] Prepare release 2.2.2 --- ChangeLog-2.2.md | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 61555038e..a50b77299 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [2.2.2] - 2015-08-DD +## [2.2.2] - 2015-08-04 ### Added diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index a025cd505..f5cabffc0 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('2.2.1', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('2.2.2', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From ad5c930dcd6920783d035ff1557bb9de3d6a7bed Mon Sep 17 00:00:00 2001 From: Mahmoud Fawzy Date: Mon, 3 Aug 2015 18:53:47 +0200 Subject: [PATCH 026/114] Respect BlackListing/WhiteListing of merged .cov files Black Lists and White Lists of merged .cov files should be merged into their counterparts in the current coverage report before actually checking for them. in `$this->filter->isFiltered($file)` --- src/CodeCoverage.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 0bb582e5b..211666c0c 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -340,6 +340,14 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere */ public function merge(PHP_CodeCoverage $that) { + $this->filter->setBlacklistedFiles( + array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles()) + ); + + $this->filter->setWhitelistedFiles( + array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) + ); + foreach ($that->data as $file => $lines) { if (!isset($this->data[$file])) { if (!$this->filter->isFiltered($file)) { @@ -364,13 +372,6 @@ public function merge(PHP_CodeCoverage $that) $this->tests = array_merge($this->tests, $that->getTests()); - $this->filter->setBlacklistedFiles( - array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles()) - ); - - $this->filter->setWhitelistedFiles( - array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) - ); } /** From 40103f9b335f1d84daed099f180b9de12ba080e7 Mon Sep 17 00:00:00 2001 From: Mahmoud Fawzy Date: Mon, 3 Aug 2015 23:01:55 +0200 Subject: [PATCH 027/114] Fixing CS issue.. --- src/CodeCoverage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 211666c0c..8af612f3a 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -340,7 +340,7 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere */ public function merge(PHP_CodeCoverage $that) { - $this->filter->setBlacklistedFiles( + $this->filter->setBlacklistedFiles( array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles()) ); From 3fa7a50f313e89179d5814a854d5c0480d19c206 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sat, 15 Aug 2015 16:48:47 +0200 Subject: [PATCH 028/114] Remove redundant null check --- src/CodeCoverage/Report/Node/File.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 03b3d8cf8..5a3015122 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -380,8 +380,7 @@ protected function calculateStatistics() } } - if (isset($this->coverageData[$lineNumber]) && - $this->coverageData[$lineNumber] !== null) { + if (isset($this->coverageData[$lineNumber])) { if (isset($currentClass)) { $currentClass['executableLines']++; } From 71a668cbfbf0919e163bfdb85f627eadce03fb3c Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sat, 15 Aug 2015 17:25:21 +0200 Subject: [PATCH 029/114] Fix coverage for nested functions and classes --- src/CodeCoverage/Report/Node/File.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 5a3015122..9edf596b0 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -351,6 +351,8 @@ public function getNumTestedFunctions() */ protected function calculateStatistics() { + $classStack = $functionStack = []; + if ($this->cacheTokens) { $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath()); } else { @@ -367,6 +369,10 @@ protected function calculateStatistics() if (isset($this->startLines[$lineNumber])) { // Start line of a class. if (isset($this->startLines[$lineNumber]['className'])) { + if (isset($currentClass)) { + $classStack[] = &$currentClass; + } + $currentClass = &$this->startLines[$lineNumber]; } // Start line of a trait. elseif (isset($this->startLines[$lineNumber]['traitName'])) { @@ -376,6 +382,10 @@ protected function calculateStatistics() $currentMethod = &$this->startLines[$lineNumber]; } // Start line of a function. elseif (isset($this->startLines[$lineNumber]['functionName'])) { + if (isset($currentFunction)) { + $functionStack[] = &$currentFunction; + } + $currentFunction = &$this->startLines[$lineNumber]; } } @@ -424,6 +434,13 @@ protected function calculateStatistics() // End line of a class. if (isset($this->endLines[$lineNumber]['className'])) { unset($currentClass); + + if ($classStack) { + end($classStack); + $key = key($classStack); + $currentClass = &$classStack[$key]; + unset($classStack[$key]); + } } // End line of a trait. elseif (isset($this->endLines[$lineNumber]['traitName'])) { unset($currentTrait); @@ -433,6 +450,13 @@ protected function calculateStatistics() } // End line of a function. elseif (isset($this->endLines[$lineNumber]['functionName'])) { unset($currentFunction); + + if ($functionStack) { + end($functionStack); + $key = key($functionStack); + $currentFunction = &$functionStack[$key]; + unset($functionsStack[$key]); + } } } } From 729fa9395340bc5794472eb1b66bc0480231ba02 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sat, 15 Aug 2015 17:39:35 +0200 Subject: [PATCH 030/114] Add PHP 5.3 compability... --- src/CodeCoverage/Report/Node/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 9edf596b0..0b20cf5c8 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -351,7 +351,7 @@ public function getNumTestedFunctions() */ protected function calculateStatistics() { - $classStack = $functionStack = []; + $classStack = $functionStack = array(); if ($this->cacheTokens) { $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath()); From 0bd35e8bb1877f9c4137c77e3bfe48afcbd467cb Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sun, 16 Aug 2015 11:21:36 +0200 Subject: [PATCH 031/114] Fix typo... --- src/CodeCoverage/Report/Node/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 0b20cf5c8..a02589e39 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -455,7 +455,7 @@ protected function calculateStatistics() end($functionStack); $key = key($functionStack); $currentFunction = &$functionStack[$key]; - unset($functionsStack[$key]); + unset($functionStack[$key]); } } } From e144166f1b2eb41a89ecd2c2e4c155a4d3a3c798 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sun, 16 Aug 2015 12:23:52 +0200 Subject: [PATCH 032/114] Fix #370: Show 0 / 0 for classes without methods instead of empty cell --- src/CodeCoverage/Report/HTML/Renderer.php | 25 +++++++++++++---------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index f5cabffc0..5682b6e8a 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -76,9 +76,6 @@ public function __construct($templatePath, $generator, $date, $lowUpperBound, $h protected function renderItemTemplate(Text_Template $template, array $data) { $numSeparator = ' / '; - $classesBar = ' '; - $classesLevel = 'None'; - $classesNumber = ' '; if (isset($data['numClasses']) && $data['numClasses'] > 0) { $classesLevel = $this->getColorLevel($data['testedClassesPercent']); @@ -89,12 +86,12 @@ protected function renderItemTemplate(Text_Template $template, array $data) $classesBar = $this->getCoverageBar( $data['testedClassesPercent'] ); + } else { + $classesLevel = 'success'; + $classesNumber = '0' . $numSeparator . '0'; + $classesBar = $this->getCoverageBar(100); } - $methodsBar = ' '; - $methodsLevel = 'None'; - $methodsNumber = ' '; - if ($data['numMethods'] > 0) { $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']); @@ -104,12 +101,13 @@ protected function renderItemTemplate(Text_Template $template, array $data) $methodsBar = $this->getCoverageBar( $data['testedMethodsPercent'] ); + } else { + $methodsLevel = 'success'; + $methodsNumber = '0' . $numSeparator . '0'; + $methodsBar = $this->getCoverageBar(100); + $data['testedMethodsPercentAsString'] = '100.00%'; } - $linesBar = ' '; - $linesLevel = 'None'; - $linesNumber = ' '; - if ($data['numExecutableLines'] > 0) { $linesLevel = $this->getColorLevel($data['linesExecutedPercent']); @@ -119,6 +117,11 @@ protected function renderItemTemplate(Text_Template $template, array $data) $linesBar = $this->getCoverageBar( $data['linesExecutedPercent'] ); + } else { + $linesLevel = 'success'; + $linesNumber = '0' . $numSeparator . '0'; + $linesBar = $this->getCoverageBar(100); + $data['linesExecutedPercentAsString'] = '100.00%'; } $template->setVar( From 4fedb6ff05c7c502723ba5ee34edaa6ab4ce30be Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 16 Aug 2015 14:44:10 +0200 Subject: [PATCH 033/114] Fix CS/WS issues --- src/CodeCoverage.php | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 16 ++++++++-------- src/CodeCoverage/Report/Node/File.php | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 8af612f3a..88326f0b7 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -347,7 +347,7 @@ public function merge(PHP_CodeCoverage $that) $this->filter->setWhitelistedFiles( array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) ); - + foreach ($that->data as $file => $lines) { if (!isset($this->data[$file])) { if (!$this->filter->isFiltered($file)) { diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 5682b6e8a..46bf878a3 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -87,9 +87,9 @@ protected function renderItemTemplate(Text_Template $template, array $data) $data['testedClassesPercent'] ); } else { - $classesLevel = 'success'; + $classesLevel = 'success'; $classesNumber = '0' . $numSeparator . '0'; - $classesBar = $this->getCoverageBar(100); + $classesBar = $this->getCoverageBar(100); } if ($data['numMethods'] > 0) { @@ -102,9 +102,9 @@ protected function renderItemTemplate(Text_Template $template, array $data) $data['testedMethodsPercent'] ); } else { - $methodsLevel = 'success'; - $methodsNumber = '0' . $numSeparator . '0'; - $methodsBar = $this->getCoverageBar(100); + $methodsLevel = 'success'; + $methodsNumber = '0' . $numSeparator . '0'; + $methodsBar = $this->getCoverageBar(100); $data['testedMethodsPercentAsString'] = '100.00%'; } @@ -118,9 +118,9 @@ protected function renderItemTemplate(Text_Template $template, array $data) $data['linesExecutedPercent'] ); } else { - $linesLevel = 'success'; - $linesNumber = '0' . $numSeparator . '0'; - $linesBar = $this->getCoverageBar(100); + $linesLevel = 'success'; + $linesNumber = '0' . $numSeparator . '0'; + $linesBar = $this->getCoverageBar(100); $data['linesExecutedPercentAsString'] = '100.00%'; } diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index a02589e39..32e43a6ed 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -437,7 +437,7 @@ protected function calculateStatistics() if ($classStack) { end($classStack); - $key = key($classStack); + $key = key($classStack); $currentClass = &$classStack[$key]; unset($classStack[$key]); } @@ -453,7 +453,7 @@ protected function calculateStatistics() if ($functionStack) { end($functionStack); - $key = key($functionStack); + $key = key($functionStack); $currentFunction = &$functionStack[$key]; unset($functionStack[$key]); } From d846101f6a54684994f5112e949ab8f20dcc1241 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Mon, 17 Aug 2015 09:25:03 +0200 Subject: [PATCH 034/114] Add PHPDBG possibility for PHP 7 to README --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ca608a40..46cb5c410 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,20 @@ ## Requirements * PHP 5.3.3 is required but using the latest version of PHP is highly recommended + +With PHP 5: * [Xdebug](http://xdebug.org/) 2.1.3 is required but using the latest version of Xdebug is highly recommended +With PHP 7: +* [phpdbg](http://phpdbg.com) + ## Installation To add PHP_CodeCoverage as a local, per-project dependency to your project, simply add a dependency on `phpunit/php-code-coverage` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on PHP_CodeCoverage 2.0: { "require": { - "phpunit/php-code-coverage": "~2.0" + "phpunit/php-code-coverage": "^2" } } @@ -37,4 +42,3 @@ $writer->process($coverage, '/tmp/clover.xml'); $writer = new PHP_CodeCoverage_Report_HTML; $writer->process($coverage, '/tmp/code-coverage-report'); ``` - From 7cc4081d084916cfbe87ad7d4bf6941615a4b281 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 17 Aug 2015 09:50:03 +0200 Subject: [PATCH 035/114] Tweak --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 46cb5c410..ec9a5a94d 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,17 @@ * PHP 5.3.3 is required but using the latest version of PHP is highly recommended -With PHP 5: -* [Xdebug](http://xdebug.org/) 2.1.3 is required but using the latest version of Xdebug is highly recommended +### PHP 5 -With PHP 7: -* [phpdbg](http://phpdbg.com) +* [Xdebug](http://xdebug.org/) is the only source of raw code coverage data supported for PHP 5. Version 2.1.3 of Xdebug is required but using the latest version is highly recommended. + +### PHP 7 + +* [phpdbg](http://phpdbg.com/docs) is currently the only source of raw code coverage data supported for PHP 7. Once Xdebug has been updated for PHP 7 it, too, will be supported. + +### HHVM + +* A version of HHVM that implements the Xdebug API for code coverage (`xdebug_*_code_coverage()`) is required. ## Installation From 751653e81e3fcbddbe026f36e6e16fafd0a19f46 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 17 Aug 2015 09:51:01 +0200 Subject: [PATCH 036/114] Leftover from 7cc4081d084916cfbe87ad7d4bf6941615a4b281 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ec9a5a94d..4411d7fc9 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,19 @@ ## Requirements -* PHP 5.3.3 is required but using the latest version of PHP is highly recommended +PHP 5.3.3 is required but using the latest version of PHP is highly recommended ### PHP 5 -* [Xdebug](http://xdebug.org/) is the only source of raw code coverage data supported for PHP 5. Version 2.1.3 of Xdebug is required but using the latest version is highly recommended. +[Xdebug](http://xdebug.org/) is the only source of raw code coverage data supported for PHP 5. Version 2.1.3 of Xdebug is required but using the latest version is highly recommended. ### PHP 7 -* [phpdbg](http://phpdbg.com/docs) is currently the only source of raw code coverage data supported for PHP 7. Once Xdebug has been updated for PHP 7 it, too, will be supported. +[phpdbg](http://phpdbg.com/docs) is currently the only source of raw code coverage data supported for PHP 7. Once Xdebug has been updated for PHP 7 it, too, will be supported. ### HHVM -* A version of HHVM that implements the Xdebug API for code coverage (`xdebug_*_code_coverage()`) is required. +A version of HHVM that implements the Xdebug API for code coverage (`xdebug_*_code_coverage()`) is required. ## Installation From fd7bce82a1cde2d226c5f59437462c62132aaee9 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 13:21:31 +0200 Subject: [PATCH 037/114] Fix docblock --- src/CodeCoverage/Filter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CodeCoverage/Filter.php b/src/CodeCoverage/Filter.php index fd5b6aa21..bb4a25164 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/CodeCoverage/Filter.php @@ -172,7 +172,8 @@ public function removeFileFromWhitelist($filename) /** * Checks whether a filename is a real filename. * - * @param string $filename + * @param string $filename + * @return bool */ public function isFile($filename) { From ab2283bf4a836d7f2ec5f33c15d6802d9f4cb512 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 14:25:27 +0200 Subject: [PATCH 038/114] Fix CS/WS issues --- tests/PHP/CodeCoverage/Report/FactoryTest.php | 108 +++++++++--------- tests/PHP/CodeCoverageTest.php | 6 +- tests/TestCase.php | 12 +- .../CoverageTwoDefaultClassAnnotations.php | 1 - tests/_files/source_with_namespace.php | 4 +- tests/_files/source_without_namespace.php | 4 +- 6 files changed, 67 insertions(+), 68 deletions(-) diff --git a/tests/PHP/CodeCoverage/Report/FactoryTest.php b/tests/PHP/CodeCoverage/Report/FactoryTest.php index fc3e2511a..84f14aea7 100644 --- a/tests/PHP/CodeCoverage/Report/FactoryTest.php +++ b/tests/PHP/CodeCoverage/Report/FactoryTest.php @@ -60,68 +60,68 @@ public function testSomething() 'BankAccount' => array( 'methods' => array( 'getBalance' => array( - 'signature' => 'getBalance()', - 'startLine' => 6, - 'endLine' => 9, + 'signature' => 'getBalance()', + 'startLine' => 6, + 'endLine' => 9, 'executableLines' => 1, - 'executedLines' => 1, - 'ccn' => 1, - 'coverage' => 100, - 'crap' => '1', - 'link' => 'BankAccount.php.html#6', - 'methodName' => 'getBalance' + 'executedLines' => 1, + 'ccn' => 1, + 'coverage' => 100, + 'crap' => '1', + 'link' => 'BankAccount.php.html#6', + 'methodName' => 'getBalance' ), 'setBalance' => array( - 'signature' => 'setBalance($balance)', - 'startLine' => 11, - 'endLine' => 18, + 'signature' => 'setBalance($balance)', + 'startLine' => 11, + 'endLine' => 18, 'executableLines' => 5, - 'executedLines' => 0, - 'ccn' => 2, - 'coverage' => 0, - 'crap' => 6, - 'link' => 'BankAccount.php.html#11', - 'methodName' => 'setBalance' + 'executedLines' => 0, + 'ccn' => 2, + 'coverage' => 0, + 'crap' => 6, + 'link' => 'BankAccount.php.html#11', + 'methodName' => 'setBalance' ), 'depositMoney' => array( - 'signature' => 'depositMoney($balance)', - 'startLine' => 20, - 'endLine' => 25, + 'signature' => 'depositMoney($balance)', + 'startLine' => 20, + 'endLine' => 25, 'executableLines' => 2, - 'executedLines' => 2, - 'ccn' => 1, - 'coverage' => 100, - 'crap' => '1', - 'link' => 'BankAccount.php.html#20', - 'methodName' => 'depositMoney' + 'executedLines' => 2, + 'ccn' => 1, + 'coverage' => 100, + 'crap' => '1', + 'link' => 'BankAccount.php.html#20', + 'methodName' => 'depositMoney' ), 'withdrawMoney' => array( - 'signature' => 'withdrawMoney($balance)', - 'startLine' => 27, - 'endLine' => 32, + 'signature' => 'withdrawMoney($balance)', + 'startLine' => 27, + 'endLine' => 32, 'executableLines' => 2, - 'executedLines' => 2, - 'ccn' => 1, - 'coverage' => 100, - 'crap' => '1', - 'link' => 'BankAccount.php.html#27', - 'methodName' => 'withdrawMoney' + 'executedLines' => 2, + 'ccn' => 1, + 'coverage' => 100, + 'crap' => '1', + 'link' => 'BankAccount.php.html#27', + 'methodName' => 'withdrawMoney' ), ), - 'startLine' => 2, + 'startLine' => 2, 'executableLines' => 10, - 'executedLines' => 5, - 'ccn' => 5, - 'coverage' => 50, - 'crap' => '8.12', - 'package' => array( - 'namespace' => '', + 'executedLines' => 5, + 'ccn' => 5, + 'coverage' => 50, + 'crap' => '8.12', + 'package' => array( + 'namespace' => '', 'fullPackage' => '', - 'category' => '', - 'package' => '', - 'subpackage' => '' + 'category' => '', + 'package' => '', + 'subpackage' => '' ), - 'link' => 'BankAccount.php.html#2', + 'link' => 'BankAccount.php.html#2', 'className' => 'BankAccount' ) ), @@ -146,7 +146,7 @@ public function testBuildDirectoryStructure() $this->assertEquals( array( 'src' => array( - 'Money.php/f' => array(), + 'Money.php/f' => array(), 'MoneyBag.php/f' => array() ) ), @@ -181,12 +181,12 @@ public function reducePathsProvider() return array( array( array( - 'Money.php' => array(), + 'Money.php' => array(), 'MoneyBag.php' => array() ), '/home/sb/Money', array( - '/home/sb/Money/Money.php' => array(), + '/home/sb/Money/Money.php' => array(), '/home/sb/Money/MoneyBag.php' => array() ) ), @@ -206,14 +206,14 @@ public function reducePathsProvider() ), array( array( - 'Money.php' => array(), - 'MoneyBag.php' => array(), + 'Money.php' => array(), + 'MoneyBag.php' => array(), 'Cash.phar/Cash.php' => array(), ), '/home/sb/Money', array( - '/home/sb/Money/Money.php' => array(), - '/home/sb/Money/MoneyBag.php' => array(), + '/home/sb/Money/Money.php' => array(), + '/home/sb/Money/MoneyBag.php' => array(), 'phar:///home/sb/Money/Cash.phar/Cash.php' => array(), ), ), diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index f9bf12e58..a755b8812 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -276,10 +276,10 @@ public function testCollect() $this->assertEquals( array( - 'BankAccountTest::testBalanceIsInitiallyZero' => array('size' => $size, 'status' => null), - 'BankAccountTest::testBalanceCannotBecomeNegative' => array('size' => $size, 'status' => null), + 'BankAccountTest::testBalanceIsInitiallyZero' => array('size' => $size, 'status' => null), + 'BankAccountTest::testBalanceCannotBecomeNegative' => array('size' => $size, 'status' => null), 'BankAccountTest::testBalanceCannotBecomeNegative2' => array('size' => $size, 'status' => null), - 'BankAccountTest::testDepositWithdrawMoney' => array('size' => $size, 'status' => null) + 'BankAccountTest::testDepositWithdrawMoney' => array('size' => $size, 'status' => null) ), $coverage->getTests() ); diff --git a/tests/TestCase.php b/tests/TestCase.php index 09899dca0..f98242824 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -20,8 +20,8 @@ protected function getXdebugDataForBankAccount() return array( array( TEST_FILES_PATH . 'BankAccount.php' => array( - 8 => 1, - 9 => -2, + 8 => 1, + 9 => -2, 13 => -1, 14 => -1, 15 => -1, @@ -37,7 +37,7 @@ protected function getXdebugDataForBankAccount() ), array( TEST_FILES_PATH . 'BankAccount.php' => array( - 8 => 1, + 8 => 1, 13 => 1, 16 => 1, 29 => 1, @@ -45,7 +45,7 @@ protected function getXdebugDataForBankAccount() ), array( TEST_FILES_PATH . 'BankAccount.php' => array( - 8 => 1, + 8 => 1, 13 => 1, 16 => 1, 22 => 1, @@ -53,7 +53,7 @@ protected function getXdebugDataForBankAccount() ), array( TEST_FILES_PATH . 'BankAccount.php' => array( - 8 => 1, + 8 => 1, 13 => 1, 14 => 1, 15 => 1, @@ -214,7 +214,7 @@ protected function getExpectedDataArrayForBankAccount() 0 => 'BankAccountTest::testBalanceIsInitiallyZero', 1 => 'BankAccountTest::testDepositWithdrawMoney' ), - 9 => null, + 9 => null, 13 => array(), 14 => array(), 15 => array(), diff --git a/tests/_files/CoverageTwoDefaultClassAnnotations.php b/tests/_files/CoverageTwoDefaultClassAnnotations.php index 7c743db92..7ffc5c992 100644 --- a/tests/_files/CoverageTwoDefaultClassAnnotations.php +++ b/tests/_files/CoverageTwoDefaultClassAnnotations.php @@ -6,7 +6,6 @@ */ class CoverageTwoDefaultClassAnnotations { - /** * @covers Foo\CoveredClass:: */ diff --git a/tests/_files/source_with_namespace.php b/tests/_files/source_with_namespace.php index ebe98ee15..fb9dfa340 100644 --- a/tests/_files/source_with_namespace.php +++ b/tests/_files/source_with_namespace.php @@ -15,6 +15,6 @@ function &foo($bar) { $baz = function () {}; $a = true ? true : false; - $b = "{$a}"; - $c = "${b}"; + $b = "{$a}"; + $c = "${b}"; } diff --git a/tests/_files/source_without_namespace.php b/tests/_files/source_without_namespace.php index 24d78e594..a291e7449 100644 --- a/tests/_files/source_without_namespace.php +++ b/tests/_files/source_without_namespace.php @@ -13,6 +13,6 @@ function &foo($bar) { $baz = function () {}; $a = true ? true : false; - $b = "{$a}"; - $c = "${b}"; + $b = "{$a}"; + $c = "${b}"; } From 9a0cbb3291b0c0b498b5b905e8153b6041c6887c Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 14:26:37 +0200 Subject: [PATCH 039/114] Add configuration for php-cs-fixer --- .php_cs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .php_cs diff --git a/.php_cs b/.php_cs new file mode 100644 index 000000000..44bebf6ab --- /dev/null +++ b/.php_cs @@ -0,0 +1,43 @@ +files() + ->in('src') + ->in('tests') + ->name('*.php'); + +return Symfony\CS\Config\Config::create() + ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) + ->fixers( + array( + 'duplicate_semicolon', + 'empty_return', + 'extra_empty_lines', + 'join_function', + 'list_commas', + 'no_blank_lines_after_class_opening', + 'no_empty_lines_after_phpdocs', + 'phpdoc_indent', + 'phpdoc_no_access', + 'phpdoc_no_empty_return', + 'phpdoc_no_package', + 'phpdoc_params', + 'phpdoc_scalar', + 'phpdoc_to_comment', + 'phpdoc_trim', + 'return', + 'self_accessor', + 'single_quote', + 'spaces_before_semicolon', + 'spaces_cast', + 'ternary_spaces', + 'trim_array_spaces', + 'unused_use', + 'whitespacy_lines', + 'align_double_arrow', + 'align_equals', + 'concat_with_spaces', + 'short_array_syntax' + ) + ) + ->finder($finder); + From c472c131338768a35dd521be872b6c7580ecdc82 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 14:28:28 +0200 Subject: [PATCH 040/114] Drop support for PHP < 5.6 --- README.md | 6 +- composer.json | 7 +- src/CodeCoverage.php | 34 ++--- src/CodeCoverage/Driver/PHPDBG.php | 8 +- src/CodeCoverage/Filter.php | 4 +- src/CodeCoverage/Report/Clover.php | 12 +- src/CodeCoverage/Report/Factory.php | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 12 +- .../Report/HTML/Renderer/Dashboard.php | 46 +++---- .../Report/HTML/Renderer/Directory.php | 8 +- .../Report/HTML/Renderer/File.php | 22 ++-- src/CodeCoverage/Report/Node.php | 2 +- src/CodeCoverage/Report/Node/Directory.php | 14 +- src/CodeCoverage/Report/Node/File.php | 38 +++--- src/CodeCoverage/Report/Text.php | 16 +-- src/CodeCoverage/Report/XML/Tests.php | 4 +- tests/PHP/CodeCoverage/FilterTest.php | 16 +-- tests/PHP/CodeCoverage/Report/FactoryTest.php | 124 +++++++++--------- tests/PHP/CodeCoverageTest.php | 36 ++--- tests/TestCase.php | 110 ++++++++-------- ...urce_with_class_and_anonymous_function.php | 2 +- 21 files changed, 262 insertions(+), 261 deletions(-) diff --git a/README.md b/README.md index 4411d7fc9..43dcb61bc 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Requirements -PHP 5.3.3 is required but using the latest version of PHP is highly recommended +PHP 5.6 is required but using the latest version of PHP is highly recommended ### PHP 5 @@ -23,11 +23,11 @@ A version of HHVM that implements the Xdebug API for code coverage (`xdebug_*_co ## Installation -To add PHP_CodeCoverage as a local, per-project dependency to your project, simply add a dependency on `phpunit/php-code-coverage` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on PHP_CodeCoverage 2.0: +To add PHP_CodeCoverage as a local, per-project dependency to your project, simply add a dependency on `phpunit/php-code-coverage` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on PHP_CodeCoverage 3.0: { "require": { - "phpunit/php-code-coverage": "^2" + "phpunit/php-code-coverage": "^3" } } diff --git a/composer.json b/composer.json index 55f9fd077..8d226e7d8 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,9 @@ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "irc": "irc://irc.freenode.net/phpunit" }, + "minimum-stability": "dev", "require": { - "php": ">=5.3.3", + "php": ">=5.6", "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", @@ -29,7 +30,7 @@ "sebastian/version": "~1.0" }, "require-dev": { - "phpunit/phpunit": "~4", + "phpunit/phpunit": "~5", "ext-xdebug": ">=2.1.4" }, "suggest": { @@ -44,7 +45,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "3.0.x-dev" } } } diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 88326f0b7..2529a7fd6 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -67,12 +67,12 @@ class PHP_CodeCoverage * * @var array */ - private $data = array(); + private $data = []; /** * @var array */ - private $ignoredLines = array(); + private $ignoredLines = []; /** * @var bool @@ -84,7 +84,7 @@ class PHP_CodeCoverage * * @var array */ - private $tests = array(); + private $tests = []; /** * Constructor. @@ -127,8 +127,8 @@ public function getReport() public function clear() { $this->currentId = null; - $this->data = array(); - $this->tests = array(); + $this->data = []; + $this->tests = []; } /** @@ -231,7 +231,7 @@ public function start($id, $clear = false) * @return array * @throws PHP_CodeCoverage_Exception */ - public function stop($append = true, $linesToBeCovered = array(), array $linesToBeUsed = array()) + public function stop($append = true, $linesToBeCovered = [], array $linesToBeUsed = []) { if (!is_bool($append)) { throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( @@ -265,7 +265,7 @@ public function stop($append = true, $linesToBeCovered = array(), array $linesTo * @param array $linesToBeUsed * @throws PHP_CodeCoverage_Exception */ - public function append(array $data, $id = null, $append = true, $linesToBeCovered = array(), array $linesToBeUsed = array()) + public function append(array $data, $id = null, $append = true, $linesToBeCovered = [], array $linesToBeUsed = []) { if ($id === null) { $id = $this->currentId; @@ -316,7 +316,7 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere $id = $id->getName(); } - $this->tests[$id] = array('size' => $size, 'status' => $status); + $this->tests[$id] = ['size' => $size, 'status' => $status]; foreach ($data as $file => $lines) { if (!$this->filter->isFile($file)) { @@ -508,7 +508,7 @@ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, ar { if ($linesToBeCovered === false || ($this->forceCoversAnnotation && empty($linesToBeCovered))) { - $data = array(); + $data = []; return; } @@ -577,10 +577,10 @@ private function initializeFilesThatAreSeenTheFirstTime(array $data) { foreach ($data as $file => $lines) { if ($this->filter->isFile($file) && !isset($this->data[$file])) { - $this->data[$file] = array(); + $this->data[$file] = []; foreach ($lines as $k => $v) { - $this->data[$file][$k] = $v == -2 ? null : array(); + $this->data[$file][$k] = $v == -2 ? null : []; } } } @@ -591,7 +591,7 @@ private function initializeFilesThatAreSeenTheFirstTime(array $data) */ private function addUncoveredFilesFromWhitelist() { - $data = array(); + $data = []; $uncoveredFiles = array_diff( $this->filter->getWhitelist(), array_keys($this->data) @@ -609,7 +609,7 @@ private function addUncoveredFilesFromWhitelist() $uncoveredFiles ); } else { - $data[$uncoveredFile] = array(); + $data[$uncoveredFile] = []; $lines = count(file($uncoveredFile)); @@ -665,7 +665,7 @@ private function getLinesToBeIgnored($filename) } if (!isset($this->ignoredLines[$filename])) { - $this->ignoredLines[$filename] = array(); + $this->ignoredLines[$filename] = []; if ($this->disableIgnoredLines) { return $this->ignoredLines[$filename]; @@ -864,11 +864,11 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin */ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) { - $allowedLines = array(); + $allowedLines = []; foreach (array_keys($linesToBeCovered) as $file) { if (!isset($allowedLines[$file])) { - $allowedLines[$file] = array(); + $allowedLines[$file] = []; } $allowedLines[$file] = array_merge( @@ -879,7 +879,7 @@ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) foreach (array_keys($linesToBeUsed) as $file) { if (!isset($allowedLines[$file])) { - $allowedLines[$file] = array(); + $allowedLines[$file] = []; } $allowedLines[$file] = array_merge( diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index f3eb6214a..074562b88 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -49,11 +49,11 @@ public function start() */ public function stop() { - static $fetchedLines = array(); + static $fetchedLines = []; $dbgData = phpdbg_end_oplog(); - if ($fetchedLines == array()) { + if ($fetchedLines == []) { $sourceLines = phpdbg_get_executable(); } else { $newFiles = array_diff( @@ -63,10 +63,10 @@ public function stop() if ($newFiles) { $sourceLines = phpdbg_get_executable( - array('files' => $newFiles) + ['files' => $newFiles] ); } else { - $sourceLines = array(); + $sourceLines = []; } } diff --git a/src/CodeCoverage/Filter.php b/src/CodeCoverage/Filter.php index bb4a25164..efa57e54d 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/CodeCoverage/Filter.php @@ -20,14 +20,14 @@ class PHP_CodeCoverage_Filter * * @var array */ - private $blacklistedFiles = array(); + private $blacklistedFiles = []; /** * Source files that are whitelisted. * * @var array */ - private $whitelistedFiles = array(); + private $whitelistedFiles = []; /** * Adds a directory to the blacklist (recursively). diff --git a/src/CodeCoverage/Report/Clover.php b/src/CodeCoverage/Report/Clover.php index c0ea8d821..aed52d71d 100644 --- a/src/CodeCoverage/Report/Clover.php +++ b/src/CodeCoverage/Report/Clover.php @@ -39,7 +39,7 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null $xmlCoverage->appendChild($xmlProject); - $packages = array(); + $packages = []; $report = $coverage->getReport(); unset($coverage); @@ -55,7 +55,7 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null $classes = $item->getClassesAndTraits(); $coverage = $item->getCoverageData(); - $lines = array(); + $lines = []; foreach ($classes as $className => $class) { $classStatements = 0; @@ -84,12 +84,12 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null } } - $lines[$method['startLine']] = array( + $lines[$method['startLine']] = [ 'count' => $methodCount, 'crap' => $method['crap'], 'type' => 'method', 'name' => $methodName - ); + ]; } if (!empty($class['package']['namespace'])) { @@ -160,9 +160,9 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null continue; } - $lines[$line] = array( + $lines[$line] = [ 'count' => count($data), 'type' => 'stmt' - ); + ]; } ksort($lines); diff --git a/src/CodeCoverage/Report/Factory.php b/src/CodeCoverage/Report/Factory.php index b28964e8a..519e92e9b 100644 --- a/src/CodeCoverage/Report/Factory.php +++ b/src/CodeCoverage/Report/Factory.php @@ -105,7 +105,7 @@ private function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $i */ private function buildDirectoryStructure($files) { - $result = array(); + $result = []; foreach ($files as $path => $file) { $path = explode('/', $path); diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 46bf878a3..4190c1b0a 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -125,7 +125,7 @@ protected function renderItemTemplate(Text_Template $template, array $data) } $template->setVar( - array( + [ 'icon' => isset($data['icon']) ? $data['icon'] : '', 'crap' => isset($data['crap']) ? $data['crap'] : '', 'name' => $data['name'], @@ -141,7 +141,7 @@ protected function renderItemTemplate(Text_Template $template, array $data) 'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '', 'classes_level' => $classesLevel, 'classes_number' => $classesNumber - ) + ] ); return $template->render(); @@ -156,7 +156,7 @@ protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeC $runtime = new Runtime; $template->setVar( - array( + [ 'id' => $node->getId(), 'full_path' => $node->getPath(), 'path_to_root' => $this->getPathToRoot($node), @@ -169,7 +169,7 @@ protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeC 'generator' => $this->generator, 'low_upper_bound' => $this->lowUpperBound, 'high_lower_bound' => $this->highLowerBound - ) + ] ); } @@ -177,7 +177,7 @@ protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node) { $breadcrumbs = ''; $path = $node->getPathAsArray(); - $pathToRoot = array(); + $pathToRoot = []; $max = count($path); if ($node instanceof PHP_CodeCoverage_Report_Node_File) { @@ -248,7 +248,7 @@ protected function getCoverageBar($percent) '}}' ); - $template->setVar(array('level' => $level, 'percent' => sprintf('%.2F', $percent))); + $template->setVar(['level' => $level, 'percent' => sprintf('%.2F', $percent)]); return $template->render(); } diff --git a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php b/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php index a29b7f3d7..60fd28bc4 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php +++ b/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php @@ -37,7 +37,7 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) $projectRisks = $this->projectRisks($classes, $baseLink); $template->setVar( - array( + [ 'insufficient_coverage_classes' => $insufficientCoverage['class'], 'insufficient_coverage_methods' => $insufficientCoverage['method'], 'project_risks_classes' => $projectRisks['class'], @@ -46,7 +46,7 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) 'complexity_method' => $complexity['method'], 'class_coverage_distribution' => $coverageDistribution['class'], 'method_coverage_distribution' => $coverageDistribution['method'] - ) + ] ); $template->renderTo($file); @@ -61,7 +61,7 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) */ protected function complexity(array $classes, $baseLink) { - $result = array('class' => array(), 'method' => array()); + $result = ['class' => [], 'method' => []]; foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { @@ -69,7 +69,7 @@ protected function complexity(array $classes, $baseLink) $methodName = $className . '::' . $methodName; } - $result['method'][] = array( + $result['method'][] = [ $method['coverage'], $method['ccn'], sprintf( @@ -77,10 +77,10 @@ protected function complexity(array $classes, $baseLink) str_replace($baseLink, '', $method['link']), $methodName ) - ); + ]; } - $result['class'][] = array( + $result['class'][] = [ $class['coverage'], $class['ccn'], sprintf( @@ -88,13 +88,13 @@ protected function complexity(array $classes, $baseLink) str_replace($baseLink, '', $class['link']), $className ) - ); + ]; } - return array( + return [ 'class' => json_encode($result['class']), 'method' => json_encode($result['method']) - ); + ]; } /** @@ -105,8 +105,8 @@ protected function complexity(array $classes, $baseLink) */ protected function coverageDistribution(array $classes) { - $result = array( - 'class' => array( + $result = [ + 'class' => [ '0%' => 0, '0-10%' => 0, '10-20%' => 0, @@ -119,8 +119,8 @@ protected function coverageDistribution(array $classes) '80-90%' => 0, '90-100%' => 0, '100%' => 0 - ), - 'method' => array( + ], + 'method' => [ '0%' => 0, '0-10%' => 0, '10-20%' => 0, @@ -133,8 +133,8 @@ protected function coverageDistribution(array $classes) '80-90%' => 0, '90-100%' => 0, '100%' => 0 - ) - ); + ] + ]; foreach ($classes as $class) { foreach ($class['methods'] as $methodName => $method) { @@ -160,10 +160,10 @@ protected function coverageDistribution(array $classes) } } - return array( + return [ 'class' => json_encode(array_values($result['class'])), 'method' => json_encode(array_values($result['method'])) - ); + ]; } /** @@ -175,9 +175,9 @@ protected function coverageDistribution(array $classes) */ protected function insufficientCoverage(array $classes, $baseLink) { - $leastTestedClasses = array(); - $leastTestedMethods = array(); - $result = array('class' => '', 'method' => ''); + $leastTestedClasses = []; + $leastTestedMethods = []; + $result = ['class' => '', 'method' => '']; foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { @@ -233,9 +233,9 @@ protected function insufficientCoverage(array $classes, $baseLink) */ protected function projectRisks(array $classes, $baseLink) { - $classRisks = array(); - $methodRisks = array(); - $result = array('class' => '', 'method' => ''); + $classRisks = []; + $methodRisks = []; + $result = ['class' => '', 'method' => '']; foreach ($classes as $className => $class) { foreach ($class['methods'] as $methodName => $method) { diff --git a/src/CodeCoverage/Report/HTML/Renderer/Directory.php b/src/CodeCoverage/Report/HTML/Renderer/Directory.php index 4415c520d..b7c0d0d61 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Directory.php +++ b/src/CodeCoverage/Report/HTML/Renderer/Directory.php @@ -36,10 +36,10 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) } $template->setVar( - array( + [ 'id' => $node->getId(), 'items' => $items - ) + ] ); $template->renderTo($file); @@ -52,7 +52,7 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) */ protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false) { - $data = array( + $data = [ 'numClasses' => $item->getNumClassesAndTraits(), 'numTestedClasses' => $item->getNumTestedClassesAndTraits(), 'numMethods' => $item->getNumMethods(), @@ -65,7 +65,7 @@ protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false 'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(), 'testedClassesPercent' => $item->getTestedClassesAndTraitsPercent(false), 'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent() - ); + ]; if ($total) { $data['name'] = 'Total'; diff --git a/src/CodeCoverage/Report/HTML/Renderer/File.php b/src/CodeCoverage/Report/HTML/Renderer/File.php index d52345d50..bb3eed488 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/File.php +++ b/src/CodeCoverage/Report/HTML/Renderer/File.php @@ -77,10 +77,10 @@ public function render(PHP_CodeCoverage_Report_Node_File $node, $file) $template = new Text_Template($this->templatePath . 'file.html', '{{', '}}'); $template->setVar( - array( + [ 'items' => $this->renderItems($node), 'lines' => $this->renderSource($node) - ) + ] ); $this->setCommonTemplateVariables($template, $node); @@ -104,7 +104,7 @@ protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) $items = $this->renderItemTemplate( $template, - array( + [ 'name' => 'Total', 'numClasses' => $node->getNumClassesAndTraits(), 'numTestedClasses' => $node->getNumTestedClassesAndTraits(), @@ -119,7 +119,7 @@ protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false), 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(), 'crap' => 'CRAP' - ) + ] ); $items .= $this->renderFunctionItems( @@ -168,7 +168,7 @@ protected function renderTraitOrClassItems(array $items, Text_Template $template $buffer .= $this->renderItemTemplate( $template, - array( + [ 'name' => $name, 'numClasses' => 1, 'numTestedClasses' => $numTestedMethods == $numMethods ? 1 : 0, @@ -207,7 +207,7 @@ protected function renderTraitOrClassItems(array $items, Text_Template $template true ), 'crap' => $item['crap'] - ) + ] ); foreach ($item['methods'] as $method) { @@ -255,7 +255,7 @@ protected function renderFunctionOrMethodItem(Text_Template $template, array $it return $this->renderItemTemplate( $template, - array( + [ 'name' => sprintf( '%s%s', $indent, @@ -288,7 +288,7 @@ protected function renderFunctionOrMethodItem(Text_Template $template, array $it true ), 'crap' => $item['crap'] - ) + ] ); } @@ -413,7 +413,7 @@ protected function loadFile($file) { $buffer = file_get_contents($file); $tokens = token_get_all($buffer); - $result = array(''); + $result = ['']; $i = 0; $stringFlag = false; $fileEndsWithNewLine = substr($buffer, -1) == "\n"; @@ -442,8 +442,8 @@ protected function loadFile($file) list($token, $value) = $token; $value = str_replace( - array("\t", ' '), - array('    ', ' '), + ["\t", ' '], + ['    ', ' '], htmlspecialchars($value, $this->htmlspecialcharsFlags) ); diff --git a/src/CodeCoverage/Report/Node.php b/src/CodeCoverage/Report/Node.php index c57f74425..e515a847a 100644 --- a/src/CodeCoverage/Report/Node.php +++ b/src/CodeCoverage/Report/Node.php @@ -111,7 +111,7 @@ public function getPathAsArray() { if ($this->pathArray === null) { if ($this->parent === null) { - $this->pathArray = array(); + $this->pathArray = []; } else { $this->pathArray = $this->parent->getPathAsArray(); } diff --git a/src/CodeCoverage/Report/Node/Directory.php b/src/CodeCoverage/Report/Node/Directory.php index dd71ecb57..cd249f99e 100644 --- a/src/CodeCoverage/Report/Node/Directory.php +++ b/src/CodeCoverage/Report/Node/Directory.php @@ -18,17 +18,17 @@ class PHP_CodeCoverage_Report_Node_Directory extends PHP_CodeCoverage_Report_Nod /** * @var PHP_CodeCoverage_Report_Node[] */ - protected $children = array(); + protected $children = []; /** * @var PHP_CodeCoverage_Report_Node_Directory[] */ - protected $directories = array(); + protected $directories = []; /** * @var PHP_CodeCoverage_Report_Node_File[] */ - protected $files = array(); + protected $files = []; /** * @var array @@ -219,7 +219,7 @@ public function getChildNodes() public function getClasses() { if ($this->classes === null) { - $this->classes = array(); + $this->classes = []; foreach ($this->children as $child) { $this->classes = array_merge( @@ -240,7 +240,7 @@ public function getClasses() public function getTraits() { if ($this->traits === null) { - $this->traits = array(); + $this->traits = []; foreach ($this->children as $child) { $this->traits = array_merge( @@ -261,7 +261,7 @@ public function getTraits() public function getFunctions() { if ($this->functions === null) { - $this->functions = array(); + $this->functions = []; foreach ($this->children as $child) { $this->functions = array_merge( @@ -282,7 +282,7 @@ public function getFunctions() public function getLinesOfCode() { if ($this->linesOfCode === null) { - $this->linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0); + $this->linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0]; foreach ($this->children as $child) { $linesOfCode = $child->getLinesOfCode(); diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 32e43a6ed..ab5159d54 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -38,22 +38,22 @@ class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node /** * @var array */ - protected $classes = array(); + protected $classes = []; /** * @var array */ - protected $traits = array(); + protected $traits = []; /** * @var array */ - protected $functions = array(); + protected $functions = []; /** * @var array */ - protected $linesOfCode = array(); + protected $linesOfCode = []; /** * @var int @@ -83,12 +83,12 @@ class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node /** * @var array */ - protected $startLines = array(); + protected $startLines = []; /** * @var array */ - protected $endLines = array(); + protected $endLines = []; /** * @var bool @@ -351,7 +351,7 @@ public function getNumTestedFunctions() */ protected function calculateStatistics() { - $classStack = $functionStack = array(); + $classStack = $functionStack = []; if ($this->cacheTokens) { $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath()); @@ -541,9 +541,9 @@ protected function processClasses(PHP_Token_Stream $tokens) $link = $this->getId() . '.html#'; foreach ($classes as $className => $class) { - $this->classes[$className] = array( + $this->classes[$className] = [ 'className' => $className, - 'methods' => array(), + 'methods' => [], 'startLine' => $class['startLine'], 'executableLines' => 0, 'executedLines' => 0, @@ -552,13 +552,13 @@ protected function processClasses(PHP_Token_Stream $tokens) 'crap' => 0, 'package' => $class['package'], 'link' => $link . $class['startLine'] - ); + ]; $this->startLines[$class['startLine']] = &$this->classes[$className]; $this->endLines[$class['endLine']] = &$this->classes[$className]; foreach ($class['methods'] as $methodName => $method) { - $this->classes[$className]['methods'][$methodName] = array( + $this->classes[$className]['methods'][$methodName] = [ 'methodName' => $methodName, 'signature' => $method['signature'], 'startLine' => $method['startLine'], @@ -569,7 +569,7 @@ protected function processClasses(PHP_Token_Stream $tokens) 'coverage' => 0, 'crap' => 0, 'link' => $link . $method['startLine'] - ); + ]; $this->startLines[$method['startLine']] = &$this->classes[$className]['methods'][$methodName]; $this->endLines[$method['endLine']] = &$this->classes[$className]['methods'][$methodName]; @@ -588,9 +588,9 @@ protected function processTraits(PHP_Token_Stream $tokens) $link = $this->getId() . '.html#'; foreach ($traits as $traitName => $trait) { - $this->traits[$traitName] = array( + $this->traits[$traitName] = [ 'traitName' => $traitName, - 'methods' => array(), + 'methods' => [], 'startLine' => $trait['startLine'], 'executableLines' => 0, 'executedLines' => 0, @@ -599,13 +599,13 @@ protected function processTraits(PHP_Token_Stream $tokens) 'crap' => 0, 'package' => $trait['package'], 'link' => $link . $trait['startLine'] - ); + ]; $this->startLines[$trait['startLine']] = &$this->traits[$traitName]; $this->endLines[$trait['endLine']] = &$this->traits[$traitName]; foreach ($trait['methods'] as $methodName => $method) { - $this->traits[$traitName]['methods'][$methodName] = array( + $this->traits[$traitName]['methods'][$methodName] = [ 'methodName' => $methodName, 'signature' => $method['signature'], 'startLine' => $method['startLine'], @@ -616,7 +616,7 @@ protected function processTraits(PHP_Token_Stream $tokens) 'coverage' => 0, 'crap' => 0, 'link' => $link . $method['startLine'] - ); + ]; $this->startLines[$method['startLine']] = &$this->traits[$traitName]['methods'][$methodName]; $this->endLines[$method['endLine']] = &$this->traits[$traitName]['methods'][$methodName]; @@ -635,7 +635,7 @@ protected function processFunctions(PHP_Token_Stream $tokens) $link = $this->getId() . '.html#'; foreach ($functions as $functionName => $function) { - $this->functions[$functionName] = array( + $this->functions[$functionName] = [ 'functionName' => $functionName, 'signature' => $function['signature'], 'startLine' => $function['startLine'], @@ -645,7 +645,7 @@ protected function processFunctions(PHP_Token_Stream $tokens) 'coverage' => 0, 'crap' => 0, 'link' => $link . $function['startLine'] - ); + ]; $this->startLines[$function['startLine']] = &$this->functions[$functionName]; $this->endLines[$function['endLine']] = &$this->functions[$functionName]; diff --git a/src/CodeCoverage/Report/Text.php b/src/CodeCoverage/Report/Text.php index 7dc254521..174546fd8 100644 --- a/src/CodeCoverage/Report/Text.php +++ b/src/CodeCoverage/Report/Text.php @@ -22,14 +22,14 @@ class PHP_CodeCoverage_Report_Text protected $showUncoveredFiles; protected $showOnlySummary; - protected $colors = array( + protected $colors = [ 'green' => "\x1b[30;42m", 'yellow' => "\x1b[30;43m", 'red' => "\x1b[37;41m", 'header' => "\x1b[1;37;40m", 'reset' => "\x1b[0m", 'eol' => "\x1b[2K", - ); + ]; public function __construct($lowUpperBound, $highLowerBound, $showUncoveredFiles, $showOnlySummary) { @@ -50,14 +50,14 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $report = $coverage->getReport(); unset($coverage); - $colors = array( + $colors = [ 'header' => '', 'classes' => '', 'methods' => '', 'lines' => '', 'reset' => '', 'eol' => '' - ); + ]; if ($showColors) { $colors['classes'] = $this->getCoverageColor( @@ -110,7 +110,7 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $report->getNumExecutableLines() ); - $padding = max(array_map('strlen', array($classes, $methods, $lines))); + $padding = max(array_map('strlen', [$classes, $methods, $lines])); if ($this->showOnlySummary) { $title = 'Code Coverage Report Summary:'; @@ -135,7 +135,7 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) return $output . PHP_EOL; } - $classCoverage = array(); + $classCoverage = []; foreach ($report as $item) { if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { @@ -171,14 +171,14 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $namespace = ''; } - $classCoverage[$namespace . $className] = array( + $classCoverage[$namespace . $className] = [ 'namespace' => $namespace, 'className ' => $className, 'methodsCovered' => $coveredMethods, 'methodCount' => $classMethods, 'statementsCovered' => $coveredClassStatements, 'statementCount' => $classStatements, - ); + ]; } } diff --git a/src/CodeCoverage/Report/XML/Tests.php b/src/CodeCoverage/Report/XML/Tests.php index 46214679b..8ff352c30 100644 --- a/src/CodeCoverage/Report/XML/Tests.php +++ b/src/CodeCoverage/Report/XML/Tests.php @@ -15,14 +15,14 @@ class PHP_CodeCoverage_Report_XML_Tests { private $contextNode; - private $codeMap = array( + private $codeMap = [ 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED 1 => 'SKIPPED', // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED 2 => 'INCOMPLETE', // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE 3 => 'FAILURE', // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE 4 => 'ERROR', // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR 5 => 'RISKY' // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY - ); + ]; public function __construct(DOMElement $context) { diff --git a/tests/PHP/CodeCoverage/FilterTest.php b/tests/PHP/CodeCoverage/FilterTest.php index 66f8bb42f..6e2bd7cd9 100644 --- a/tests/PHP/CodeCoverage/FilterTest.php +++ b/tests/PHP/CodeCoverage/FilterTest.php @@ -30,7 +30,7 @@ protected function setUp() { $this->filter = unserialize('O:23:"PHP_CodeCoverage_Filter":0:{}'); - $this->files = array( + $this->files = [ TEST_FILES_PATH . 'BankAccount.php', TEST_FILES_PATH . 'BankAccountTest.php', TEST_FILES_PATH . 'CoverageClassExtendedTest.php', @@ -72,7 +72,7 @@ protected function setUp() TEST_FILES_PATH . 'source_with_oneline_annotations.php', TEST_FILES_PATH . 'source_without_ignore.php', TEST_FILES_PATH . 'source_without_namespace.php' - ); + ]; } /** @@ -84,7 +84,7 @@ public function testAddingAFileToTheBlacklistWorks() $this->filter->addFileToBlacklist($this->files[0]); $this->assertEquals( - array($this->files[0]), + [$this->files[0]], $this->filter->getBlacklist() ); } @@ -98,7 +98,7 @@ public function testRemovingAFileFromTheBlacklistWorks() $this->filter->addFileToBlacklist($this->files[0]); $this->filter->removeFileFromBlacklist($this->files[0]); - $this->assertEquals(array(), $this->filter->getBlacklist()); + $this->assertEquals([], $this->filter->getBlacklist()); } /** @@ -146,7 +146,7 @@ public function testRemovingADirectoryFromTheBlacklistWorks() $this->filter->addDirectoryToBlacklist(TEST_FILES_PATH); $this->filter->removeDirectoryFromBlacklist(TEST_FILES_PATH); - $this->assertEquals(array(), $this->filter->getBlacklist()); + $this->assertEquals([], $this->filter->getBlacklist()); } /** @@ -158,7 +158,7 @@ public function testAddingAFileToTheWhitelistWorks() $this->filter->addFileToWhitelist($this->files[0]); $this->assertEquals( - array($this->files[0]), + [$this->files[0]], $this->filter->getWhitelist() ); } @@ -172,7 +172,7 @@ public function testRemovingAFileFromTheWhitelistWorks() $this->filter->addFileToWhitelist($this->files[0]); $this->filter->removeFileFromWhitelist($this->files[0]); - $this->assertEquals(array(), $this->filter->getWhitelist()); + $this->assertEquals([], $this->filter->getWhitelist()); } /** @@ -220,7 +220,7 @@ public function testRemovingADirectoryFromTheWhitelistWorks() $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH); $this->filter->removeDirectoryFromWhitelist(TEST_FILES_PATH); - $this->assertEquals(array(), $this->filter->getWhitelist()); + $this->assertEquals([], $this->filter->getWhitelist()); } /** diff --git a/tests/PHP/CodeCoverage/Report/FactoryTest.php b/tests/PHP/CodeCoverage/Report/FactoryTest.php index 84f14aea7..4c15f5c72 100644 --- a/tests/PHP/CodeCoverage/Report/FactoryTest.php +++ b/tests/PHP/CodeCoverage/Report/FactoryTest.php @@ -51,15 +51,15 @@ public function testSomething() $this->assertEquals(0, $root->getNumFunctions()); $this->assertEquals(0, $root->getNumTestedFunctions()); $this->assertNull($root->getParent()); - $this->assertEquals(array(), $root->getDirectories()); + $this->assertEquals([], $root->getDirectories()); #$this->assertEquals(array(), $root->getFiles()); #$this->assertEquals(array(), $root->getChildNodes()); $this->assertEquals( - array( - 'BankAccount' => array( - 'methods' => array( - 'getBalance' => array( + [ + 'BankAccount' => [ + 'methods' => [ + 'getBalance' => [ 'signature' => 'getBalance()', 'startLine' => 6, 'endLine' => 9, @@ -70,8 +70,8 @@ public function testSomething() 'crap' => '1', 'link' => 'BankAccount.php.html#6', 'methodName' => 'getBalance' - ), - 'setBalance' => array( + ], + 'setBalance' => [ 'signature' => 'setBalance($balance)', 'startLine' => 11, 'endLine' => 18, @@ -82,8 +82,8 @@ public function testSomething() 'crap' => 6, 'link' => 'BankAccount.php.html#11', 'methodName' => 'setBalance' - ), - 'depositMoney' => array( + ], + 'depositMoney' => [ 'signature' => 'depositMoney($balance)', 'startLine' => 20, 'endLine' => 25, @@ -94,8 +94,8 @@ public function testSomething() 'crap' => '1', 'link' => 'BankAccount.php.html#20', 'methodName' => 'depositMoney' - ), - 'withdrawMoney' => array( + ], + 'withdrawMoney' => [ 'signature' => 'withdrawMoney($balance)', 'startLine' => 27, 'endLine' => 32, @@ -106,29 +106,29 @@ public function testSomething() 'crap' => '1', 'link' => 'BankAccount.php.html#27', 'methodName' => 'withdrawMoney' - ), - ), + ], + ], 'startLine' => 2, 'executableLines' => 10, 'executedLines' => 5, 'ccn' => 5, 'coverage' => 50, 'crap' => '8.12', - 'package' => array( + 'package' => [ 'namespace' => '', 'fullPackage' => '', 'category' => '', 'package' => '', 'subpackage' => '' - ), + ], 'link' => 'BankAccount.php.html#2', 'className' => 'BankAccount' - ) - ), + ] + ], $root->getClasses() ); - $this->assertEquals(array(), $root->getFunctions()); + $this->assertEquals([], $root->getFunctions()); } /** @@ -144,15 +144,15 @@ public function testBuildDirectoryStructure() $method->setAccessible(true); $this->assertEquals( - array( - 'src' => array( - 'Money.php/f' => array(), - 'MoneyBag.php/f' => array() - ) - ), + [ + 'src' => [ + 'Money.php/f' => [], + 'MoneyBag.php/f' => [] + ] + ], $method->invoke( $this->factory, - array('src/Money.php' => array(), 'src/MoneyBag.php' => array()) + ['src/Money.php' => [], 'src/MoneyBag.php' => []] ) ); } @@ -170,7 +170,7 @@ public function testReducePaths($reducedPaths, $commonPath, $paths) $method->setAccessible(true); - $_commonPath = $method->invokeArgs($this->factory, array(&$paths)); + $_commonPath = $method->invokeArgs($this->factory, [&$paths]); $this->assertEquals($reducedPaths, $paths); $this->assertEquals($commonPath, $_commonPath); @@ -178,45 +178,45 @@ public function testReducePaths($reducedPaths, $commonPath, $paths) public function reducePathsProvider() { - return array( - array( - array( - 'Money.php' => array(), - 'MoneyBag.php' => array() - ), + return [ + [ + [ + 'Money.php' => [], + 'MoneyBag.php' => [] + ], '/home/sb/Money', - array( - '/home/sb/Money/Money.php' => array(), - '/home/sb/Money/MoneyBag.php' => array() - ) - ), - array( - array( - 'Money.php' => array() - ), + [ + '/home/sb/Money/Money.php' => [], + '/home/sb/Money/MoneyBag.php' => [] + ] + ], + [ + [ + 'Money.php' => [] + ], '/home/sb/Money/', - array( - '/home/sb/Money/Money.php' => array() - ) - ), - array( - array(), + [ + '/home/sb/Money/Money.php' => [] + ] + ], + [ + [], '.', - array() - ), - array( - array( - 'Money.php' => array(), - 'MoneyBag.php' => array(), - 'Cash.phar/Cash.php' => array(), - ), + [] + ], + [ + [ + 'Money.php' => [], + 'MoneyBag.php' => [], + 'Cash.phar/Cash.php' => [], + ], '/home/sb/Money', - array( - '/home/sb/Money/Money.php' => array(), - '/home/sb/Money/MoneyBag.php' => array(), - 'phar:///home/sb/Money/Cash.phar/Cash.php' => array(), - ), - ), - ); + [ + '/home/sb/Money/Money.php' => [], + '/home/sb/Money/MoneyBag.php' => [], + 'phar:///home/sb/Money/Cash.phar/Cash.php' => [], + ], + ], + ]; } } diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index a755b8812..d6c8aa40c 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -80,7 +80,7 @@ public function testConstructor2() */ public function testStartThrowsExceptionForInvalidArgument() { - $this->coverage->start(null, array(), null); + $this->coverage->start(null, [], null); } /** @@ -107,7 +107,7 @@ public function testStopThrowsExceptionForInvalidArgument2() */ public function testAppendThrowsExceptionForInvalidArgument() { - $this->coverage->append(array(), null); + $this->coverage->append([], null); } /** @@ -246,8 +246,8 @@ public function testClear() $this->coverage->clear(); $this->assertAttributeEquals(null, 'currentId', $this->coverage); - $this->assertAttributeEquals(array(), 'data', $this->coverage); - $this->assertAttributeEquals(array(), 'tests', $this->coverage); + $this->assertAttributeEquals([], 'data', $this->coverage); + $this->assertAttributeEquals([], 'tests', $this->coverage); } /** @@ -275,12 +275,12 @@ public function testCollect() } $this->assertEquals( - array( - 'BankAccountTest::testBalanceIsInitiallyZero' => array('size' => $size, 'status' => null), - 'BankAccountTest::testBalanceCannotBecomeNegative' => array('size' => $size, 'status' => null), - 'BankAccountTest::testBalanceCannotBecomeNegative2' => array('size' => $size, 'status' => null), - 'BankAccountTest::testDepositWithdrawMoney' => array('size' => $size, 'status' => null) - ), + [ + 'BankAccountTest::testBalanceIsInitiallyZero' => ['size' => $size, 'status' => null], + 'BankAccountTest::testBalanceCannotBecomeNegative' => ['size' => $size, 'status' => null], + 'BankAccountTest::testBalanceCannotBecomeNegative2' => ['size' => $size, 'status' => null], + 'BankAccountTest::testDepositWithdrawMoney' => ['size' => $size, 'status' => null] + ], $coverage->getTests() ); } @@ -325,7 +325,7 @@ public function testMerge2() public function testGetLinesToBeIgnored() { $this->assertEquals( - array( + [ 1, 3, 4, @@ -360,7 +360,7 @@ public function testGetLinesToBeIgnored() 36, 37, 38 - ), + ], $this->getLinesToBeIgnored()->invoke( $this->coverage, TEST_FILES_PATH . 'source_with_ignore.php' @@ -374,7 +374,7 @@ public function testGetLinesToBeIgnored() public function testGetLinesToBeIgnored2() { $this->assertEquals( - array(1, 5), + [1, 5], $this->getLinesToBeIgnored()->invoke( $this->coverage, TEST_FILES_PATH . 'source_without_ignore.php' @@ -388,7 +388,7 @@ public function testGetLinesToBeIgnored2() public function testGetLinesToBeIgnored3() { $this->assertEquals( - array( + [ 1, 2, 3, @@ -400,7 +400,7 @@ public function testGetLinesToBeIgnored3() 16, 19, 20 - ), + ], $this->getLinesToBeIgnored()->invoke( $this->coverage, TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' @@ -414,7 +414,7 @@ public function testGetLinesToBeIgnored3() public function testGetLinesToBeIgnoredOneLineAnnotations() { $this->assertEquals( - array( + [ 1, 2, 3, @@ -446,7 +446,7 @@ public function testGetLinesToBeIgnoredOneLineAnnotations() 33, 34, 37 - ), + ], $this->getLinesToBeIgnored()->invoke( $this->coverage, TEST_FILES_PATH . 'source_with_oneline_annotations.php' @@ -477,7 +477,7 @@ public function testGetLinesToBeIgnoredWhenIgnoreIsDisabled() $this->coverage->setDisableIgnoredLines(true); $this->assertEquals( - array(), + [], $this->getLinesToBeIgnored()->invoke( $this->coverage, TEST_FILES_PATH . 'source_with_ignore.php' diff --git a/tests/TestCase.php b/tests/TestCase.php index f98242824..d74c813ab 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -17,9 +17,9 @@ abstract class PHP_CodeCoverage_TestCase extends PHPUnit_Framework_TestCase { protected function getXdebugDataForBankAccount() { - return array( - array( - TEST_FILES_PATH . 'BankAccount.php' => array( + return [ + [ + TEST_FILES_PATH . 'BankAccount.php' => [ 8 => 1, 9 => -2, 13 => -1, @@ -33,26 +33,26 @@ protected function getXdebugDataForBankAccount() 29 => -1, 31 => -1, 32 => -2 - ) - ), - array( - TEST_FILES_PATH . 'BankAccount.php' => array( + ] + ], + [ + TEST_FILES_PATH . 'BankAccount.php' => [ 8 => 1, 13 => 1, 16 => 1, 29 => 1, - ) - ), - array( - TEST_FILES_PATH . 'BankAccount.php' => array( + ] + ], + [ + TEST_FILES_PATH . 'BankAccount.php' => [ 8 => 1, 13 => 1, 16 => 1, 22 => 1, - ) - ), - array( - TEST_FILES_PATH . 'BankAccount.php' => array( + ] + ], + [ + TEST_FILES_PATH . 'BankAccount.php' => [ 8 => 1, 13 => 1, 14 => 1, @@ -62,9 +62,9 @@ protected function getXdebugDataForBankAccount() 24 => 1, 29 => 1, 31 => 1, - ) - ) - ); + ] + ] + ]; } protected function getCoverageForBankAccount() @@ -90,7 +90,7 @@ protected function getCoverageForBankAccount() $coverage->stop( true, - array(TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)) + [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)] ); $coverage->start( @@ -99,7 +99,7 @@ protected function getCoverageForBankAccount() $coverage->stop( true, - array(TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)) + [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)] ); $coverage->start( @@ -108,7 +108,7 @@ protected function getCoverageForBankAccount() $coverage->stop( true, - array(TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)) + [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)] ); $coverage->start( @@ -117,13 +117,13 @@ protected function getCoverageForBankAccount() $coverage->stop( true, - array( + [ TEST_FILES_PATH . 'BankAccount.php' => array_merge( range(6, 9), range(20, 25), range(27, 32) ) - ) + ] ); return $coverage; @@ -150,7 +150,7 @@ protected function getCoverageForBankAccountForFirstTwoTests() $coverage->stop( true, - array(TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)) + [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)] ); $coverage->start( @@ -159,7 +159,7 @@ protected function getCoverageForBankAccountForFirstTwoTests() $coverage->stop( true, - array(TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)) + [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)] ); return $coverage; @@ -185,7 +185,7 @@ protected function getCoverageForBankAccountForLastTwoTests() $coverage->stop( true, - array(TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)) + [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)] ); $coverage->start( @@ -194,13 +194,13 @@ protected function getCoverageForBankAccountForLastTwoTests() $coverage->stop( true, - array( + [ TEST_FILES_PATH . 'BankAccount.php' => array_merge( range(6, 9), range(20, 25), range(27, 32) ) - ) + ] ); return $coverage; @@ -208,36 +208,36 @@ protected function getCoverageForBankAccountForLastTwoTests() protected function getExpectedDataArrayForBankAccount() { - return array( - TEST_FILES_PATH . 'BankAccount.php' => array( - 8 => array( + return [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => [ 0 => 'BankAccountTest::testBalanceIsInitiallyZero', 1 => 'BankAccountTest::testDepositWithdrawMoney' - ), + ], 9 => null, - 13 => array(), - 14 => array(), - 15 => array(), - 16 => array(), - 18 => array(), - 22 => array( + 13 => [], + 14 => [], + 15 => [], + 16 => [], + 18 => [], + 22 => [ 0 => 'BankAccountTest::testBalanceCannotBecomeNegative2', 1 => 'BankAccountTest::testDepositWithdrawMoney' - ), - 24 => array( + ], + 24 => [ 0 => 'BankAccountTest::testDepositWithdrawMoney', - ), + ], 25 => null, - 29 => array( + 29 => [ 0 => 'BankAccountTest::testBalanceCannotBecomeNegative', 1 => 'BankAccountTest::testDepositWithdrawMoney' - ), - 31 => array( + ], + 31 => [ 0 => 'BankAccountTest::testDepositWithdrawMoney' - ), + ], 32 => null - ) - ); + ] + ]; } protected function getCoverageForFileWithIgnoredLines() @@ -259,14 +259,14 @@ protected function setUpXdebugStubForFileWithIgnoredLines() $stub->expects($this->any()) ->method('stop') ->will($this->returnValue( - array( - TEST_FILES_PATH . 'source_with_ignore.php' => array( + [ + TEST_FILES_PATH . 'source_with_ignore.php' => [ 2 => 1, 4 => -1, 6 => -1, 7 => 1 - ) - ) + ] + ] )); return $stub; @@ -291,8 +291,8 @@ protected function setUpXdebugStubForClassWithAnonymousFunction() $stub->expects($this->any()) ->method('stop') ->will($this->returnValue( - array( - TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' => array( + [ + TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' => [ 7 => 1, 9 => 1, 10 => -1, @@ -302,8 +302,8 @@ protected function setUpXdebugStubForClassWithAnonymousFunction() 14 => 1, 17 => 1, 18 => 1 - ) - ) + ] + ] )); return $stub; diff --git a/tests/_files/source_with_class_and_anonymous_function.php b/tests/_files/source_with_class_and_anonymous_function.php index eaba387d6..72aa938e9 100644 --- a/tests/_files/source_with_class_and_anonymous_function.php +++ b/tests/_files/source_with_class_and_anonymous_function.php @@ -4,7 +4,7 @@ class CoveredClassWithAnonymousFunctionInStaticMethod { public static function runAnonymous() { - $filter = array('abc124', 'abc123', '123'); + $filter = ['abc124', 'abc123', '123']; array_walk( $filter, From 4d109a2213232f6ce3c6247d0bd7056c104d1a2f Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 14:39:47 +0200 Subject: [PATCH 041/114] Add ChangeLog for PHP_CodeCoverage 3.0 --- ChangeLog-3.0.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 ChangeLog-3.0.md diff --git a/ChangeLog-3.0.md b/ChangeLog-3.0.md new file mode 100644 index 000000000..026cbed92 --- /dev/null +++ b/ChangeLog-3.0.md @@ -0,0 +1,12 @@ +# Changes in PHP_CodeCoverage 3.0 + +All notable changes of the PHP_CodeCoverage 3.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [3.0.0] - 2015-10-02 + +### Removed + +* PHP_CodeCoverage is no longer supported on PHP 5.3, PHP 5.4, and PHP 5.5 + +[3.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2...3.0.0 + From b100e6f56572ac9b2a2f6f8c2443f1eb0a22737e Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 15:03:35 +0200 Subject: [PATCH 042/114] Improve docblocks --- src/CodeCoverage.php | 2 ++ src/CodeCoverage/Util.php | 8 +++++--- src/CodeCoverage/Util/InvalidArgumentHelper.php | 7 ++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 2529a7fd6..4813846e5 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -736,6 +736,8 @@ private function getLinesToBeIgnored($filename) case 'PHP_Token_TRAIT': case 'PHP_Token_CLASS': case 'PHP_Token_FUNCTION': + /* @var PHP_Token_Interface $token */ + $docblock = $token->getDocblock(); $this->ignoredLines[$filename][] = $token->getLine(); diff --git a/src/CodeCoverage/Util.php b/src/CodeCoverage/Util.php index eadb3c92c..3ae47e5d6 100644 --- a/src/CodeCoverage/Util.php +++ b/src/CodeCoverage/Util.php @@ -16,9 +16,11 @@ class PHP_CodeCoverage_Util { /** - * @param float $a - * @param float $b - * @return float ($a / $b) * 100 + * @param float $a + * @param float $b + * @param bool $asString + * @param bool $fixedWidth + * @return float|int|string */ public static function percent($a, $b, $asString = false, $fixedWidth = false) { diff --git a/src/CodeCoverage/Util/InvalidArgumentHelper.php b/src/CodeCoverage/Util/InvalidArgumentHelper.php index d66e49928..70be74994 100644 --- a/src/CodeCoverage/Util/InvalidArgumentHelper.php +++ b/src/CodeCoverage/Util/InvalidArgumentHelper.php @@ -17,9 +17,10 @@ class PHP_CodeCoverage_Util_InvalidArgumentHelper { /** - * @param int $argument - * @param string $type - * @param mixed $value + * @param int $argument + * @param string $type + * @param mixed $value + * @return PHP_CodeCoverage_Exception */ public static function factory($argument, $type, $value = null) { From 969cff041acf1541b5dc11ff502342d0fb3eb704 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 16:02:28 +0200 Subject: [PATCH 043/114] Refactor exception hierarchy --- src/CodeCoverage.php | 110 +++++++++--------- src/CodeCoverage/Driver/PHPDBG.php | 4 +- src/CodeCoverage/Driver/Xdebug.php | 4 +- .../{ => Exception}/Exception.php | 6 +- .../InvalidArgumentException.php} | 19 ++- .../Exception/RuntimeException.php | 16 +++ ...> UnintentionallyCoveredCodeException.php} | 2 +- src/CodeCoverage/Filter.php | 3 +- src/CodeCoverage/Report/Crap4j.php | 2 +- src/CodeCoverage/Report/HTML.php | 6 +- src/CodeCoverage/Report/Node/Directory.php | 10 +- src/CodeCoverage/Report/Node/File.php | 14 +-- src/CodeCoverage/Report/XML.php | 8 +- src/CodeCoverage/Report/XML/File/Coverage.php | 2 +- 14 files changed, 109 insertions(+), 97 deletions(-) rename src/CodeCoverage/{ => Exception}/Exception.php (63%) rename src/CodeCoverage/{Util/InvalidArgumentHelper.php => Exception/InvalidArgumentException.php} (55%) create mode 100644 src/CodeCoverage/Exception/RuntimeException.php rename src/CodeCoverage/Exception/{UnintentionallyCoveredCode.php => UnintentionallyCoveredCodeException.php} (78%) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 4813846e5..e9f9bb514 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -89,9 +89,9 @@ class PHP_CodeCoverage /** * Constructor. * - * @param PHP_CodeCoverage_Driver $driver - * @param PHP_CodeCoverage_Filter $filter - * @throws PHP_CodeCoverage_Exception + * @param PHP_CodeCoverage_Driver $driver + * @param PHP_CodeCoverage_Filter $filter + * @throws PHP_CodeCoverage_RuntimeException */ public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null) { @@ -200,14 +200,14 @@ public function setTests(array $tests) /** * Start collection of code coverage information. * - * @param mixed $id - * @param bool $clear - * @throws PHP_CodeCoverage_Exception + * @param mixed $id + * @param bool $clear + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function start($id, $clear = false) { if (!is_bool($clear)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -225,23 +225,23 @@ public function start($id, $clear = false) /** * Stop collection of code coverage information. * - * @param bool $append - * @param mixed $linesToBeCovered - * @param array $linesToBeUsed + * @param bool $append + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed * @return array - * @throws PHP_CodeCoverage_Exception + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function stop($append = true, $linesToBeCovered = [], array $linesToBeUsed = []) { if (!is_bool($append)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); } if (!is_array($linesToBeCovered) && $linesToBeCovered !== false) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 2, 'array or false' ); @@ -258,12 +258,12 @@ public function stop($append = true, $linesToBeCovered = [], array $linesToBeUse /** * Appends code coverage data. * - * @param array $data - * @param mixed $id - * @param bool $append - * @param mixed $linesToBeCovered - * @param array $linesToBeUsed - * @throws PHP_CodeCoverage_Exception + * @param array $data + * @param mixed $id + * @param bool $append + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_RuntimeException */ public function append(array $data, $id = null, $append = true, $linesToBeCovered = [], array $linesToBeUsed = []) { @@ -272,7 +272,7 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere } if ($id === null) { - throw new PHP_CodeCoverage_Exception; + throw new PHP_CodeCoverage_RuntimeException; } $this->applyListsFilter($data); @@ -375,14 +375,14 @@ public function merge(PHP_CodeCoverage $that) } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException * @since Method available since Release 1.1.0 */ public function setCacheTokens($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -400,14 +400,14 @@ public function getCacheTokens() } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException * @since Method available since Release 2.0.0 */ public function setCheckForUnintentionallyCoveredCode($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -417,13 +417,13 @@ public function setCheckForUnintentionallyCoveredCode($flag) } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setForceCoversAnnotation($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -433,13 +433,13 @@ public function setForceCoversAnnotation($flag) } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setMapTestClassNameToCoveredClassName($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -449,13 +449,13 @@ public function setMapTestClassNameToCoveredClassName($flag) } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setAddUncoveredFilesFromWhitelist($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -465,13 +465,13 @@ public function setAddUncoveredFilesFromWhitelist($flag) } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setProcessUncoveredFilesFromWhitelist($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -481,13 +481,13 @@ public function setProcessUncoveredFilesFromWhitelist($flag) } /** - * @param bool $flag - * @throws PHP_CodeCoverage_Exception + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setDisableIgnoredLines($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); @@ -499,10 +499,10 @@ public function setDisableIgnoredLines($flag) /** * Applies the @covers annotation filtering. * - * @param array $data - * @param mixed $linesToBeCovered - * @param array $linesToBeUsed - * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode + * @param array $data + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException */ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed) { @@ -650,15 +650,15 @@ private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, /** * Returns the lines of a source file that should be ignored. * - * @param string $filename + * @param string $filename * @return array - * @throws PHP_CodeCoverage_Exception + * @throws PHP_CodeCoverage_InvalidArgumentException * @since Method available since Release 2.0.0 */ private function getLinesToBeIgnored($filename) { if (!is_string($filename)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'string' ); @@ -822,10 +822,10 @@ private function getLinesToBeIgnored($filename) } /** - * @param array $data - * @param array $linesToBeCovered - * @param array $linesToBeUsed - * @throws PHP_CodeCoverage_Exception_UnintentionallyCoveredCode + * @param array $data + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException * @since Method available since Release 2.0.0 */ private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) @@ -852,7 +852,7 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin } if (!empty($message)) { - throw new PHP_CodeCoverage_Exception_UnintentionallyCoveredCode( + throw new PHP_CodeCoverage_UnintentionallyCoveredCodeException( $message ); } @@ -901,14 +901,14 @@ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) /** * @return PHP_CodeCoverage_Driver - * @throws PHP_CodeCoverage_Exception + * @throws PHP_CodeCoverage_RuntimeException */ private function selectDriver() { $runtime = new Runtime; if (!$runtime->canCollectCodeCoverage()) { - throw new PHP_CodeCoverage_Exception('No code coverage driver available'); + throw new PHP_CodeCoverage_RuntimeException('No code coverage driver available'); } if ($runtime->isHHVM()) { diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index 074562b88..2c39c8c80 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -22,13 +22,13 @@ class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver public function __construct() { if (PHP_SAPI !== 'phpdbg') { - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( 'This driver requires the PHPDBG SAPI' ); } if (!function_exists('phpdbg_start_oplog')) { - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( 'This build of PHPDBG does not support code coverage' ); } diff --git a/src/CodeCoverage/Driver/Xdebug.php b/src/CodeCoverage/Driver/Xdebug.php index 0cd7b9adc..5cbb0d03d 100644 --- a/src/CodeCoverage/Driver/Xdebug.php +++ b/src/CodeCoverage/Driver/Xdebug.php @@ -22,12 +22,12 @@ class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver public function __construct() { if (!extension_loaded('xdebug')) { - throw new PHP_CodeCoverage_Exception('This driver requires Xdebug'); + throw new PHP_CodeCoverage_RuntimeException('This driver requires Xdebug'); } if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') && !ini_get('xdebug.coverage_enable')) { - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( 'xdebug.coverage_enable=On has to be set in php.ini' ); } diff --git a/src/CodeCoverage/Exception.php b/src/CodeCoverage/Exception/Exception.php similarity index 63% rename from src/CodeCoverage/Exception.php rename to src/CodeCoverage/Exception/Exception.php index bded3c095..9118a78b7 100644 --- a/src/CodeCoverage/Exception.php +++ b/src/CodeCoverage/Exception/Exception.php @@ -9,10 +9,10 @@ */ /** - * Exception class for PHP_CodeCoverage component. + * Exception interface for PHP_CodeCoverage component. * - * @since Class available since Release 1.1.0 + * @since Interface available since Release 3.0.0 */ -class PHP_CodeCoverage_Exception extends RuntimeException +interface PHP_CodeCoverage_Exception { } diff --git a/src/CodeCoverage/Util/InvalidArgumentHelper.php b/src/CodeCoverage/Exception/InvalidArgumentException.php similarity index 55% rename from src/CodeCoverage/Util/InvalidArgumentHelper.php rename to src/CodeCoverage/Exception/InvalidArgumentException.php index 70be74994..68d072b64 100644 --- a/src/CodeCoverage/Util/InvalidArgumentHelper.php +++ b/src/CodeCoverage/Exception/InvalidArgumentException.php @@ -9,24 +9,21 @@ */ /** - * Factory for PHP_CodeCoverage_Exception objects that are used to describe - * invalid arguments passed to a function or method. - * - * @since Class available since Release 1.2.0 + * @since Class available since Release 3.0.0 */ -class PHP_CodeCoverage_Util_InvalidArgumentHelper +class PHP_CodeCoverage_InvalidArgumentException extends InvalidArgumentException implements PHP_CodeCoverage_Exception { /** - * @param int $argument - * @param string $type - * @param mixed $value - * @return PHP_CodeCoverage_Exception + * @param int $argument + * @param string $type + * @param mixed $value + * @return PHP_CodeCoverage_InvalidArgumentException */ - public static function factory($argument, $type, $value = null) + public static function create($argument, $type, $value = null) { $stack = debug_backtrace(false); - return new PHP_CodeCoverage_Exception( + return new self( sprintf( 'Argument #%d%sof %s::%s() must be a %s', $argument, diff --git a/src/CodeCoverage/Exception/RuntimeException.php b/src/CodeCoverage/Exception/RuntimeException.php new file mode 100644 index 000000000..bb6bc5ecc --- /dev/null +++ b/src/CodeCoverage/Exception/RuntimeException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * @since Class available since Release 3.0.0 + */ +class PHP_CodeCoverage_RuntimeException extends RuntimeException implements PHP_CodeCoverage_Exception +{ +} diff --git a/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php b/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php similarity index 78% rename from src/CodeCoverage/Exception/UnintentionallyCoveredCode.php rename to src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php index 463785ef1..398276a3a 100644 --- a/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php +++ b/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php @@ -13,6 +13,6 @@ * * @since Class available since Release 2.0.0 */ -class PHP_CodeCoverage_Exception_UnintentionallyCoveredCode extends PHP_CodeCoverage_Exception +class PHP_CodeCoverage_UnintentionallyCoveredCodeException extends PHP_CodeCoverage_RuntimeException { } diff --git a/src/CodeCoverage/Filter.php b/src/CodeCoverage/Filter.php index efa57e54d..8ac10e3d3 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/CodeCoverage/Filter.php @@ -197,9 +197,8 @@ public function isFile($filename) * When the whitelist is empty (default), blacklisting is used. * When the whitelist is not empty, whitelisting is used. * - * @param string $filename + * @param string $filename * @return bool - * @throws PHP_CodeCoverage_Exception */ public function isFiltered($filename) { diff --git a/src/CodeCoverage/Report/Crap4j.php b/src/CodeCoverage/Report/Crap4j.php index 2deced2ce..524fbc67f 100644 --- a/src/CodeCoverage/Report/Crap4j.php +++ b/src/CodeCoverage/Report/Crap4j.php @@ -24,7 +24,7 @@ class PHP_CodeCoverage_Report_Crap4j public function __construct($threshold = 30) { if (!is_int($threshold)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'integer' ); diff --git a/src/CodeCoverage/Report/HTML.php b/src/CodeCoverage/Report/HTML.php index 80916ef3d..4829dd68f 100644 --- a/src/CodeCoverage/Report/HTML.php +++ b/src/CodeCoverage/Report/HTML.php @@ -153,9 +153,9 @@ private function copyFiles($target) } /** - * @param string $directory + * @param string $directory * @return string - * @throws PHP_CodeCoverage_Exception + * @throws PHP_CodeCoverage_RuntimeException * @since Method available since Release 1.2.0 */ private function getDirectory($directory) @@ -172,7 +172,7 @@ private function getDirectory($directory) return $directory; } - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( sprintf( 'Directory "%s" does not exist.', $directory diff --git a/src/CodeCoverage/Report/Node/Directory.php b/src/CodeCoverage/Report/Node/Directory.php index cd249f99e..b3a650a2b 100644 --- a/src/CodeCoverage/Report/Node/Directory.php +++ b/src/CodeCoverage/Report/Node/Directory.php @@ -155,12 +155,12 @@ public function addDirectory($name) /** * Adds a new file. * - * @param string $name - * @param array $coverageData - * @param array $testData - * @param bool $cacheTokens + * @param string $name + * @param array $coverageData + * @param array $testData + * @param bool $cacheTokens * @return PHP_CodeCoverage_Report_Node_File - * @throws PHP_CodeCoverage_Exception + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function addFile($name, array $coverageData, array $testData, $cacheTokens) { diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index ab5159d54..538fb6754 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -98,17 +98,17 @@ class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node /** * Constructor. * - * @param string $name - * @param PHP_CodeCoverage_Report_Node $parent - * @param array $coverageData - * @param array $testData - * @param bool $cacheTokens - * @throws PHP_CodeCoverage_Exception + * @param string $name + * @param PHP_CodeCoverage_Report_Node $parent + * @param array $coverageData + * @param array $testData + * @param bool $cacheTokens + * @throws PHP_CodeCoverage_InvalidArgumentException */ public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens) { if (!is_bool($cacheTokens)) { - throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory( + throw PHP_CodeCoverage_InvalidArgumentException::create( 1, 'boolean' ); diff --git a/src/CodeCoverage/Report/XML.php b/src/CodeCoverage/Report/XML.php index 5177b2bda..ebdd7e284 100644 --- a/src/CodeCoverage/Report/XML.php +++ b/src/CodeCoverage/Report/XML.php @@ -51,18 +51,18 @@ private function initTargetDirectory($dir) { if (file_exists($dir)) { if (!is_dir($dir)) { - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( "'$dir' exists but is not a directory." ); } if (!is_writable($dir)) { - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( "'$dir' exists but is not writable." ); } } elseif (!@mkdir($dir, 0777, true)) { - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( "'$dir' could not be created." ); } @@ -85,7 +85,7 @@ private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $direct continue; } - throw new PHP_CodeCoverage_Exception( + throw new PHP_CodeCoverage_RuntimeException( 'Unknown node type for XML report' ); } diff --git a/src/CodeCoverage/Report/XML/File/Coverage.php b/src/CodeCoverage/Report/XML/File/Coverage.php index 29a4e2ba8..964924826 100644 --- a/src/CodeCoverage/Report/XML/File/Coverage.php +++ b/src/CodeCoverage/Report/XML/File/Coverage.php @@ -41,7 +41,7 @@ public function __construct(DOMElement $context, $line) public function addTest($test) { if ($this->finalized) { - throw new PHP_CodeCoverage_Exception('Coverage Report already finalized'); + throw new PHP_CodeCoverage_RuntimeException('Coverage Report already finalized'); } $this->writer->startElement('covered'); From b5ea3a788a7ca6e48a7f5d5a8a2f7bb89206fe35 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 1 Sep 2015 17:01:35 +0200 Subject: [PATCH 044/114] Leftover from c472c131338768a35dd521be872b6c7580ecdc82 --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad88a08d5..8bceea85b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,6 @@ language: php php: - - 5.3.3 - - 5.3 - - 5.4 - - 5.5 - 5.6 before_script: From 4308b3a44ddba35e298792f22e8f3b0685f31191 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Wed, 2 Sep 2015 09:03:47 +0200 Subject: [PATCH 045/114] Update --- CONTRIBUTING.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 40dbc25e7..76a434585 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1 @@ -Pull Requests for bug fixes should be made against the current release branch (2.0). - -Pull Requests for new features should be made against master. - -For further notes please refer to [https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md) +Please refer to [https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md) for details on how to contribute to this project. From dcb2e05552151a9b3e9663a6f9959bf12b67453c Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 14 Sep 2015 08:39:41 +0200 Subject: [PATCH 046/114] Closes #382 --- ChangeLog-2.2.md | 7 +++++++ src/CodeCoverage/Report/Crap4j.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index a50b77299..25057d582 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [2.2.3] - 2015-09-14 + +### Fixed + +* Fixed [#382](https://github.com/sebastianbergmann/php-code-coverage/issues/382): Crap4J report generates incorrect XML logfile + ## [2.2.2] - 2015-08-04 ### Added @@ -33,6 +39,7 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in * The dedicated driver for HHVM, `PHP_CodeCoverage_Driver_HHVM` has been removed +[2.2.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.3...2.2.3 [2.2.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.1...2.2.2 [2.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.0...2.2.1 [2.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.1...2.2.0 diff --git a/src/CodeCoverage/Report/Crap4j.php b/src/CodeCoverage/Report/Crap4j.php index 2deced2ce..c006ea61e 100644 --- a/src/CodeCoverage/Report/Crap4j.php +++ b/src/CodeCoverage/Report/Crap4j.php @@ -116,7 +116,7 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null if ($fullMethodCount > 0) { $crapMethodPercent = $this->roundValue((100 * $fullCrapMethodCount) / $fullMethodCount); } else { - $crapMethodPercent = ''; + $crapMethodPercent = 0; } $stats->appendChild($document->createElement('crapMethodPercent', $crapMethodPercent)); From ef1ca6835468857944d5c3b48fa503d5554cff2f Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 14 Sep 2015 08:51:16 +0200 Subject: [PATCH 047/114] Prepare release --- ChangeLog-2.2.md | 3 +++ src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 25057d582..115e46e39 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -6,6 +6,9 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in ### Fixed +* Fixed [#368](https://github.com/sebastianbergmann/php-code-coverage/pull/368): Blacklists and whitelists are not merged when merging data sets +* Fixed [#370](https://github.com/sebastianbergmann/php-code-coverage/issues/370): Confusing statistics for source file that declares a class without methods +* Fixed [#372](https://github.com/sebastianbergmann/php-code-coverage/pull/372): Nested classes and functions are not handled correctly * Fixed [#382](https://github.com/sebastianbergmann/php-code-coverage/issues/382): Crap4J report generates incorrect XML logfile ## [2.2.2] - 2015-08-04 diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 46bf878a3..aacac889b 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('2.2.2', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('2.2.3', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 12259bb1352612df9ec24048714a3bedafe79674 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 24 Sep 2015 09:56:07 +0200 Subject: [PATCH 048/114] Remove blacklist functionality and make using a whitelist mandatory --- ChangeLog-3.0.md | 5 ++ src/CodeCoverage.php | 12 +-- src/CodeCoverage/Filter.php | 120 +------------------------- src/CodeCoverage/Report/PHP.php | 2 - tests/PHP/CodeCoverage/FilterTest.php | 86 +----------------- tests/TestCase.php | 25 ++++-- 6 files changed, 29 insertions(+), 221 deletions(-) diff --git a/ChangeLog-3.0.md b/ChangeLog-3.0.md index 026cbed92..fd90898ed 100644 --- a/ChangeLog-3.0.md +++ b/ChangeLog-3.0.md @@ -4,8 +4,13 @@ All notable changes of the PHP_CodeCoverage 3.0 release series are documented in ## [3.0.0] - 2015-10-02 +### Changed + +* It is now mandatory to configure a whitelist + ### Removed +* The blacklist functionality has been removed * PHP_CodeCoverage is no longer supported on PHP 5.3, PHP 5.4, and PHP 5.5 [3.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2...3.0.0 diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index e9f9bb514..65dfea5fc 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -155,12 +155,6 @@ public function getData($raw = false) $this->addUncoveredFilesFromWhitelist(); } - // We need to apply the blacklist filter a second time - // when no whitelist is used. - if (!$raw && !$this->filter->hasWhitelist()) { - $this->applyListsFilter($this->data); - } - return $this->data; } @@ -340,10 +334,6 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere */ public function merge(PHP_CodeCoverage $that) { - $this->filter->setBlacklistedFiles( - array_merge($this->filter->getBlacklistedFiles(), $that->filter()->getBlacklistedFiles()) - ); - $this->filter->setWhitelistedFiles( array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) ); @@ -538,7 +528,7 @@ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, ar } /** - * Applies the blacklist/whitelist filtering. + * Applies the whitelist filtering. * * @param array $data */ diff --git a/src/CodeCoverage/Filter.php b/src/CodeCoverage/Filter.php index 8ac10e3d3..06297e5db 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/CodeCoverage/Filter.php @@ -9,19 +9,12 @@ */ /** - * Filter for blacklisting and whitelisting of code coverage information. + * Filter for whitelisting of code coverage information. * * @since Class available since Release 1.0.0 */ class PHP_CodeCoverage_Filter { - /** - * Source files that are blacklisted. - * - * @var array - */ - private $blacklistedFiles = []; - /** * Source files that are whitelisted. * @@ -29,76 +22,6 @@ class PHP_CodeCoverage_Filter */ private $whitelistedFiles = []; - /** - * Adds a directory to the blacklist (recursively). - * - * @param string $directory - * @param string $suffix - * @param string $prefix - */ - public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '') - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->addFileToBlacklist($file); - } - } - - /** - * Adds a file to the blacklist. - * - * @param string $filename - */ - public function addFileToBlacklist($filename) - { - $this->blacklistedFiles[realpath($filename)] = true; - } - - /** - * Adds files to the blacklist. - * - * @param array $files - */ - public function addFilesToBlacklist(array $files) - { - foreach ($files as $file) { - $this->addFileToBlacklist($file); - } - } - - /** - * Removes a directory from the blacklist (recursively). - * - * @param string $directory - * @param string $suffix - * @param string $prefix - */ - public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '') - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->removeFileFromBlacklist($file); - } - } - - /** - * Removes a file from the blacklist. - * - * @param string $filename - */ - public function removeFileFromBlacklist($filename) - { - $filename = realpath($filename); - - if (isset($this->blacklistedFiles[$filename])) { - unset($this->blacklistedFiles[$filename]); - } - } - /** * Adds a directory to the whitelist (recursively). * @@ -194,9 +117,6 @@ public function isFile($filename) /** * Checks whether or not a file is filtered. * - * When the whitelist is empty (default), blacklisting is used. - * When the whitelist is not empty, whitelisting is used. - * * @param string $filename * @return bool */ @@ -208,21 +128,7 @@ public function isFiltered($filename) $filename = realpath($filename); - if (!empty($this->whitelistedFiles)) { - return !isset($this->whitelistedFiles[$filename]); - } - - return isset($this->blacklistedFiles[$filename]); - } - - /** - * Returns the list of blacklisted files. - * - * @return array - */ - public function getBlacklist() - { - return array_keys($this->blacklistedFiles); + return !isset($this->whitelistedFiles[$filename]); } /** @@ -246,28 +152,6 @@ public function hasWhitelist() return !empty($this->whitelistedFiles); } - /** - * Returns the blacklisted files. - * - * @return array - * @since Method available since Release 2.0.0 - */ - public function getBlacklistedFiles() - { - return $this->blacklistedFiles; - } - - /** - * Sets the blacklisted files. - * - * @param array $blacklistedFiles - * @since Method available since Release 2.0.0 - */ - public function setBlacklistedFiles($blacklistedFiles) - { - $this->blacklistedFiles = $blacklistedFiles; - } - /** * Returns the whitelisted files. * diff --git a/src/CodeCoverage/Report/PHP.php b/src/CodeCoverage/Report/PHP.php index f4e5a0f95..5871975ac 100644 --- a/src/CodeCoverage/Report/PHP.php +++ b/src/CodeCoverage/Report/PHP.php @@ -31,13 +31,11 @@ public function process(PHP_CodeCoverage $coverage, $target = null) $coverage->setTests(%s); $filter = $coverage->filter(); -$filter->setBlacklistedFiles(%s); $filter->setWhitelistedFiles(%s); return $coverage;', var_export($coverage->getData(true), 1), var_export($coverage->getTests(), 1), - var_export($filter->getBlacklistedFiles(), 1), var_export($filter->getWhitelistedFiles(), 1) ); diff --git a/tests/PHP/CodeCoverage/FilterTest.php b/tests/PHP/CodeCoverage/FilterTest.php index 6e2bd7cd9..c0e59e0ba 100644 --- a/tests/PHP/CodeCoverage/FilterTest.php +++ b/tests/PHP/CodeCoverage/FilterTest.php @@ -75,80 +75,6 @@ protected function setUp() ]; } - /** - * @covers PHP_CodeCoverage_Filter::addFileToBlacklist - * @covers PHP_CodeCoverage_Filter::getBlacklist - */ - public function testAddingAFileToTheBlacklistWorks() - { - $this->filter->addFileToBlacklist($this->files[0]); - - $this->assertEquals( - [$this->files[0]], - $this->filter->getBlacklist() - ); - } - - /** - * @covers PHP_CodeCoverage_Filter::removeFileFromBlacklist - * @covers PHP_CodeCoverage_Filter::getBlacklist - */ - public function testRemovingAFileFromTheBlacklistWorks() - { - $this->filter->addFileToBlacklist($this->files[0]); - $this->filter->removeFileFromBlacklist($this->files[0]); - - $this->assertEquals([], $this->filter->getBlacklist()); - } - - /** - * @covers PHP_CodeCoverage_Filter::addDirectoryToBlacklist - * @covers PHP_CodeCoverage_Filter::getBlacklist - * @depends testAddingAFileToTheBlacklistWorks - */ - public function testAddingADirectoryToTheBlacklistWorks() - { - $this->filter->addDirectoryToBlacklist(TEST_FILES_PATH); - - $blacklist = $this->filter->getBlacklist(); - sort($blacklist); - - $this->assertEquals($this->files, $blacklist); - } - - /** - * @covers PHP_CodeCoverage_Filter::addFilesToBlacklist - * @covers PHP_CodeCoverage_Filter::getBlacklist - */ - public function testAddingFilesToTheBlacklistWorks() - { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray( - TEST_FILES_PATH, - $suffixes = '.php' - ); - - $this->filter->addFilesToBlacklist($files); - - $blacklist = $this->filter->getBlacklist(); - sort($blacklist); - - $this->assertEquals($this->files, $blacklist); - } - - /** - * @covers PHP_CodeCoverage_Filter::removeDirectoryFromBlacklist - * @covers PHP_CodeCoverage_Filter::getBlacklist - * @depends testAddingADirectoryToTheBlacklistWorks - */ - public function testRemovingADirectoryFromTheBlacklistWorks() - { - $this->filter->addDirectoryToBlacklist(TEST_FILES_PATH); - $this->filter->removeDirectoryFromBlacklist(TEST_FILES_PATH); - - $this->assertEquals([], $this->filter->getBlacklist()); - } - /** * @covers PHP_CodeCoverage_Filter::addFileToWhitelist * @covers PHP_CodeCoverage_Filter::getWhitelist @@ -192,7 +118,7 @@ public function testAddingADirectoryToTheWhitelistWorks() /** * @covers PHP_CodeCoverage_Filter::addFilesToWhitelist - * @covers PHP_CodeCoverage_Filter::getBlacklist + * @covers PHP_CodeCoverage_Filter::getWhitelist */ public function testAddingFilesToTheWhitelistWorks() { @@ -237,15 +163,6 @@ public function testIsFile() $this->assertTrue($this->filter->isFile(__FILE__)); } - /** - * @covers PHP_CodeCoverage_Filter::isFiltered - */ - public function testBlacklistedFileIsFiltered() - { - $this->filter->addFileToBlacklist($this->files[0]); - $this->assertTrue($this->filter->isFiltered($this->files[0])); - } - /** * @covers PHP_CodeCoverage_Filter::isFiltered */ @@ -276,6 +193,5 @@ public function testNonFilesAreFiltered() $this->assertTrue($this->filter->isFiltered('runtime-created function')); $this->assertTrue($this->filter->isFiltered('assert code')); $this->assertTrue($this->filter->isFiltered('regexp code')); - $this->assertFalse($this->filter->isFiltered(__FILE__)); } } diff --git a/tests/TestCase.php b/tests/TestCase.php index d74c813ab..01b0a5714 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -81,7 +81,10 @@ protected function getCoverageForBankAccount() $data[3] )); - $coverage = new PHP_CodeCoverage($stub, new PHP_CodeCoverage_Filter); + $filter = new PHP_CodeCoverage_Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); + + $coverage = new PHP_CodeCoverage($stub, $filter); $coverage->start( new BankAccountTest('testBalanceIsInitiallyZero'), @@ -141,7 +144,10 @@ protected function getCoverageForBankAccountForFirstTwoTests() $data[1] )); - $coverage = new PHP_CodeCoverage($stub, new PHP_CodeCoverage_Filter); + $filter = new PHP_CodeCoverage_Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); + + $coverage = new PHP_CodeCoverage($stub, $filter); $coverage->start( new BankAccountTest('testBalanceIsInitiallyZero'), @@ -177,7 +183,10 @@ protected function getCoverageForBankAccountForLastTwoTests() $data[3] )); - $coverage = new PHP_CodeCoverage($stub, new PHP_CodeCoverage_Filter); + $filter = new PHP_CodeCoverage_Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); + + $coverage = new PHP_CodeCoverage($stub, $filter); $coverage->start( new BankAccountTest('testBalanceCannotBecomeNegative2') @@ -242,9 +251,12 @@ protected function getExpectedDataArrayForBankAccount() protected function getCoverageForFileWithIgnoredLines() { + $filter = new PHP_CodeCoverage_Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_ignore.php'); + $coverage = new PHP_CodeCoverage( $this->setUpXdebugStubForFileWithIgnoredLines(), - new PHP_CodeCoverage_Filter + $filter ); $coverage->start('FileWithIgnoredLines', true); @@ -274,9 +286,12 @@ protected function setUpXdebugStubForFileWithIgnoredLines() protected function getCoverageForClassWithAnonymousFunction() { + $filter = new PHP_CodeCoverage_Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php'); + $coverage = new PHP_CodeCoverage( $this->setUpXdebugStubForClassWithAnonymousFunction(), - new PHP_CodeCoverage_Filter + $filter ); $coverage->start('ClassWithAnonymousFunction', true); From 86e0dafb0e6c5165cce7b3b6892807d07504baa0 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 1 Oct 2015 08:46:13 +0200 Subject: [PATCH 049/114] Prepare release --- composer.json | 1 - src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 8d226e7d8..7c0622829 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,6 @@ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "irc": "irc://irc.freenode.net/phpunit" }, - "minimum-stability": "dev", "require": { "php": ">=5.6", "phpunit/php-file-iterator": "~1.3", diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index b74e21c6f..b579d9665 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('2.2.3', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.0.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 84b40c563a4eb4251670a23b23f808b32fcf74f5 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sat, 3 Oct 2015 07:44:56 +0200 Subject: [PATCH 050/114] Close #390 by removing outdated example scripts --- scripts/auto_append.php | 5 ----- scripts/auto_prepend.php | 10 ---------- 2 files changed, 15 deletions(-) delete mode 100644 scripts/auto_append.php delete mode 100644 scripts/auto_prepend.php diff --git a/scripts/auto_append.php b/scripts/auto_append.php deleted file mode 100644 index 6cd768d31..000000000 --- a/scripts/auto_append.php +++ /dev/null @@ -1,5 +0,0 @@ -stop(); - -$writer = new PHP_CodeCoverage_Report_HTML; -$writer->process($coverage, '/tmp/coverage'); diff --git a/scripts/auto_prepend.php b/scripts/auto_prepend.php deleted file mode 100644 index 7a8887a5b..000000000 --- a/scripts/auto_prepend.php +++ /dev/null @@ -1,10 +0,0 @@ -filter(); - -$filter->addFileToBlacklist(__FILE__); -$filter->addFileToBlacklist(dirname(__FILE__) . '/auto_append.php'); - -$coverage->start($_SERVER['SCRIPT_FILENAME']); From aae0847067ee4ce221b0f8ea3c7e6284eacf9fb1 Mon Sep 17 00:00:00 2001 From: Justinas Date: Tue, 6 Oct 2015 15:52:16 +0300 Subject: [PATCH 051/114] fixed missing abbr closing tag there was duplicate what should have been a . Also please backport this to 2.1 version --- src/CodeCoverage/Report/HTML/Renderer/Dashboard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php b/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php index a29b7f3d7..f648097db 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php +++ b/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php @@ -213,7 +213,7 @@ protected function insufficientCoverage(array $classes, $baseLink) list($class, $method) = explode('::', $methodName); $result['method'] .= sprintf( - ' %s%d%%' . "\n", + ' %s%d%%' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, From 7d0b056d652f7f1e6521f5a76c03e6353cf10f22 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 6 Oct 2015 11:46:19 -0400 Subject: [PATCH 052/114] Update ChangeLog --- ChangeLog-2.2.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 115e46e39..93b08c972 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [2.2.4] - 2015-10-DD + +### Fixed + +* Fixed [#391](https://github.com/sebastianbergmann/php-code-coverage/pull/391): Missing `` tag + ## [2.2.3] - 2015-09-14 ### Fixed @@ -42,7 +48,8 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in * The dedicated driver for HHVM, `PHP_CodeCoverage_Driver_HHVM` has been removed -[2.2.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.3...2.2.3 +[2.2.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.3...2.2.4 +[2.2.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.2...2.2.3 [2.2.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.1...2.2.2 [2.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2.0...2.2.1 [2.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.1...2.2.0 From eabf68b476ac7d0f73793aada060f1c1a9bf8979 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 6 Oct 2015 11:47:00 -0400 Subject: [PATCH 053/114] Prepare release --- ChangeLog-2.2.md | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog-2.2.md b/ChangeLog-2.2.md index 93b08c972..353b6f650 100644 --- a/ChangeLog-2.2.md +++ b/ChangeLog-2.2.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 2.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [2.2.4] - 2015-10-DD +## [2.2.4] - 2015-10-06 ### Fixed diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index aacac889b..51aa15e63 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('2.2.3', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('2.2.4', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From a76ed342958efa619b511210cd3bf741ba9066d6 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 27 Oct 2015 08:10:25 +0100 Subject: [PATCH 054/114] Initialize after validate --- src/CodeCoverage/Report/Clover.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/CodeCoverage/Report/Clover.php b/src/CodeCoverage/Report/Clover.php index aed52d71d..837f12811 100644 --- a/src/CodeCoverage/Report/Clover.php +++ b/src/CodeCoverage/Report/Clover.php @@ -44,8 +44,6 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null unset($coverage); foreach ($report as $item) { - $namespace = 'global'; - if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { continue; } @@ -53,9 +51,10 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null $xmlFile = $xmlDocument->createElement('file'); $xmlFile->setAttribute('name', $item->getPath()); - $classes = $item->getClassesAndTraits(); - $coverage = $item->getCoverageData(); - $lines = []; + $classes = $item->getClassesAndTraits(); + $coverage = $item->getCoverageData(); + $lines = []; + $namespace = 'global'; foreach ($classes as $className => $class) { $classStatements = 0; From d7dec4d20b4d59d47ca6a584c4a94b4a32295a91 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Thu, 5 Nov 2015 18:54:19 +0100 Subject: [PATCH 055/114] Remove workarounds for unsupported PHP versions --- .../Report/HTML/Renderer/File.php | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/src/CodeCoverage/Report/HTML/Renderer/File.php b/src/CodeCoverage/Report/HTML/Renderer/File.php index bb3eed488..5ab20c5bd 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/File.php +++ b/src/CodeCoverage/Report/HTML/Renderer/File.php @@ -8,28 +8,6 @@ * file that was distributed with this source code. */ -// @codeCoverageIgnoreStart -if (!defined('T_TRAIT')) { - define('T_TRAIT', 1001); -} - -if (!defined('T_INSTEADOF')) { - define('T_INSTEADOF', 1002); -} - -if (!defined('T_CALLABLE')) { - define('T_CALLABLE', 1003); -} - -if (!defined('T_FINALLY')) { - define('T_FINALLY', 1004); -} - -if (!defined('T_YIELD')) { - define('T_YIELD', 1005); -} -// @codeCoverageIgnoreEnd - /** * Renders a PHP_CodeCoverage_Report_Node_File node. * @@ -63,9 +41,7 @@ public function __construct($templatePath, $generator, $date, $lowUpperBound, $h $this->htmlspecialcharsFlags = ENT_COMPAT; - if (PHP_VERSION_ID >= 50400 && defined('ENT_SUBSTITUTE')) { - $this->htmlspecialcharsFlags = $this->htmlspecialcharsFlags | ENT_HTML401 | ENT_SUBSTITUTE; - } + $this->htmlspecialcharsFlags = $this->htmlspecialcharsFlags | ENT_HTML401 | ENT_SUBSTITUTE; } /** From ac9f3d6280484c3542c5f323f4475407c990d8e6 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 27 Oct 2015 10:08:59 +0100 Subject: [PATCH 056/114] Removed obsolete isset() Unset wont do anything in case var/array/offset doesn't exist. Same as 1e4aa0f05ff2d234b306cdc5eb4718b7a18c0fef --- src/CodeCoverage/Driver/Xdebug.php | 2 +- src/CodeCoverage/Filter.php | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/CodeCoverage/Driver/Xdebug.php b/src/CodeCoverage/Driver/Xdebug.php index 5cbb0d03d..ed9a7035b 100644 --- a/src/CodeCoverage/Driver/Xdebug.php +++ b/src/CodeCoverage/Driver/Xdebug.php @@ -68,7 +68,7 @@ private function cleanup(array $data) $numLines = $this->getNumberOfLinesInFile($file); foreach (array_keys($data[$file]) as $line) { - if (isset($data[$file][$line]) && $line > $numLines) { + if ($line > $numLines) { unset($data[$file][$line]); } } diff --git a/src/CodeCoverage/Filter.php b/src/CodeCoverage/Filter.php index 06297e5db..467fd98bb 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/CodeCoverage/Filter.php @@ -87,9 +87,7 @@ public function removeFileFromWhitelist($filename) { $filename = realpath($filename); - if (isset($this->whitelistedFiles[$filename])) { - unset($this->whitelistedFiles[$filename]); - } + unset($this->whitelistedFiles[$filename]); } /** From 25cc3d16d7f6dc2d90f125594515256ec29962fa Mon Sep 17 00:00:00 2001 From: Maks3w Date: Fri, 30 Oct 2015 10:54:18 +0100 Subject: [PATCH 057/114] Remove old feature mapTestClassNameToCoveredClassName Since v2.0 this feature does not work. Added on https://github.com/sebastianbergmann/php-code-coverage/commit/f320e4675dc30f72f061fc88f1ddc09f24750128 Removed on https://github.com/sebastianbergmann/php-code-coverage/commit/88d167dc08bb7602a84e21294662af0fe3e8002c --- src/CodeCoverage.php | 14 +------------- tests/PHP/CodeCoverageTest.php | 22 ---------------------- 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 65dfea5fc..d1ac2e9e7 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -42,11 +42,6 @@ class PHP_CodeCoverage */ private $forceCoversAnnotation = false; - /** - * @var bool - */ - private $mapTestClassNameToCoveredClassName = false; - /** * @var bool */ @@ -423,19 +418,12 @@ public function setForceCoversAnnotation($flag) } /** + * @deprecated * @param bool $flag * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setMapTestClassNameToCoveredClassName($flag) { - if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( - 1, - 'boolean' - ); - } - - $this->mapTestClassNameToCoveredClassName = $flag; } /** diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index d6c8aa40c..2c04ca4f4 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -216,28 +216,6 @@ public function testSetProcessUncoveredFilesFromWhitelist() ); } - /** - * @covers PHP_CodeCoverage::setMapTestClassNameToCoveredClassName - */ - public function testSetMapTestClassNameToCoveredClassName() - { - $this->coverage->setMapTestClassNameToCoveredClassName(true); - $this->assertAttributeEquals( - true, - 'mapTestClassNameToCoveredClassName', - $this->coverage - ); - } - - /** - * @covers PHP_CodeCoverage::setMapTestClassNameToCoveredClassName - * @expectedException PHP_CodeCoverage_Exception - */ - public function testSetMapTestClassNameToCoveredClassNameThrowsExceptionForInvalidArgument() - { - $this->coverage->setMapTestClassNameToCoveredClassName(null); - } - /** * @covers PHP_CodeCoverage::clear */ From 50d650cf1c1ad6ba6675ee2292f7b71cf5740726 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 3 Nov 2015 15:49:50 +0100 Subject: [PATCH 058/114] DRY and fix run individual tests --- tests/PHP/CodeCoverage/FilterTest.php | 8 +------- tests/PHP/CodeCoverage/Report/CloverTest.php | 10 +--------- tests/PHP/CodeCoverage/Report/FactoryTest.php | 10 +--------- tests/PHP/CodeCoverage/UtilTest.php | 2 ++ tests/PHP/CodeCoverageTest.php | 12 +----------- tests/TestCase.php | 5 +++++ 6 files changed, 11 insertions(+), 36 deletions(-) diff --git a/tests/PHP/CodeCoverage/FilterTest.php b/tests/PHP/CodeCoverage/FilterTest.php index c0e59e0ba..f39b95cdf 100644 --- a/tests/PHP/CodeCoverage/FilterTest.php +++ b/tests/PHP/CodeCoverage/FilterTest.php @@ -8,13 +8,7 @@ * file that was distributed with this source code. */ -if (!defined('TEST_FILES_PATH')) { - define( - 'TEST_FILES_PATH', - dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . - '_files' . DIRECTORY_SEPARATOR - ); -} +require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'TestCase.php'; /** * Tests for the PHP_CodeCoverage_Filter class. diff --git a/tests/PHP/CodeCoverage/Report/CloverTest.php b/tests/PHP/CodeCoverage/Report/CloverTest.php index 8d860bd2d..1b2174ee9 100644 --- a/tests/PHP/CodeCoverage/Report/CloverTest.php +++ b/tests/PHP/CodeCoverage/Report/CloverTest.php @@ -8,15 +8,7 @@ * file that was distributed with this source code. */ -if (!defined('TEST_FILES_PATH')) { - define( - 'TEST_FILES_PATH', - dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . - '_files' . DIRECTORY_SEPARATOR - ); -} - -require_once TEST_FILES_PATH . '../TestCase.php'; +require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; /** * Tests for the PHP_CodeCoverage_Report_Clover class. diff --git a/tests/PHP/CodeCoverage/Report/FactoryTest.php b/tests/PHP/CodeCoverage/Report/FactoryTest.php index 4c15f5c72..43616095d 100644 --- a/tests/PHP/CodeCoverage/Report/FactoryTest.php +++ b/tests/PHP/CodeCoverage/Report/FactoryTest.php @@ -8,15 +8,7 @@ * file that was distributed with this source code. */ -if (!defined('TEST_FILES_PATH')) { - define( - 'TEST_FILES_PATH', - dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . - '_files' . DIRECTORY_SEPARATOR - ); -} - -require_once TEST_FILES_PATH . '../TestCase.php'; +require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; /** * Tests for the PHP_CodeCoverage_Report_Factory class. diff --git a/tests/PHP/CodeCoverage/UtilTest.php b/tests/PHP/CodeCoverage/UtilTest.php index 0b4caea97..1cd8c20b8 100644 --- a/tests/PHP/CodeCoverage/UtilTest.php +++ b/tests/PHP/CodeCoverage/UtilTest.php @@ -8,6 +8,8 @@ * file that was distributed with this source code. */ +require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'TestCase.php'; + /** * Tests for the PHP_CodeCoverage_Util class. * diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index 2c04ca4f4..df8dfe41b 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -8,17 +8,7 @@ * file that was distributed with this source code. */ -if (!defined('TEST_FILES_PATH')) { - define( - 'TEST_FILES_PATH', - dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . - '_files' . DIRECTORY_SEPARATOR - ); -} - -require_once TEST_FILES_PATH . '../TestCase.php'; -require_once TEST_FILES_PATH . 'BankAccount.php'; -require_once TEST_FILES_PATH . 'BankAccountTest.php'; +require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'TestCase.php'; /** * Tests for the PHP_CodeCoverage class. diff --git a/tests/TestCase.php b/tests/TestCase.php index 01b0a5714..f6bfb9d60 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -8,6 +8,10 @@ * file that was distributed with this source code. */ +if (!defined('TEST_FILES_PATH')) { + define('TEST_FILES_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR); +} + /** * Abstract base class for test case classes. * @@ -70,6 +74,7 @@ protected function getXdebugDataForBankAccount() protected function getCoverageForBankAccount() { $data = $this->getXdebugDataForBankAccount(); + require_once TEST_FILES_PATH . 'BankAccountTest.php'; $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug'); $stub->expects($this->any()) From 795fe55e1c50ef25ff299d1ec6e051ca498d8719 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 3 Nov 2015 10:27:56 +0100 Subject: [PATCH 059/114] Tests for XML Report --- .gitignore | 1 + tests/PHP/CodeCoverage/Report/XMLTest.php | 108 ++++++++++++++++++ tests/TestCase.php | 7 ++ .../BankAccount.php.xml | 40 +++++++ .../XML/CoverageForBankAccount/index.xml | 29 +++++ .../index.xml | 26 +++++ ..._with_class_and_anonymous_function.php.xml | 41 +++++++ .../CoverageForFileWithIgnoredLines/index.xml | 26 +++++ .../source_with_ignore.php.xml | 28 +++++ 9 files changed, 306 insertions(+) create mode 100644 tests/PHP/CodeCoverage/Report/XMLTest.php create mode 100644 tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml create mode 100644 tests/_files/Report/XML/CoverageForBankAccount/index.xml create mode 100644 tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml create mode 100644 tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml create mode 100644 tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml create mode 100644 tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml diff --git a/.gitignore b/.gitignore index b386531f0..4486ead43 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ build/logs build/pdepend cache.properties phpunit.xml +/tests/_files/tmp /vendor /composer.lock /composer.phar diff --git a/tests/PHP/CodeCoverage/Report/XMLTest.php b/tests/PHP/CodeCoverage/Report/XMLTest.php new file mode 100644 index 000000000..f35ef74bd --- /dev/null +++ b/tests/PHP/CodeCoverage/Report/XMLTest.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; + +/** + * Tests for the PHP_CodeCoverage_Report_XML class. + * + * @since Class available since Release 3.0.2 + */ +class PHP_CodeCoverage_Report_XMLTest extends PHP_CodeCoverage_TestCase +{ + static private $TEST_REPORT_PATH_SOURCE; + + public static function setUpBeforeClass() + { + parent::setUpBeforeClass(); + + self::$TEST_REPORT_PATH_SOURCE = TEST_FILES_PATH . 'Report' . DIRECTORY_SEPARATOR . 'XML'; + } + + protected function tearDown() + { + parent::tearDown(); + + $tmpFilesIterator = new FilesystemIterator(self::$TEST_TMP_PATH); + foreach ($tmpFilesIterator as $path => $fileInfo) { + /* @var SplFileInfo $fileInfo */ + unlink($fileInfo->getPathname()); + } + } + + /** + * @covers PHP_CodeCoverage_Report_XML + */ + public function testForBankAccountTest() + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; + + $xml = new PHP_CodeCoverage_Report_XML; + $xml->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @covers PHP_CodeCoverage_Report_XML + */ + public function testForFileWithIgnoredLines() + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; + + $xml = new PHP_CodeCoverage_Report_XML; + $xml->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @covers PHP_CodeCoverage_Report_XML + */ + public function testForClassWithAnonymousFunction() + { + $expectedFilesPath = + self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; + + $xml = new PHP_CodeCoverage_Report_XML; + $xml->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @param string $expectedFilesPath + * @param string $actualFilesPath + */ + protected function assertFilesEquals($expectedFilesPath, $actualFilesPath) + { + $expectedFilesIterator = new FilesystemIterator($expectedFilesPath); + $actualFilesIterator = new FilesystemIterator($actualFilesPath); + + $this->assertEquals( + iterator_count($expectedFilesIterator), + iterator_count($actualFilesIterator), + 'Generated files and expected files not match' + ); + foreach ($expectedFilesIterator as $path => $fileInfo) { + /* @var SplFileInfo $fileInfo */ + $filename = $fileInfo->getFilename(); + + $actualFile = $actualFilesPath . DIRECTORY_SEPARATOR . $filename; + + $this->assertFileExists($actualFile); + $this->assertStringMatchesFormatFile( + $fileInfo->getPathname(), + file_get_contents($actualFile), + "${filename} not match" + ); + } + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php index f6bfb9d60..d03585cef 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -19,6 +19,13 @@ */ abstract class PHP_CodeCoverage_TestCase extends PHPUnit_Framework_TestCase { + static protected $TEST_TMP_PATH; + + public static function setUpBeforeClass() + { + self::$TEST_TMP_PATH = TEST_FILES_PATH . 'tmp'; + } + protected function getXdebugDataForBankAccount() { return [ diff --git a/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml b/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml new file mode 100644 index 000000000..d5c5d2e5f --- /dev/null +++ b/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/_files/Report/XML/CoverageForBankAccount/index.xml b/tests/_files/Report/XML/CoverageForBankAccount/index.xml new file mode 100644 index 000000000..27fc5b405 --- /dev/null +++ b/tests/_files/Report/XML/CoverageForBankAccount/index.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml b/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml new file mode 100644 index 000000000..6f9cd19c4 --- /dev/null +++ b/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml b/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml new file mode 100644 index 000000000..d42452474 --- /dev/null +++ b/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml b/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml new file mode 100644 index 000000000..35c0745d5 --- /dev/null +++ b/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml b/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml new file mode 100644 index 000000000..509990f87 --- /dev/null +++ b/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e7b24fcae1b1bac69195346738d1239fd17501ad Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 3 Nov 2015 16:15:54 +0100 Subject: [PATCH 060/114] Tests for HTML Report --- tests/PHP/CodeCoverage/Report/HTMLTest.php | 112 +++++++ .../BankAccount.php.html | 267 ++++++++++++++++ .../CoverageForBankAccount/dashboard.html | 290 ++++++++++++++++++ .../HTML/CoverageForBankAccount/index.html | 119 +++++++ .../dashboard.html | 288 +++++++++++++++++ .../index.html | 119 +++++++ ...with_class_and_anonymous_function.php.html | 211 +++++++++++++ .../dashboard.html | 286 +++++++++++++++++ .../index.html | 119 +++++++ .../source_with_ignore.php.html | 279 +++++++++++++++++ 10 files changed, 2090 insertions(+) create mode 100644 tests/PHP/CodeCoverage/Report/HTMLTest.php create mode 100644 tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html create mode 100644 tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html create mode 100644 tests/_files/Report/HTML/CoverageForBankAccount/index.html create mode 100644 tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html create mode 100644 tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html create mode 100644 tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html create mode 100644 tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html create mode 100644 tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html create mode 100644 tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html diff --git a/tests/PHP/CodeCoverage/Report/HTMLTest.php b/tests/PHP/CodeCoverage/Report/HTMLTest.php new file mode 100644 index 000000000..a58dcddd2 --- /dev/null +++ b/tests/PHP/CodeCoverage/Report/HTMLTest.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; + +/** + * Tests for the PHP_CodeCoverage_Report_HTML class. + * + * @since Class available since Release 3.0.2 + */ +class PHP_CodeCoverage_Report_HTMLTest extends PHP_CodeCoverage_TestCase +{ + static private $TEST_REPORT_PATH_SOURCE; + + public static function setUpBeforeClass() + { + parent::setUpBeforeClass(); + + self::$TEST_REPORT_PATH_SOURCE = TEST_FILES_PATH . 'Report' . DIRECTORY_SEPARATOR . 'HTML'; + } + + protected function tearDown() + { + parent::tearDown(); + + $tmpFilesIterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator(self::$TEST_TMP_PATH, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ); + foreach ($tmpFilesIterator as $path => $fileInfo) { + /* @var SplFileInfo $fileInfo */ + $pathname = $fileInfo->getPathname(); + $fileInfo->isDir() ? rmdir($pathname) : unlink($pathname); + } + } + + /** + * @covers PHP_CodeCoverage_Report_HTML + */ + public function testForBankAccountTest() + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; + + $report = new PHP_CodeCoverage_Report_HTML; + $report->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @covers PHP_CodeCoverage_Report_HTML + */ + public function testForFileWithIgnoredLines() + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; + + $report = new PHP_CodeCoverage_Report_HTML; + $report->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @covers PHP_CodeCoverage_Report_HTML + */ + public function testForClassWithAnonymousFunction() + { + $expectedFilesPath = + self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; + + $report = new PHP_CodeCoverage_Report_HTML; + $report->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @param string $expectedFilesPath + * @param string $actualFilesPath + */ + protected function assertFilesEquals($expectedFilesPath, $actualFilesPath) + { + $expectedFilesIterator = new FilesystemIterator($expectedFilesPath); + $actualFilesIterator = new RegexIterator(new FilesystemIterator($actualFilesPath), '/.html/'); + + $this->assertEquals( + iterator_count($expectedFilesIterator), + iterator_count($actualFilesIterator), + 'Generated files and expected files not match' + ); + foreach ($expectedFilesIterator as $path => $fileInfo) { + /* @var SplFileInfo $fileInfo */ + $filename = $fileInfo->getFilename(); + + $actualFile = $actualFilesPath . DIRECTORY_SEPARATOR . $filename; + + $this->assertFileExists($actualFile); + $this->assertStringMatchesFormatFile( + $fileInfo->getPathname(), + str_replace(PHP_EOL, "\n", file_get_contents($actualFile)), + "${filename} not match" + ); + } + } +} diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html b/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html new file mode 100644 index 000000000..a5dcd4c2b --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html @@ -0,0 +1,267 @@ + + + + + Code Coverage for %s/BankAccount.php + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
CRAP
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
BankAccount
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
8.12
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
 getBalance
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
 setBalance
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
6
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 5
 depositMoney
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
 withdrawMoney
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<?php
class BankAccount
{
    protected $balance = 0;
    public function getBalance()
    {
        return $this->balance;
    }
    protected function setBalance($balance)
    {
        if ($balance >= 0) {
            $this->balance = $balance;
        } else {
            throw new RuntimeException;
        }
    }
    public function depositMoney($balance)
    {
        $this->setBalance($this->getBalance() + $balance);
        return $this->getBalance();
    }
    public function withdrawMoney($balance)
    {
        $this->setBalance($this->getBalance() - $balance);
        return $this->getBalance();
    }
}
+
+
+

Legend

+

+ Executed + Not Executed + Dead Code +

+

+ Generated by PHP_CodeCoverage %s using %s at %s. +

+ +
+
+ + + + + + diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html b/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html new file mode 100644 index 000000000..651217a99 --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html @@ -0,0 +1,290 @@ + + + + + Dashboard for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+

Classes

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
ClassCoverage
BankAccount50%
+
+
+
+

Project Risks

+
+ + + + + + + + + + + +
ClassCRAP
BankAccount8
+
+
+
+
+
+

Methods

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
MethodCoverage
setBalance0%
+
+
+
+

Project Risks

+
+ + + + + + + + + + + +
MethodCRAP
setBalance6
+
+
+
+ +
+ + + + + + + + diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/index.html b/tests/_files/Report/HTML/CoverageForBankAccount/index.html new file mode 100644 index 000000000..5c99c2e42 --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForBankAccount/index.html @@ -0,0 +1,119 @@ + + + + + Code Coverage for %s + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
BankAccount.php
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+
+

Legend

+

+ Low: 0% to 50% + Medium: 50% to 90% + High: 90% to 100% +

+

+ Generated by PHP_CodeCoverage %s using %s at %s. +

+
+
+ + + + + diff --git a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html new file mode 100644 index 000000000..229b1675a --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html @@ -0,0 +1,288 @@ + + + + + Dashboard for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+

Classes

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
ClassCoverage
CoveredClassWithAnonymousFunctionInStaticMethod87%
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
ClassCRAP
+
+
+
+
+
+

Methods

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
MethodCoverage
runAnonymous66%
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
MethodCRAP
+
+
+
+ +
+ + + + + + + + diff --git a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html new file mode 100644 index 000000000..ace676be4 --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html @@ -0,0 +1,119 @@ + + + + + Code Coverage for %s + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
source_with_class_and_anonymous_function.php
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+
+

Legend

+

+ Low: 0% to 50% + Medium: 50% to 90% + High: 90% to 100% +

+

+ Generated by PHP_CodeCoverage %s using %s at %s. +

+
+
+ + + + + diff --git a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html new file mode 100644 index 000000000..ce90096b9 --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html @@ -0,0 +1,211 @@ + + + + + Code Coverage for %s/source_with_class_and_anonymous_function.php + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
CRAP
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
CoveredClassWithAnonymousFunctionInStaticMethod
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
2.01
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
 runAnonymous
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
1.04
+
+ 66.67% covered (warning) +
+
+
66.67%
2 / 3
 anonymous function
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
+ + + + + + + + + + + + + + + + + + + + + + + +
<?php
class CoveredClassWithAnonymousFunctionInStaticMethod
{
    public static function runAnonymous()
    {
        $filter = ['abc124', 'abc123', '123'];
        array_walk(
            $filter,
            function (&$val, $key) {
                $val = preg_replace('|[^0-9]|', '', $val);
            }
        );
        // Should be covered
        $extravar = true;
    }
}
+
+
+

Legend

+

+ Executed + Not Executed + Dead Code +

+

+ Generated by PHP_CodeCoverage %s using %s at %s. +

+ +
+
+ + + + + + diff --git a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html new file mode 100644 index 000000000..54deaeaba --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html @@ -0,0 +1,286 @@ + + + + + Dashboard for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+

Classes

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + +
ClassCoverage
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
ClassCRAP
+
+
+
+
+
+

Methods

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + +
MethodCoverage
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
MethodCRAP
+
+
+
+ +
+ + + + + + + + diff --git a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html new file mode 100644 index 000000000..2687444ff --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html @@ -0,0 +1,119 @@ + + + + + Code Coverage for %s + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
source_with_ignore.php
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
+
+
+

Legend

+

+ Low: 0% to 50% + Medium: 50% to 90% + High: 90% to 100% +

+

+ Generated by PHP_CodeCoverage %s using %s at %s. +

+
+
+ + + + + diff --git a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html new file mode 100644 index 000000000..251b5c309 --- /dev/null +++ b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html @@ -0,0 +1,279 @@ + + + + + Code Coverage for %s/source_with_ignore.php + + + + + + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
CRAP
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
baz
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
0
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
Foo
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
 bar
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
Bar
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
 foo
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
0 / 0
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<?php
if ($neverHappens) {
    // @codeCoverageIgnoreStart
    print '*';
    // @codeCoverageIgnoreEnd
}
/**
 * @codeCoverageIgnore
 */
class Foo
{
    public function bar()
    {
    }
}
class Bar
{
    /**
     * @codeCoverageIgnore
     */
    public function foo()
    {
    }
}
function baz()
{
    print '*'; // @codeCoverageIgnore
}
interface Bor
{
    public function foo();
}
+
+
+

Legend

+

+ Executed + Not Executed + Dead Code +

+

+ Generated by PHP_CodeCoverage %s using %s at %s. +

+ +
+
+ + + + + + From 7b42477fb810f6ccf92405df9b3c1d98cf3d9f16 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 3 Nov 2015 11:37:41 +0100 Subject: [PATCH 061/114] Tests for Crap4j Report --- tests/PHP/CodeCoverage/Report/Crap4jTest.php | 58 ++++++++++++++++++ tests/_files/BankAccount-crap4j.xml | 59 +++++++++++++++++++ .../class-with-anonymous-function-crap4j.xml | 37 ++++++++++++ tests/_files/ignored-lines-crap4j.xml | 37 ++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 tests/PHP/CodeCoverage/Report/Crap4jTest.php create mode 100644 tests/_files/BankAccount-crap4j.xml create mode 100644 tests/_files/class-with-anonymous-function-crap4j.xml create mode 100644 tests/_files/ignored-lines-crap4j.xml diff --git a/tests/PHP/CodeCoverage/Report/Crap4jTest.php b/tests/PHP/CodeCoverage/Report/Crap4jTest.php new file mode 100644 index 000000000..2822aaea5 --- /dev/null +++ b/tests/PHP/CodeCoverage/Report/Crap4jTest.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; + +/** + * Tests for the PHP_CodeCoverage_Report_Crap4j class. + * + * @since Class available since Release 3.0.2 + */ +class PHP_CodeCoverage_Report_Crap4jTest extends PHP_CodeCoverage_TestCase +{ + /** + * @covers PHP_CodeCoverage_Report_Crap4j + */ + public function testForBankAccountTest() + { + $crap4j = new PHP_CodeCoverage_Report_Crap4j; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'BankAccount-crap4j.xml', + $crap4j->process($this->getCoverageForBankAccount(), null, 'BankAccount') + ); + } + + /** + * @covers PHP_CodeCoverage_Report_Crap4j + */ + public function testForFileWithIgnoredLines() + { + $crap4j = new PHP_CodeCoverage_Report_Crap4j; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'ignored-lines-crap4j.xml', + $crap4j->process($this->getCoverageForFileWithIgnoredLines(), null, 'CoverageForFileWithIgnoredLines') + ); + } + + /** + * @covers PHP_CodeCoverage_Report_Crap4j + */ + public function testForClassWithAnonymousFunction() + { + $crap4j = new PHP_CodeCoverage_Report_Crap4j; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'class-with-anonymous-function-crap4j.xml', + $crap4j->process($this->getCoverageForClassWithAnonymousFunction(), null, 'CoverageForClassWithAnonymousFunction') + ); + } +} diff --git a/tests/_files/BankAccount-crap4j.xml b/tests/_files/BankAccount-crap4j.xml new file mode 100644 index 000000000..f2f56eabb --- /dev/null +++ b/tests/_files/BankAccount-crap4j.xml @@ -0,0 +1,59 @@ + + + BankAccount + %s + + Method Crap Stats + 4 + 0 + 0 + 9 + 0 + + + + global + BankAccount + getBalance + getBalance() + getBalance() + 1 + 1 + 100 + 0 + + + global + BankAccount + setBalance + setBalance($balance) + setBalance($balance) + 6 + 2 + 0 + 0 + + + global + BankAccount + depositMoney + depositMoney($balance) + depositMoney($balance) + 1 + 1 + 100 + 0 + + + global + BankAccount + withdrawMoney + withdrawMoney($balance) + withdrawMoney($balance) + 1 + 1 + 100 + 0 + + + diff --git a/tests/_files/class-with-anonymous-function-crap4j.xml b/tests/_files/class-with-anonymous-function-crap4j.xml new file mode 100644 index 000000000..696496dab --- /dev/null +++ b/tests/_files/class-with-anonymous-function-crap4j.xml @@ -0,0 +1,37 @@ + + + CoverageForClassWithAnonymousFunction + %s + + Method Crap Stats + 2 + 0 + 0 + 2.04 + 0 + + + + global + CoveredClassWithAnonymousFunctionInStaticMethod + runAnonymous + runAnonymous() + runAnonymous() + 1.04 + 1 + 66.67 + 0 + + + global + CoveredClassWithAnonymousFunctionInStaticMethod + anonymous function + anonymous function (&$val, $key) + anonymous function (&$val, $key) + 1 + 1 + 100 + 0 + + + diff --git a/tests/_files/ignored-lines-crap4j.xml b/tests/_files/ignored-lines-crap4j.xml new file mode 100644 index 000000000..2607b59ac --- /dev/null +++ b/tests/_files/ignored-lines-crap4j.xml @@ -0,0 +1,37 @@ + + + CoverageForFileWithIgnoredLines + %s + + Method Crap Stats + 2 + 0 + 0 + 2 + 0 + + + + global + Foo + bar + bar() + bar() + 1 + 1 + 100 + 0 + + + global + Bar + foo + foo() + foo() + 1 + 1 + 100 + 0 + + + From 0ef0028fef3de6c583b67cd43e0f22bace99847e Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 3 Nov 2015 11:41:51 +0100 Subject: [PATCH 062/114] Typo --- src/CodeCoverage/Report/Text.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CodeCoverage/Report/Text.php b/src/CodeCoverage/Report/Text.php index 174546fd8..d37a6d77c 100644 --- a/src/CodeCoverage/Report/Text.php +++ b/src/CodeCoverage/Report/Text.php @@ -223,9 +223,9 @@ protected function getCoverageColor($numberOfCoveredElements, $totalNumberOfElem return $this->colors['red']; } - protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfElements, $presicion) + protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfElements, $precision) { - $format = '%' . $presicion . 's'; + $format = '%' . $precision . 's'; return PHP_CodeCoverage_Util::percent( $numberOfCoveredElements, From 18f9c8dc1e460f9da7ecfe5027f850f1348def09 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Tue, 3 Nov 2015 18:07:16 +0100 Subject: [PATCH 063/114] Tests for Text Report --- tests/PHP/CodeCoverage/Report/TextTest.php | 58 +++++++++++++++++++ tests/_files/BankAccount-text.txt | 12 ++++ .../class-with-anonymous-function-text.txt | 12 ++++ tests/_files/ignored-lines-text.txt | 10 ++++ 4 files changed, 92 insertions(+) create mode 100644 tests/PHP/CodeCoverage/Report/TextTest.php create mode 100644 tests/_files/BankAccount-text.txt create mode 100644 tests/_files/class-with-anonymous-function-text.txt create mode 100644 tests/_files/ignored-lines-text.txt diff --git a/tests/PHP/CodeCoverage/Report/TextTest.php b/tests/PHP/CodeCoverage/Report/TextTest.php new file mode 100644 index 000000000..18e4125d8 --- /dev/null +++ b/tests/PHP/CodeCoverage/Report/TextTest.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; + +/** + * Tests for the PHP_CodeCoverage_Report_Text class. + * + * @since Class available since Release 3.0.2 + */ +class PHP_CodeCoverage_Report_TextTest extends PHP_CodeCoverage_TestCase +{ + /** + * @covers PHP_CodeCoverage_Report_Text + */ + public function testTextForBankAccountTest() + { + $text = new PHP_CodeCoverage_Report_Text(50, 90, false, false); + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'BankAccount-text.txt', + str_replace(PHP_EOL, "\n", $text->process($this->getCoverageForBankAccount())) + ); + } + + /** + * @covers PHP_CodeCoverage_Report_Text + */ + public function testTextForFileWithIgnoredLines() + { + $text = new PHP_CodeCoverage_Report_Text(50, 90, false, false); + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'ignored-lines-text.txt', + str_replace(PHP_EOL, "\n", $text->process($this->getCoverageForFileWithIgnoredLines())) + ); + } + + /** + * @covers PHP_CodeCoverage_Report_Text + */ + public function testTextForClassWithAnonymousFunction() + { + $text = new PHP_CodeCoverage_Report_Text(50, 90, false, false); + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'class-with-anonymous-function-text.txt', + str_replace(PHP_EOL, "\n", $text->process($this->getCoverageForClassWithAnonymousFunction())) + ); + } +} diff --git a/tests/_files/BankAccount-text.txt b/tests/_files/BankAccount-text.txt new file mode 100644 index 000000000..892d83464 --- /dev/null +++ b/tests/_files/BankAccount-text.txt @@ -0,0 +1,12 @@ + + +Code Coverage Report: + %s + + Summary: + Classes: 0.00% (0/1) + Methods: 75.00% (3/4) + Lines: 50.00% (5/10) + +BankAccount + Methods: 75.00% ( 3/ 4) Lines: 50.00% ( 5/ 10) diff --git a/tests/_files/class-with-anonymous-function-text.txt b/tests/_files/class-with-anonymous-function-text.txt new file mode 100644 index 000000000..0eb257e5f --- /dev/null +++ b/tests/_files/class-with-anonymous-function-text.txt @@ -0,0 +1,12 @@ + + +Code Coverage Report: + %s + + Summary: + Classes: 0.00% (0/1) + Methods: 50.00% (1/2) + Lines: 87.50% (7/8) + +CoveredClassWithAnonymousFunctionInStaticMethod + Methods: 50.00% ( 1/ 2) Lines: 80.00% ( 4/ 5) diff --git a/tests/_files/ignored-lines-text.txt b/tests/_files/ignored-lines-text.txt new file mode 100644 index 000000000..428303873 --- /dev/null +++ b/tests/_files/ignored-lines-text.txt @@ -0,0 +1,10 @@ + + +Code Coverage Report: + %s + + Summary: + Classes: 100.00% (2/2) + Methods: (0/0) + Lines: 50.00% (1/2) + From bf3f2b887e7996877e54b4a06baef4675522ddce Mon Sep 17 00:00:00 2001 From: Maks3w Date: Wed, 4 Nov 2015 12:42:18 +0100 Subject: [PATCH 064/114] DRY Method definition --- src/CodeCoverage/Report/Node/File.php | 49 ++++++++++++++------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 538fb6754..5b837cf75 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -558,18 +558,7 @@ protected function processClasses(PHP_Token_Stream $tokens) $this->endLines[$class['endLine']] = &$this->classes[$className]; foreach ($class['methods'] as $methodName => $method) { - $this->classes[$className]['methods'][$methodName] = [ - 'methodName' => $methodName, - 'signature' => $method['signature'], - 'startLine' => $method['startLine'], - 'endLine' => $method['endLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => $method['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $method['startLine'] - ]; + $this->classes[$className]['methods'][$methodName] = $this->newMethod($methodName, $method, $link); $this->startLines[$method['startLine']] = &$this->classes[$className]['methods'][$methodName]; $this->endLines[$method['endLine']] = &$this->classes[$className]['methods'][$methodName]; @@ -605,18 +594,7 @@ protected function processTraits(PHP_Token_Stream $tokens) $this->endLines[$trait['endLine']] = &$this->traits[$traitName]; foreach ($trait['methods'] as $methodName => $method) { - $this->traits[$traitName]['methods'][$methodName] = [ - 'methodName' => $methodName, - 'signature' => $method['signature'], - 'startLine' => $method['startLine'], - 'endLine' => $method['endLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => $method['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $method['startLine'] - ]; + $this->traits[$traitName]['methods'][$methodName] = $this->newMethod($methodName, $method, $link); $this->startLines[$method['startLine']] = &$this->traits[$traitName]['methods'][$methodName]; $this->endLines[$method['endLine']] = &$this->traits[$traitName]['methods'][$methodName]; @@ -676,4 +654,27 @@ protected function crap($ccn, $coverage) pow($ccn, 2) * pow(1 - $coverage/100, 3) + $ccn ); } + + /** + * @param string $methodName + * @param array $method + * @param string $link + * + * @return array + */ + private function newMethod($methodName, array $method, $link) + { + return [ + 'methodName' => $methodName, + 'signature' => $method['signature'], + 'startLine' => $method['startLine'], + 'endLine' => $method['endLine'], + 'executableLines' => 0, + 'executedLines' => 0, + 'ccn' => $method['ccn'], + 'coverage' => 0, + 'crap' => 0, + 'link' => $link . $method['startLine'] + ]; + } } From a2570702ae2685e779232e7f4c909205301549b8 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Wed, 4 Nov 2015 12:53:44 +0100 Subject: [PATCH 065/114] Add method visibility to Clover report --- src/CodeCoverage/Report/Clover.php | 13 ++++++++---- src/CodeCoverage/Report/Node/File.php | 21 ++++++++++--------- tests/PHP/CodeCoverage/Report/FactoryTest.php | 12 +++++++---- tests/_files/BankAccount-clover.xml | 8 +++---- .../class-with-anonymous-function-clover.xml | 2 +- 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/CodeCoverage/Report/Clover.php b/src/CodeCoverage/Report/Clover.php index 837f12811..1a9d84a78 100644 --- a/src/CodeCoverage/Report/Clover.php +++ b/src/CodeCoverage/Report/Clover.php @@ -84,10 +84,11 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null } $lines[$method['startLine']] = [ - 'count' => $methodCount, - 'crap' => $method['crap'], - 'type' => 'method', - 'name' => $methodName + 'count' => $methodCount, + 'crap' => $method['crap'], + 'type' => 'method', + 'visibility' => $method['visibility'], + 'name' => $methodName ]; } @@ -175,6 +176,10 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null $xmlLine->setAttribute('name', $data['name']); } + if (isset($data['visibility'])) { + $xmlLine->setAttribute('visibility', $data['visibility']); + } + if (isset($data['crap'])) { $xmlLine->setAttribute('crap', $data['crap']); } diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 5b837cf75..f5b2ffb48 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -657,7 +657,7 @@ protected function crap($ccn, $coverage) /** * @param string $methodName - * @param array $method + * @param array $method * @param string $link * * @return array @@ -665,16 +665,17 @@ protected function crap($ccn, $coverage) private function newMethod($methodName, array $method, $link) { return [ - 'methodName' => $methodName, - 'signature' => $method['signature'], - 'startLine' => $method['startLine'], - 'endLine' => $method['endLine'], + 'methodName' => $methodName, + 'visibility' => $method['visibility'], + 'signature' => $method['signature'], + 'startLine' => $method['startLine'], + 'endLine' => $method['endLine'], 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => $method['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $method['startLine'] + 'executedLines' => 0, + 'ccn' => $method['ccn'], + 'coverage' => 0, + 'crap' => 0, + 'link' => $link . $method['startLine'], ]; } } diff --git a/tests/PHP/CodeCoverage/Report/FactoryTest.php b/tests/PHP/CodeCoverage/Report/FactoryTest.php index 43616095d..9d1aeba60 100644 --- a/tests/PHP/CodeCoverage/Report/FactoryTest.php +++ b/tests/PHP/CodeCoverage/Report/FactoryTest.php @@ -61,7 +61,8 @@ public function testSomething() 'coverage' => 100, 'crap' => '1', 'link' => 'BankAccount.php.html#6', - 'methodName' => 'getBalance' + 'methodName' => 'getBalance', + 'visibility' => 'public', ], 'setBalance' => [ 'signature' => 'setBalance($balance)', @@ -73,7 +74,8 @@ public function testSomething() 'coverage' => 0, 'crap' => 6, 'link' => 'BankAccount.php.html#11', - 'methodName' => 'setBalance' + 'methodName' => 'setBalance', + 'visibility' => 'protected', ], 'depositMoney' => [ 'signature' => 'depositMoney($balance)', @@ -85,7 +87,8 @@ public function testSomething() 'coverage' => 100, 'crap' => '1', 'link' => 'BankAccount.php.html#20', - 'methodName' => 'depositMoney' + 'methodName' => 'depositMoney', + 'visibility' => 'public', ], 'withdrawMoney' => [ 'signature' => 'withdrawMoney($balance)', @@ -97,7 +100,8 @@ public function testSomething() 'coverage' => 100, 'crap' => '1', 'link' => 'BankAccount.php.html#27', - 'methodName' => 'withdrawMoney' + 'methodName' => 'withdrawMoney', + 'visibility' => 'public', ], ], 'startLine' => 2, diff --git a/tests/_files/BankAccount-clover.xml b/tests/_files/BankAccount-clover.xml index 578a7ccc1..a2abc9752 100644 --- a/tests/_files/BankAccount-clover.xml +++ b/tests/_files/BankAccount-clover.xml @@ -5,18 +5,18 @@ - + - + - + - + diff --git a/tests/_files/class-with-anonymous-function-clover.xml b/tests/_files/class-with-anonymous-function-clover.xml index ac43b8061..45668eb2e 100644 --- a/tests/_files/class-with-anonymous-function-clover.xml +++ b/tests/_files/class-with-anonymous-function-clover.xml @@ -5,7 +5,7 @@ - + From 182aeab7b4714420ab0e1cc34537a33bdb79f920 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Wed, 4 Nov 2015 16:46:39 +0100 Subject: [PATCH 066/114] Add cyclomatic complexity to Clover report --- src/CodeCoverage/Report/Clover.php | 6 ++++++ tests/_files/BankAccount-clover.xml | 10 +++++----- tests/_files/class-with-anonymous-function-clover.xml | 6 +++--- tests/_files/ignored-lines-clover.xml | 4 ++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/CodeCoverage/Report/Clover.php b/src/CodeCoverage/Report/Clover.php index 1a9d84a78..6c8fda190 100644 --- a/src/CodeCoverage/Report/Clover.php +++ b/src/CodeCoverage/Report/Clover.php @@ -84,6 +84,7 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null } $lines[$method['startLine']] = [ + 'ccn' => $method['ccn'], 'count' => $methodCount, 'crap' => $method['crap'], 'type' => 'method', @@ -131,6 +132,7 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null $xmlFile->appendChild($xmlClass); $xmlMetrics = $xmlDocument->createElement('metrics'); + $xmlMetrics->setAttribute('complexity', $class['ccn']); $xmlMetrics->setAttribute('methods', $classMethods); $xmlMetrics->setAttribute('coveredmethods', $coveredMethods); $xmlMetrics->setAttribute('conditionals', 0); @@ -180,6 +182,10 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null $xmlLine->setAttribute('visibility', $data['visibility']); } + if (isset($data['ccn'])) { + $xmlLine->setAttribute('complexity', $data['ccn']); + } + if (isset($data['crap'])) { $xmlLine->setAttribute('crap', $data['crap']); } diff --git a/tests/_files/BankAccount-clover.xml b/tests/_files/BankAccount-clover.xml index a2abc9752..0986fdf71 100644 --- a/tests/_files/BankAccount-clover.xml +++ b/tests/_files/BankAccount-clover.xml @@ -3,20 +3,20 @@ - + - + - + - + - + diff --git a/tests/_files/class-with-anonymous-function-clover.xml b/tests/_files/class-with-anonymous-function-clover.xml index 45668eb2e..d6a8b4085 100644 --- a/tests/_files/class-with-anonymous-function-clover.xml +++ b/tests/_files/class-with-anonymous-function-clover.xml @@ -3,13 +3,13 @@ - + - + - + diff --git a/tests/_files/ignored-lines-clover.xml b/tests/_files/ignored-lines-clover.xml index cda929cd3..81a9aaa3d 100644 --- a/tests/_files/ignored-lines-clover.xml +++ b/tests/_files/ignored-lines-clover.xml @@ -3,10 +3,10 @@ - + - + From cd9da22b5f25d05b9c4d87076e1e730dcd21193f Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 6 Nov 2015 07:28:59 +0100 Subject: [PATCH 067/114] Bump version --- ChangeLog-3.1.md | 8 ++++++++ composer.json | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 ChangeLog-3.1.md diff --git a/ChangeLog-3.1.md b/ChangeLog-3.1.md new file mode 100644 index 000000000..bd003bb59 --- /dev/null +++ b/ChangeLog-3.1.md @@ -0,0 +1,8 @@ +# Changes in PHP_CodeCoverage 3.1 + +All notable changes of the PHP_CodeCoverage 3.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [3.1.0] - 2015-MM-DD + +[3.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.0...3.1.0 + diff --git a/composer.json b/composer.json index 7c0622829..ae56bfb27 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.1.x-dev" } } } diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 63ebb6721..e669cd789 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.0.1', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.1', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 049bc0101828c3bb84741c91e2deb58975d017b1 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Fri, 6 Nov 2015 07:44:50 +0100 Subject: [PATCH 068/114] Fix since tags --- tests/PHP/CodeCoverage/Report/Crap4jTest.php | 2 +- tests/PHP/CodeCoverage/Report/HTMLTest.php | 2 +- tests/PHP/CodeCoverage/Report/TextTest.php | 2 +- tests/PHP/CodeCoverage/Report/XMLTest.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/PHP/CodeCoverage/Report/Crap4jTest.php b/tests/PHP/CodeCoverage/Report/Crap4jTest.php index 2822aaea5..b768b8025 100644 --- a/tests/PHP/CodeCoverage/Report/Crap4jTest.php +++ b/tests/PHP/CodeCoverage/Report/Crap4jTest.php @@ -13,7 +13,7 @@ /** * Tests for the PHP_CodeCoverage_Report_Crap4j class. * - * @since Class available since Release 3.0.2 + * @since Class available since Release 3.1.0 */ class PHP_CodeCoverage_Report_Crap4jTest extends PHP_CodeCoverage_TestCase { diff --git a/tests/PHP/CodeCoverage/Report/HTMLTest.php b/tests/PHP/CodeCoverage/Report/HTMLTest.php index a58dcddd2..1d38c9971 100644 --- a/tests/PHP/CodeCoverage/Report/HTMLTest.php +++ b/tests/PHP/CodeCoverage/Report/HTMLTest.php @@ -13,7 +13,7 @@ /** * Tests for the PHP_CodeCoverage_Report_HTML class. * - * @since Class available since Release 3.0.2 + * @since Class available since Release 3.1.0 */ class PHP_CodeCoverage_Report_HTMLTest extends PHP_CodeCoverage_TestCase { diff --git a/tests/PHP/CodeCoverage/Report/TextTest.php b/tests/PHP/CodeCoverage/Report/TextTest.php index 18e4125d8..0081caaf9 100644 --- a/tests/PHP/CodeCoverage/Report/TextTest.php +++ b/tests/PHP/CodeCoverage/Report/TextTest.php @@ -13,7 +13,7 @@ /** * Tests for the PHP_CodeCoverage_Report_Text class. * - * @since Class available since Release 3.0.2 + * @since Class available since Release 3.1.0 */ class PHP_CodeCoverage_Report_TextTest extends PHP_CodeCoverage_TestCase { diff --git a/tests/PHP/CodeCoverage/Report/XMLTest.php b/tests/PHP/CodeCoverage/Report/XMLTest.php index f35ef74bd..90699192c 100644 --- a/tests/PHP/CodeCoverage/Report/XMLTest.php +++ b/tests/PHP/CodeCoverage/Report/XMLTest.php @@ -13,7 +13,7 @@ /** * Tests for the PHP_CodeCoverage_Report_XML class. * - * @since Class available since Release 3.0.2 + * @since Class available since Release 3.1.0 */ class PHP_CodeCoverage_Report_XMLTest extends PHP_CodeCoverage_TestCase { From 21d924d9347aaa818c65f94d54be2a5dc087487c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Rish=C3=B8j?= Date: Tue, 27 Oct 2015 13:12:31 +0700 Subject: [PATCH 069/114] PHP 7 compatibility Passing a boolean to `debug_backtrace` causes ` TypeError` in PHP 7 --- src/CodeCoverage/Exception/InvalidArgumentException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Exception/InvalidArgumentException.php b/src/CodeCoverage/Exception/InvalidArgumentException.php index 68d072b64..41cff7778 100644 --- a/src/CodeCoverage/Exception/InvalidArgumentException.php +++ b/src/CodeCoverage/Exception/InvalidArgumentException.php @@ -21,7 +21,7 @@ class PHP_CodeCoverage_InvalidArgumentException extends InvalidArgumentException */ public static function create($argument, $type, $value = null) { - $stack = debug_backtrace(false); + $stack = debug_backtrace(PHP_VERSION_ID < 50306 ? false : 0); return new self( sprintf( From 85a7b89e8c74bd7c3493414ec31a51661d90353e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Rish=C3=B8j?= Date: Wed, 28 Oct 2015 11:34:46 +0700 Subject: [PATCH 070/114] Update InvalidArgumentException.php --- src/CodeCoverage/Exception/InvalidArgumentException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Exception/InvalidArgumentException.php b/src/CodeCoverage/Exception/InvalidArgumentException.php index 41cff7778..30f754007 100644 --- a/src/CodeCoverage/Exception/InvalidArgumentException.php +++ b/src/CodeCoverage/Exception/InvalidArgumentException.php @@ -21,7 +21,7 @@ class PHP_CodeCoverage_InvalidArgumentException extends InvalidArgumentException */ public static function create($argument, $type, $value = null) { - $stack = debug_backtrace(PHP_VERSION_ID < 50306 ? false : 0); + $stack = debug_backtrace(0); return new self( sprintf( From 9c795d3b24d0881acbed94cdd14b6106edba4066 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Fri, 6 Nov 2015 10:30:15 +0100 Subject: [PATCH 071/114] Fix Xdebug required version Composer dev dependency requires Xdebug 2.2.1 --- README.md | 2 +- src/CodeCoverage/Driver/Xdebug.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 43dcb61bc..41e253487 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ PHP 5.6 is required but using the latest version of PHP is highly recommended ### PHP 5 -[Xdebug](http://xdebug.org/) is the only source of raw code coverage data supported for PHP 5. Version 2.1.3 of Xdebug is required but using the latest version is highly recommended. +[Xdebug](http://xdebug.org/) is the only source of raw code coverage data supported for PHP 5. Version 2.2.1 of Xdebug is required but using the latest version is highly recommended. ### PHP 7 diff --git a/src/CodeCoverage/Driver/Xdebug.php b/src/CodeCoverage/Driver/Xdebug.php index ed9a7035b..069f16aac 100644 --- a/src/CodeCoverage/Driver/Xdebug.php +++ b/src/CodeCoverage/Driver/Xdebug.php @@ -25,7 +25,7 @@ public function __construct() throw new PHP_CodeCoverage_RuntimeException('This driver requires Xdebug'); } - if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') && + if (version_compare(phpversion('xdebug'), '2.2.1', '>=') && !ini_get('xdebug.coverage_enable')) { throw new PHP_CodeCoverage_RuntimeException( 'xdebug.coverage_enable=On has to be set in php.ini' From bb588928441579cc7cdffc69124898a6b44bb198 Mon Sep 17 00:00:00 2001 From: Maks3w Date: Wed, 4 Nov 2015 15:28:35 +0100 Subject: [PATCH 072/114] Workaround Travis Xdebug < 2.3 --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 8bceea85b..4459eb803 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,10 @@ language: php php: - 5.6 +install: + - pecl install xdebug + - php --version + before_script: - COMPOSER_ROOT_VERSION=dev-master composer install --prefer-source From 3e8e8c5b7cc76a1199e251ded7b417dfcf7684a5 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 6 Nov 2015 14:55:10 +0100 Subject: [PATCH 073/114] Revert "Workaround Travis Xdebug < 2.3" This reverts commit bb588928441579cc7cdffc69124898a6b44bb198. --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4459eb803..8bceea85b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,6 @@ language: php php: - 5.6 -install: - - pecl install xdebug - - php --version - before_script: - COMPOSER_ROOT_VERSION=dev-master composer install --prefer-source From 839af7c8f43dd84418d246bab6faf480f014fa49 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 12 Nov 2015 16:07:19 -0500 Subject: [PATCH 074/114] Make #351 optional --- ChangeLog-3.0.md | 7 +++++++ src/CodeCoverage.php | 24 +++++++++++++++++++++++- tests/PHP/CodeCoverageTest.php | 22 ++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/ChangeLog-3.0.md b/ChangeLog-3.0.md index af7eaeb16..acf1d53f3 100644 --- a/ChangeLog-3.0.md +++ b/ChangeLog-3.0.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 3.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [3.0.2] - 2015-11-DD + +### Changed + +* It is now optional that `@deprecated` code is ignored + ## [3.0.1] - 2015-10-06 ### Fixed @@ -19,6 +25,7 @@ All notable changes of the PHP_CodeCoverage 3.0 release series are documented in * The blacklist functionality has been removed * PHP_CodeCoverage is no longer supported on PHP 5.3, PHP 5.4, and PHP 5.5 +[3.0.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/2.2...3.0.0 diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 65dfea5fc..759e86d1e 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -57,6 +57,11 @@ class PHP_CodeCoverage */ private $processUncoveredFilesFromWhitelist = false; + /** + * @var bool + */ + private $ignoreDeprecatedCode = false; + /** * @var mixed */ @@ -486,6 +491,23 @@ public function setDisableIgnoredLines($flag) $this->disableIgnoredLines = $flag; } + /** + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException + * @since Method available since Release 3.0.2 + */ + public function setIgnoreDeprecatedCode($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_InvalidArgumentException::create( + 1, + 'boolean' + ); + } + + $this->ignoreDeprecatedCode = $flag; + } + /** * Applies the @covers annotation filtering. * @@ -732,7 +754,7 @@ private function getLinesToBeIgnored($filename) $this->ignoredLines[$filename][] = $token->getLine(); - if (strpos($docblock, '@codeCoverageIgnore') || strpos($docblock, '@deprecated')) { + if (strpos($docblock, '@codeCoverageIgnore') || ($this->ignoreDeprecatedCode && strpos($docblock, '@deprecated'))) { $endLine = $token->getEndLine(); for ($i = $token->getLine(); $i <= $endLine; $i++) { diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index d6c8aa40c..a06bcc070 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -238,6 +238,28 @@ public function testSetMapTestClassNameToCoveredClassNameThrowsExceptionForInval $this->coverage->setMapTestClassNameToCoveredClassName(null); } + /** + * @covers PHP_CodeCoverage::setIgnoreDeprecatedCode + */ + public function testSetIgnoreDeprecatedCode() + { + $this->coverage->setIgnoreDeprecatedCode(true); + $this->assertAttributeEquals( + true, + 'ignoreDeprecatedCode', + $this->coverage + ); + } + + /** + * @covers PHP_CodeCoverage::setIgnoreDeprecatedCode + * @expectedException PHP_CodeCoverage_Exception + */ + public function testSetIgnoreDeprecatedCodeThrowsExceptionForInvalidArgument() + { + $this->coverage->setIgnoreDeprecatedCode(null); + } + /** * @covers PHP_CodeCoverage::clear */ From f7bb5cddf4ffe113eeb737b05241adb947b43f9d Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 12 Nov 2015 16:08:20 -0500 Subject: [PATCH 075/114] Prepare release --- ChangeLog-3.0.md | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog-3.0.md b/ChangeLog-3.0.md index acf1d53f3..a39fa8d47 100644 --- a/ChangeLog-3.0.md +++ b/ChangeLog-3.0.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 3.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.0.2] - 2015-11-DD +## [3.0.2] - 2015-11-12 ### Changed diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 63ebb6721..49858b35d 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.0.1', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.0.2', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From d2644cfc7c91d97794fd2d8c312fc9f9697ade74 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 12 Nov 2015 16:11:32 -0500 Subject: [PATCH 076/114] Fix WS --- tests/PHP/CodeCoverageTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index a06bcc070..ac7b2be72 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -252,7 +252,7 @@ public function testSetIgnoreDeprecatedCode() } /** - * @covers PHP_CodeCoverage::setIgnoreDeprecatedCode + * @covers PHP_CodeCoverage::setIgnoreDeprecatedCode * @expectedException PHP_CodeCoverage_Exception */ public function testSetIgnoreDeprecatedCodeThrowsExceptionForInvalidArgument() From 168eaf45fca981d91cde54cf42fff6cd1ab83e0b Mon Sep 17 00:00:00 2001 From: Sebastian Heuer Date: Wed, 23 Dec 2015 13:18:31 +0100 Subject: [PATCH 077/114] #234: add optional check for unexecuted covered or used code --- src/CodeCoverage.php | 64 +++++++++++++++ .../CoveredCodeNotExecutedException.php | 18 +++++ tests/PHP/CodeCoverageTest.php | 77 +++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 2b1f0fb6f..098dd9a1c 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -42,6 +42,11 @@ class PHP_CodeCoverage */ private $forceCoversAnnotation = false; + /** + * @var bool + */ + private $checkForUnexecutedCoveredCode = false; + /** * @var bool */ @@ -422,6 +427,22 @@ public function setForceCoversAnnotation($flag) $this->forceCoversAnnotation = $flag; } + /** + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException + */ + public function setCheckForUnexecutedCoveredCode($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_InvalidArgumentException::create( + 1, + 'boolean' + ); + } + + $this->checkForUnexecutedCoveredCode = $flag; + } + /** * @deprecated * @param bool $flag @@ -525,6 +546,10 @@ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, ar ); } + if($this->checkForUnexecutedCoveredCode) { + $this->performUnexecutedCoveredCodeCheck($data, $linesToBeCovered, $linesToBeUsed); + } + $data = array_intersect_key($data, $linesToBeCovered); foreach (array_keys($data) as $filename) { @@ -858,6 +883,45 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin } } + /** + * @param array $data + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_CoveredCodeNotExecutedException + */ + private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) + { + $expectedLines = $this->getAllowedLines( + $linesToBeCovered, + $linesToBeUsed + ); + + foreach ($data as $file => $_data) { + foreach (array_keys($_data) as $line) { + if (!isset($expectedLines[$file][$line])) { + continue; + } + unset($expectedLines[$file][$line]); + } + } + + $message = ''; + foreach ($expectedLines as $file => $lines) { + if (empty($lines)) { + continue; + } + foreach (array_keys($lines) as $line) { + $message .= sprintf('- %s:%d' . PHP_EOL, $file, $line); + } + } + + if (!empty($message)) { + throw new PHP_CodeCoverage_CoveredCodeNotExecutedException($message); + } + + } + + /** * @param array $linesToBeCovered * @param array $linesToBeUsed diff --git a/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php b/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php new file mode 100644 index 000000000..80a7fea73 --- /dev/null +++ b/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Exception that is raised when covered code is not executed. + * + * @since Class available since Release 2.0.0 + */ +class PHP_CodeCoverage_CoveredCodeNotExecutedException extends PHP_CodeCoverage_RuntimeException +{ +} diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index 865619224..b9f8db979 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -162,6 +162,28 @@ public function testSetForceCoversAnnotation() ); } + /** + * @covers PHP_CodeCoverage::setCheckForUnexecutedCoveredCode + * @expectedException PHP_CodeCoverage_Exception + */ + public function testSetCheckForUnexecutedCoveredCodeThrowsExceptionForInvalidArgument() + { + $this->coverage->setCheckForUnexecutedCoveredCode(null); + } + + /** + * @covers PHP_CodeCoverage::setCheckForUnexecutedCoveredCode + */ + public function testSetCheckForUnexecutedCoveredCode() + { + $this->coverage->setCheckForUnexecutedCoveredCode(true); + $this->assertAttributeEquals( + true, + 'checkForUnexecutedCoveredCode', + $this->coverage + ); + } + /** * @covers PHP_CodeCoverage::setAddUncoveredFilesFromWhitelist * @expectedException PHP_CodeCoverage_Exception @@ -474,4 +496,59 @@ public function testGetLinesToBeIgnoredWhenIgnoreIsDisabled() ) ); } + + /** + * @covers PHP_CodeCoverage::performUnexecutedCoveredCodeCheck + * @expectedException PHP_CodeCoverage_CoveredCodeNotExecutedException + */ + public function testAppendThrowsExceptionIfCoveredCodeWasNotExecuted() + { + $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); + $this->coverage->setCheckForUnexecutedCoveredCode(true); + $data = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 29 => -1, + 31 => -1 + ] + ]; + $linesToBeCovered = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 22, + 24 + ] + ]; + $linesToBeUsed = []; + + $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); + } + + /** + * @covers PHP_CodeCoverage::performUnexecutedCoveredCodeCheck + * @expectedException PHP_CodeCoverage_CoveredCodeNotExecutedException + */ + public function testAppendThrowsExceptionIfUsedCodeWasNotExecuted() + { + $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); + $this->coverage->setCheckForUnexecutedCoveredCode(true); + $data = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 29 => -1, + 31 => -1 + ] + ]; + $linesToBeCovered = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 29, + 31 + ] + ]; + $linesToBeUsed = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 22, + 24 + ] + ]; + + $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); + } } From 7a8a5cf671ee6d837097f23c7e4c3e59afbc3d5d Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 3 Jan 2016 16:20:54 +0100 Subject: [PATCH 078/114] Fix CS/WS issues --- src/CodeCoverage.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 098dd9a1c..5c3e92cf5 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -546,7 +546,7 @@ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, ar ); } - if($this->checkForUnexecutedCoveredCode) { + if ($this->checkForUnexecutedCoveredCode) { $this->performUnexecutedCoveredCodeCheck($data, $linesToBeCovered, $linesToBeUsed); } @@ -884,9 +884,9 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin } /** - * @param array $data - * @param array $linesToBeCovered - * @param array $linesToBeUsed + * @param array $data + * @param array $linesToBeCovered + * @param array $linesToBeUsed * @throws PHP_CodeCoverage_CoveredCodeNotExecutedException */ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) @@ -901,15 +901,18 @@ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToB if (!isset($expectedLines[$file][$line])) { continue; } + unset($expectedLines[$file][$line]); } } $message = ''; + foreach ($expectedLines as $file => $lines) { if (empty($lines)) { continue; } + foreach (array_keys($lines) as $line) { $message .= sprintf('- %s:%d' . PHP_EOL, $file, $line); } @@ -921,7 +924,6 @@ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToB } - /** * @param array $linesToBeCovered * @param array $linesToBeUsed From 5b9d5654b3de4609c71bc8eb9f11263a5e2e6528 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 3 Jan 2016 16:22:43 +0100 Subject: [PATCH 079/114] Update ChangeLog --- ChangeLog-3.1.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog-3.1.md b/ChangeLog-3.1.md index bd003bb59..e8fdfc253 100644 --- a/ChangeLog-3.1.md +++ b/ChangeLog-3.1.md @@ -2,7 +2,11 @@ All notable changes of the PHP_CodeCoverage 3.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.1.0] - 2015-MM-DD +## [3.1.0] - 2016-MM-DD + +### Added + +* Implemented [#234](https://github.com/sebastianbergmann/php-code-coverage/issues/234): Optionally raise an exception when a specified unit of code is not executed [3.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.0...3.1.0 From 0b327d81069aa41b5147abd33a2c53324557890d Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 3 Jan 2016 16:28:24 +0100 Subject: [PATCH 080/114] Fix annotation --- src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php b/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php index 80a7fea73..80feff19a 100644 --- a/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php +++ b/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php @@ -11,7 +11,7 @@ /** * Exception that is raised when covered code is not executed. * - * @since Class available since Release 2.0.0 + * @since Class available since Release 3.1.0 */ class PHP_CodeCoverage_CoveredCodeNotExecutedException extends PHP_CodeCoverage_RuntimeException { From 64d40a593fc31a8abf4ce3d200147ddf8ca64e52 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 11 Jan 2016 11:05:34 +0100 Subject: [PATCH 081/114] Prepare release --- ChangeLog-3.1.md | 13 ++++++++++++- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ChangeLog-3.1.md b/ChangeLog-3.1.md index e8fdfc253..c120bdfd8 100644 --- a/ChangeLog-3.1.md +++ b/ChangeLog-3.1.md @@ -2,11 +2,22 @@ All notable changes of the PHP_CodeCoverage 3.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.1.0] - 2016-MM-DD +## [3.1.0] - 2016-01-11 ### Added * Implemented [#234](https://github.com/sebastianbergmann/php-code-coverage/issues/234): Optionally raise an exception when a specified unit of code is not executed +### Changed + +* The Clover XML report now contains cyclomatic complexity information +* The Clover XML report now contains method visibility information +* Cleanup and refactoring of various areas of code +* Added missing test cases + +### Removed + +* The functionality controlled by the `mapTestClassNameToCoveredClassName` setting has been removed + [3.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.0...3.1.0 diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index e669cd789..f9778e3e4 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.1', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.1.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 95a0e74bc622c55a3aae76fdc9abd89c82fd4bc5 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 4 Feb 2016 14:01:55 +0100 Subject: [PATCH 082/114] Bump --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ae56bfb27..741a8af82 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" + "sebastian/version": "~1.0|~2.0" }, "require-dev": { "phpunit/phpunit": "~5", From 92f5c61b5c64159faec5298325ffab0c7e59dcc8 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 4 Feb 2016 14:05:19 +0100 Subject: [PATCH 083/114] Prepare release --- ChangeLog-3.1.md | 7 +++++++ src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog-3.1.md b/ChangeLog-3.1.md index c120bdfd8..f7a0de904 100644 --- a/ChangeLog-3.1.md +++ b/ChangeLog-3.1.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 3.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [3.1.1] - 2016-02-04 + +### Changed + +* Allow version 2.0.x of `sebastian/version` dependency + ## [3.1.0] - 2016-01-11 ### Added @@ -19,5 +25,6 @@ All notable changes of the PHP_CodeCoverage 3.1 release series are documented in * The functionality controlled by the `mapTestClassNameToCoveredClassName` setting has been removed +[3.1.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.1.0...3.1.1 [3.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.0...3.1.0 diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index f9778e3e4..f80c31835 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.1.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.1.1', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 9c3582b20a916a5599ede39dea4b1248d1ad46d1 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 8 Feb 2016 06:51:11 -0500 Subject: [PATCH 084/114] Added optional check for missing `@covers` annotation when the usage of `@covers` annotations is forced --- ChangeLog-3.2.md | 12 +++++++++ composer.json | 2 +- src/CodeCoverage.php | 27 +++++++++++++++++++ .../MissingCoversAnnotationException.php | 18 +++++++++++++ tests/PHP/CodeCoverageTest.php | 22 +++++++++++++++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 ChangeLog-3.2.md create mode 100644 src/CodeCoverage/Exception/MissingCoversAnnotationException.php diff --git a/ChangeLog-3.2.md b/ChangeLog-3.2.md new file mode 100644 index 000000000..41eb3381e --- /dev/null +++ b/ChangeLog-3.2.md @@ -0,0 +1,12 @@ +# Changes in PHP_CodeCoverage 3.2 + +All notable changes of the PHP_CodeCoverage 3.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [3.2.0] - 2016-MM-DD + +### Added + +* Added optional check for missing `@covers` annotation when the usage of `@covers` annotations is forced + +[3.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.1...3.2.0 + diff --git a/composer.json b/composer.json index 741a8af82..1007aaa62 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "3.2.x-dev" } } } diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 5c3e92cf5..ec5ee3d50 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -47,6 +47,11 @@ class PHP_CodeCoverage */ private $checkForUnexecutedCoveredCode = false; + /** + * @var bool + */ + private $checkForMissingCoversAnnotation = false; + /** * @var bool */ @@ -427,6 +432,23 @@ public function setForceCoversAnnotation($flag) $this->forceCoversAnnotation = $flag; } + /** + * @param bool $flag + * @throws PHP_CodeCoverage_InvalidArgumentException + * @since Method available since Release 3.2.0 + */ + public function setCheckForMissingCoversAnnotation($flag) + { + if (!is_bool($flag)) { + throw PHP_CodeCoverage_InvalidArgumentException::create( + 1, + 'boolean' + ); + } + + $this->checkForMissingCoversAnnotation = $flag; + } + /** * @param bool $flag * @throws PHP_CodeCoverage_InvalidArgumentException @@ -523,12 +545,17 @@ public function setIgnoreDeprecatedCode($flag) * @param array $data * @param mixed $linesToBeCovered * @param array $linesToBeUsed + * @throws PHP_CodeCoverage_MissingCoversAnnotationException * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException */ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed) { if ($linesToBeCovered === false || ($this->forceCoversAnnotation && empty($linesToBeCovered))) { + if ($this->checkForMissingCoversAnnotation) { + throw new PHP_CodeCoverage_MissingCoversAnnotationException; + } + $data = []; return; diff --git a/src/CodeCoverage/Exception/MissingCoversAnnotationException.php b/src/CodeCoverage/Exception/MissingCoversAnnotationException.php new file mode 100644 index 000000000..442aaa3e3 --- /dev/null +++ b/src/CodeCoverage/Exception/MissingCoversAnnotationException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Exception that is raised when @covers must be used but is not. + * + * @since Class available since Release 3.2.0 + */ +class PHP_CodeCoverage_MissingCoversAnnotationException extends PHP_CodeCoverage_RuntimeException +{ +} diff --git a/tests/PHP/CodeCoverageTest.php b/tests/PHP/CodeCoverageTest.php index b9f8db979..76d7ac662 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/PHP/CodeCoverageTest.php @@ -149,6 +149,28 @@ public function testSetForceCoversAnnotationThrowsExceptionForInvalidArgument() $this->coverage->setForceCoversAnnotation(null); } + /** + * @covers PHP_CodeCoverage::setCheckForMissingCoversAnnotation + */ + public function testSetCheckForMissingCoversAnnotation() + { + $this->coverage->setCheckForMissingCoversAnnotation(true); + $this->assertAttributeEquals( + true, + 'checkForMissingCoversAnnotation', + $this->coverage + ); + } + + /** + * @covers PHP_CodeCoverage::setCheckForMissingCoversAnnotation + * @expectedException PHP_CodeCoverage_Exception + */ + public function testSetCheckForMissingCoversAnnotationThrowsExceptionForInvalidArgument() + { + $this->coverage->setCheckForMissingCoversAnnotation(null); + } + /** * @covers PHP_CodeCoverage::setForceCoversAnnotation */ From de5312e02ecf7406ee311bd4e2a22a105965242d Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Mon, 8 Feb 2016 15:41:48 -0500 Subject: [PATCH 085/114] Use function or method name in PHP_CodeCoverage_UnintentionallyCoveredCodeException messages --- ChangeLog-3.2.md | 4 ++++ composer.json | 3 +++ src/CodeCoverage.php | 31 ++++++++++++++++++++++++------- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/ChangeLog-3.2.md b/ChangeLog-3.2.md index 41eb3381e..82d01df44 100644 --- a/ChangeLog-3.2.md +++ b/ChangeLog-3.2.md @@ -8,5 +8,9 @@ All notable changes of the PHP_CodeCoverage 3.2 release series are documented in * Added optional check for missing `@covers` annotation when the usage of `@covers` annotations is forced +### Changed + +* Improved `PHP_CodeCoverage_UnintentionallyCoveredCodeException` message + [3.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.1...3.2.0 diff --git a/composer.json b/composer.json index 1007aaa62..7bc91536b 100644 --- a/composer.json +++ b/composer.json @@ -20,11 +20,14 @@ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "irc": "irc://irc.freenode.net/phpunit" }, + "minimum-stability": "dev", + "prefer-stable": true, "require": { "php": ">=5.6", "phpunit/php-file-iterator": "~1.3", "phpunit/php-token-stream": "~1.3", "phpunit/php-text-template": "~1.2", + "sebastian/code-unit-reverse-lookup": "~1.0", "sebastian/environment": "^1.3.2", "sebastian/version": "~1.0|~2.0" }, diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index ec5ee3d50..8e4dfe485 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -8,6 +8,7 @@ * file that was distributed with this source code. */ +use SebastianBergmann\CodeUnitReverseLookup\Wizard; use SebastianBergmann\Environment\Runtime; /** @@ -27,6 +28,11 @@ class PHP_CodeCoverage */ private $filter; + /** + * @var Wizard + */ + private $wizard; + /** * @var bool */ @@ -115,6 +121,8 @@ public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCove $this->driver = $driver; $this->filter = $filter; + + $this->wizard = new Wizard; } /** @@ -887,23 +895,32 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin $linesToBeUsed ); - $message = ''; + $unintentionallyCoveredUnits = []; foreach ($data as $file => $_data) { foreach ($_data as $line => $flag) { if ($flag == 1 && (!isset($allowedLines[$file]) || !isset($allowedLines[$file][$line]))) { - $message .= sprintf( - '- %s:%d' . PHP_EOL, - $file, - $line - ); + if ($this->wizard->lookup($file, $line)) { + $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); + } else { + $unintentionallyCoveredUnits[] = $file . ':' . $line; + } } } } - if (!empty($message)) { + if (!empty($unintentionallyCoveredUnits)) { + $message = ''; + + $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); + sort($unintentionallyCoveredUnits); + + foreach ($unintentionallyCoveredUnits as $unit) { + $message .= '- ' . $unit . "\n"; + } + throw new PHP_CodeCoverage_UnintentionallyCoveredCodeException( $message ); From 494035f6a2642c4be6829a2eee7adf77462d6dd3 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 9 Feb 2016 04:16:52 -0500 Subject: [PATCH 086/114] Simplify --- src/CodeCoverage.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 8e4dfe485..096139301 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -899,9 +899,7 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin foreach ($data as $file => $_data) { foreach ($_data as $line => $flag) { - if ($flag == 1 && - (!isset($allowedLines[$file]) || - !isset($allowedLines[$file][$line]))) { + if ($flag == 1 && !isset($allowedLines[$file][$line])) { if ($this->wizard->lookup($file, $line)) { $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); } else { From 1650650d901849c1919f060ae97bc8642cc99e51 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Tue, 9 Feb 2016 04:17:37 -0500 Subject: [PATCH 087/114] Sync with https://github.com/sebastianbergmann/code-unit-reverse-lookup/commit/2bdf09e1b05a6bccf60751c7828f2e4c2fbfcaf5 --- src/CodeCoverage.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 096139301..aca5f20ae 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -900,11 +900,7 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin foreach ($data as $file => $_data) { foreach ($_data as $line => $flag) { if ($flag == 1 && !isset($allowedLines[$file][$line])) { - if ($this->wizard->lookup($file, $line)) { - $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); - } else { - $unintentionallyCoveredUnits[] = $file . ':' . $line; - } + $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); } } } From c70c937f206cb12e6a2746a99d2e22c0bb92e670 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 12 Feb 2016 16:13:47 -0500 Subject: [PATCH 088/114] Refactor --- src/CodeCoverage.php | 8 +---- .../UnintentionallyCoveredCodeException.php | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index aca5f20ae..e62319527 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -906,17 +906,11 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin } if (!empty($unintentionallyCoveredUnits)) { - $message = ''; - $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); sort($unintentionallyCoveredUnits); - foreach ($unintentionallyCoveredUnits as $unit) { - $message .= '- ' . $unit . "\n"; - } - throw new PHP_CodeCoverage_UnintentionallyCoveredCodeException( - $message + $unintentionallyCoveredUnits ); } } diff --git a/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php b/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php index 398276a3a..d4268a0b9 100644 --- a/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php +++ b/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php @@ -15,4 +15,40 @@ */ class PHP_CodeCoverage_UnintentionallyCoveredCodeException extends PHP_CodeCoverage_RuntimeException { + /** + * @var array + */ + private $unintentionallyCoveredUnits = []; + + /** + * @param array $unintentionallyCoveredUnits + */ + public function __construct(array $unintentionallyCoveredUnits) + { + $this->unintentionallyCoveredUnits = $unintentionallyCoveredUnits; + + parent::__construct($this->toString()); + } + + /** + * @return array + */ + public function getUnintentionallyCoveredUnits() + { + return $this->unintentionallyCoveredUnits; + } + + /** + * @return string + */ + private function toString() + { + $message = ''; + + foreach ($this->unintentionallyCoveredUnits as $unit) { + $message .= '- ' . $unit . "\n"; + } + + return $message; + } } From 85f5db2d0a0da79ad6a256eb54148ba383059ad9 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sat, 13 Feb 2016 07:47:56 +0100 Subject: [PATCH 089/114] Prepare release --- ChangeLog-3.2.md | 2 +- composer.json | 2 -- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ChangeLog-3.2.md b/ChangeLog-3.2.md index 82d01df44..bc5a096fc 100644 --- a/ChangeLog-3.2.md +++ b/ChangeLog-3.2.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 3.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.2.0] - 2016-MM-DD +## [3.2.0] - 2016-02-13 ### Added diff --git a/composer.json b/composer.json index 7bc91536b..cb471cf70 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,6 @@ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "irc": "irc://irc.freenode.net/phpunit" }, - "minimum-stability": "dev", - "prefer-stable": true, "require": { "php": ">=5.6", "phpunit/php-file-iterator": "~1.3", diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index f80c31835..af2e48bb1 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.1.1', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.2.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From c4e323ebc72cb74727dd382250922531325afdba Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 18 Feb 2016 07:22:29 +0000 Subject: [PATCH 090/114] In order to support PHP 7.0, token stream PHP7 tokens are required New tokens were included in `phpunit/php-token-stream:1.4.2` (see https://github.com/sebastianbergmann/php-token-stream/commit/db63be1159c81df649cd0260e30249a586d4129e#diff-07ca42cd43d34e41ef921ccbe0e830deR713) Without these tokens, this package is not compatible with PHP 7.0, and running coverage will result in a fatal error --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index cb471cf70..f08cf9de6 100644 --- a/composer.json +++ b/composer.json @@ -21,9 +21,9 @@ "irc": "irc://irc.freenode.net/phpunit" }, "require": { - "php": ">=5.6", + "php": "^5.6 || ^7.0", "phpunit/php-file-iterator": "~1.3", - "phpunit/php-token-stream": "~1.3", + "phpunit/php-token-stream": "^1.4.2", "phpunit/php-text-template": "~1.2", "sebastian/code-unit-reverse-lookup": "~1.0", "sebastian/environment": "^1.3.2", From 59d6696fe71a09fa1a8b2739e238a102fe25239f Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 18 Feb 2016 08:30:48 +0100 Subject: [PATCH 091/114] Update ChangeLog --- ChangeLog-3.2.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ChangeLog-3.2.md b/ChangeLog-3.2.md index bc5a096fc..6e13a560b 100644 --- a/ChangeLog-3.2.md +++ b/ChangeLog-3.2.md @@ -2,6 +2,12 @@ All notable changes of the PHP_CodeCoverage 3.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [3.2.1] - 2016-MM-DD + +### Changed + +* Updated dependency information in `composer.json` + ## [3.2.0] - 2016-02-13 ### Added @@ -12,5 +18,6 @@ All notable changes of the PHP_CodeCoverage 3.2 release series are documented in * Improved `PHP_CodeCoverage_UnintentionallyCoveredCodeException` message +[3.2.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.2.0...3.2.1 [3.2.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.1...3.2.0 From a58f95ae76fe201b571fad3e8370a50c4368678c Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 18 Feb 2016 08:31:12 +0100 Subject: [PATCH 092/114] Prepare release --- ChangeLog-3.2.md | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog-3.2.md b/ChangeLog-3.2.md index 6e13a560b..34c65cf49 100644 --- a/ChangeLog-3.2.md +++ b/ChangeLog-3.2.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 3.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.2.1] - 2016-MM-DD +## [3.2.1] - 2016-02-18 ### Changed diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index af2e48bb1..a40be42a8 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.2.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.2.1', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 560f7c7e9d388fb58188828bf128dde30ec2439d Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 3 Mar 2016 09:32:36 +0100 Subject: [PATCH 093/114] Bump version --- ChangeLog-3.3.md | 12 ++++++++++++ composer.json | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 ChangeLog-3.3.md diff --git a/ChangeLog-3.3.md b/ChangeLog-3.3.md new file mode 100644 index 000000000..15f8789be --- /dev/null +++ b/ChangeLog-3.3.md @@ -0,0 +1,12 @@ +# Changes in PHP_CodeCoverage 3.3 + +All notable changes of the PHP_CodeCoverage 3.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [3.3.0] - 2016-MM-DD + +### Added + +* Added optional check for missing `@covers` annotation when the usage of `@covers` annotations is forced + +[3.3.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.2...3.3.0 + diff --git a/composer.json b/composer.json index f08cf9de6..9125ac631 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "3.3.x-dev" } } } diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index a40be42a8..94f7f1a22 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.2.1', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.3', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 7e1c08a74fb2a2d2689414cbf5f0ef14fd154def Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 3 Mar 2016 09:48:01 +0100 Subject: [PATCH 094/114] Add support for whitelisting classes for the unintentionally covered code unit check --- ChangeLog-3.3.md | 2 +- src/CodeCoverage.php | 49 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/ChangeLog-3.3.md b/ChangeLog-3.3.md index 15f8789be..e86516a31 100644 --- a/ChangeLog-3.3.md +++ b/ChangeLog-3.3.md @@ -6,7 +6,7 @@ All notable changes of the PHP_CodeCoverage 3.3 release series are documented in ### Added -* Added optional check for missing `@covers` annotation when the usage of `@covers` annotations is forced +* Added support for whitelisting classes for the unintentionally covered code unit check [3.3.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.2...3.3.0 diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index e62319527..d489a8137 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -102,6 +102,11 @@ class PHP_CodeCoverage */ private $tests = []; + /** + * @var string[] + */ + private $unintentionallyCoveredSubclassesWhitelist = []; + /** * Constructor. * @@ -547,6 +552,15 @@ public function setIgnoreDeprecatedCode($flag) $this->ignoreDeprecatedCode = $flag; } + /** + * @param array $whitelist + * @since Method available since Release 3.3.0 + */ + public function setUnintentionallyCoveredSubclassesWhitelist(array $whitelist) + { + $this->unintentionallyCoveredSubclassesWhitelist = $whitelist; + } + /** * Applies the @covers annotation filtering. * @@ -905,10 +919,9 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin } } - if (!empty($unintentionallyCoveredUnits)) { - $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); - sort($unintentionallyCoveredUnits); + $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); + if (!empty($unintentionallyCoveredUnits)) { throw new PHP_CodeCoverage_UnintentionallyCoveredCodeException( $unintentionallyCoveredUnits ); @@ -1017,4 +1030,34 @@ private function selectDriver() return new PHP_CodeCoverage_Driver_Xdebug; } } + + /** + * @param array $unintentionallyCoveredUnits + * + * @return array + */ + private function processUnintentionallyCoveredUnits(array $unintentionallyCoveredUnits) + { + $unintentionallyCoveredUnits = array_unique($unintentionallyCoveredUnits); + sort($unintentionallyCoveredUnits); + + foreach (array_keys($unintentionallyCoveredUnits) as $k => $v) { + $unit = explode('::', $unintentionallyCoveredUnits[$k]); + + if (count($unit) != 2) { + continue; + } + + $class = new ReflectionClass($unit[0]); + + foreach ($this->unintentionallyCoveredSubclassesWhitelist as $whitelisted) { + if ($class->isSubclassOf($whitelisted)) { + unset($unintentionallyCoveredUnits[$k]); + break; + } + } + } + + return array_values($unintentionallyCoveredUnits); + } } From fe33716763b604ade4cb442c0794f5bd5ad73004 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Thu, 3 Mar 2016 09:49:08 +0100 Subject: [PATCH 095/114] Prepare release --- ChangeLog-3.3.md | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog-3.3.md b/ChangeLog-3.3.md index e86516a31..a65036c78 100644 --- a/ChangeLog-3.3.md +++ b/ChangeLog-3.3.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 3.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.3.0] - 2016-MM-DD +## [3.3.0] - 2016-03-03 ### Added diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 94f7f1a22..2b52c3c83 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.3', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.3.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 50bf9c4b5749cae20e9e2882dedfd5e3bc39d937 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Wed, 9 Mar 2016 11:04:07 +0100 Subject: [PATCH 096/114] Fix CS/WS issue --- src/CodeCoverage.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index d489a8137..74e7dabe0 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -966,7 +966,6 @@ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToB if (!empty($message)) { throw new PHP_CodeCoverage_CoveredCodeNotExecutedException($message); } - } /** From 82e2979a1d53be499f8275ee5e1cdc9c2ba3c269 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Wed, 9 Mar 2016 14:30:48 +0100 Subject: [PATCH 097/114] Sync with PHPUnit ruleset --- .php_cs | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/.php_cs b/.php_cs index 44bebf6ab..b7393bdac 100644 --- a/.php_cs +++ b/.php_cs @@ -9,34 +9,58 @@ return Symfony\CS\Config\Config::create() ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) ->fixers( array( + 'align_double_arrow', + 'align_equals', + 'braces', + 'concat_with_spaces', 'duplicate_semicolon', + 'elseif', 'empty_return', + 'encoding', + 'eof_ending', 'extra_empty_lines', + 'function_call_space', + 'function_declaration', + 'indentation', 'join_function', + 'line_after_namespace', + 'linefeed', 'list_commas', + 'lowercase_constants', + 'lowercase_keywords', + 'method_argument_space', + 'multiple_use', + 'namespace_no_leading_whitespace', 'no_blank_lines_after_class_opening', 'no_empty_lines_after_phpdocs', + 'parenthesis', + 'php_closing_tag', 'phpdoc_indent', 'phpdoc_no_access', 'phpdoc_no_empty_return', 'phpdoc_no_package', 'phpdoc_params', 'phpdoc_scalar', + 'phpdoc_separation', 'phpdoc_to_comment', 'phpdoc_trim', + 'phpdoc_types', + 'phpdoc_var_without_name', + 'remove_lines_between_uses', 'return', 'self_accessor', + 'short_array_syntax', + 'short_tag', + 'single_line_after_imports', 'single_quote', 'spaces_before_semicolon', 'spaces_cast', 'ternary_spaces', + 'trailing_spaces', 'trim_array_spaces', 'unused_use', - 'whitespacy_lines', - 'align_double_arrow', - 'align_equals', - 'concat_with_spaces', - 'short_array_syntax' + 'visibility', + 'whitespacy_lines' ) ) ->finder($finder); From 9b2a050b8ee982bf4132fa5c8b381f33c7416f2b Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Wed, 9 Mar 2016 14:32:21 +0100 Subject: [PATCH 098/114] Fix CS/WS issues --- src/CodeCoverage.php | 109 ++++++++++++------ src/CodeCoverage/Driver.php | 3 + src/CodeCoverage/Driver/PHPDBG.php | 5 +- src/CodeCoverage/Driver/Xdebug.php | 8 +- .../Exception/InvalidArgumentException.php | 7 +- src/CodeCoverage/Filter.php | 9 +- src/CodeCoverage/Report/Clover.php | 7 +- src/CodeCoverage/Report/Crap4j.php | 17 +-- src/CodeCoverage/Report/Factory.php | 9 +- src/CodeCoverage/Report/HTML.php | 5 +- src/CodeCoverage/Report/HTML/Renderer.php | 8 +- .../Report/HTML/Renderer/Dashboard.php | 18 +-- .../Report/HTML/Renderer/Directory.php | 5 +- .../Report/HTML/Renderer/File.php | 24 ++-- src/CodeCoverage/Report/Node.php | 19 ++- src/CodeCoverage/Report/Node/Directory.php | 13 ++- src/CodeCoverage/Report/Node/File.php | 17 +-- src/CodeCoverage/Report/PHP.php | 5 +- src/CodeCoverage/Report/Text.php | 5 +- src/CodeCoverage/Util.php | 9 +- tests/PHP/CodeCoverage/Report/HTMLTest.php | 2 +- tests/PHP/CodeCoverage/Report/XMLTest.php | 2 +- tests/TestCase.php | 2 +- 23 files changed, 200 insertions(+), 108 deletions(-) diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 74e7dabe0..9942e4b42 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -110,8 +110,9 @@ class PHP_CodeCoverage /** * Constructor. * - * @param PHP_CodeCoverage_Driver $driver - * @param PHP_CodeCoverage_Filter $filter + * @param PHP_CodeCoverage_Driver $driver + * @param PHP_CodeCoverage_Filter $filter + * * @throws PHP_CodeCoverage_RuntimeException */ public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null) @@ -135,6 +136,7 @@ public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCove * for this PHP_CodeCoverage object. * * @return PHP_CodeCoverage_Report_Node_Directory + * * @since Method available since Release 1.1.0 */ public function getReport() @@ -168,8 +170,10 @@ public function filter() * Returns the collected code coverage data. * Set $raw = true to bypass all filters. * - * @param bool $raw + * @param bool $raw + * * @return array + * * @since Method available since Release 1.1.0 */ public function getData($raw = false) @@ -185,6 +189,7 @@ public function getData($raw = false) * Sets the coverage data. * * @param array $data + * * @since Method available since Release 2.0.0 */ public function setData(array $data) @@ -196,6 +201,7 @@ public function setData(array $data) * Returns the test data. * * @return array + * * @since Method available since Release 1.1.0 */ public function getTests() @@ -207,6 +213,7 @@ public function getTests() * Sets the test data. * * @param array $tests + * * @since Method available since Release 2.0.0 */ public function setTests(array $tests) @@ -217,8 +224,9 @@ public function setTests(array $tests) /** * Start collection of code coverage information. * - * @param mixed $id - * @param bool $clear + * @param mixed $id + * @param bool $clear + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function start($id, $clear = false) @@ -242,10 +250,12 @@ public function start($id, $clear = false) /** * Stop collection of code coverage information. * - * @param bool $append - * @param mixed $linesToBeCovered - * @param array $linesToBeUsed + * @param bool $append + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * * @return array + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function stop($append = true, $linesToBeCovered = [], array $linesToBeUsed = []) @@ -275,11 +285,12 @@ public function stop($append = true, $linesToBeCovered = [], array $linesToBeUse /** * Appends code coverage data. * - * @param array $data - * @param mixed $id - * @param bool $append - * @param mixed $linesToBeCovered - * @param array $linesToBeUsed + * @param array $data + * @param mixed $id + * @param bool $append + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * * @throws PHP_CodeCoverage_RuntimeException */ public function append(array $data, $id = null, $append = true, $linesToBeCovered = [], array $linesToBeUsed = []) @@ -384,12 +395,13 @@ public function merge(PHP_CodeCoverage $that) } $this->tests = array_merge($this->tests, $that->getTests()); - } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException + * * @since Method available since Release 1.1.0 */ public function setCacheTokens($flag) @@ -413,8 +425,10 @@ public function getCacheTokens() } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException + * * @since Method available since Release 2.0.0 */ public function setCheckForUnintentionallyCoveredCode($flag) @@ -430,7 +444,8 @@ public function setCheckForUnintentionallyCoveredCode($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setForceCoversAnnotation($flag) @@ -446,8 +461,10 @@ public function setForceCoversAnnotation($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException + * * @since Method available since Release 3.2.0 */ public function setCheckForMissingCoversAnnotation($flag) @@ -463,7 +480,8 @@ public function setCheckForMissingCoversAnnotation($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setCheckForUnexecutedCoveredCode($flag) @@ -480,7 +498,9 @@ public function setCheckForUnexecutedCoveredCode($flag) /** * @deprecated - * @param bool $flag + * + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setMapTestClassNameToCoveredClassName($flag) @@ -488,7 +508,8 @@ public function setMapTestClassNameToCoveredClassName($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setAddUncoveredFilesFromWhitelist($flag) @@ -504,7 +525,8 @@ public function setAddUncoveredFilesFromWhitelist($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setProcessUncoveredFilesFromWhitelist($flag) @@ -520,7 +542,8 @@ public function setProcessUncoveredFilesFromWhitelist($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function setDisableIgnoredLines($flag) @@ -536,8 +559,10 @@ public function setDisableIgnoredLines($flag) } /** - * @param bool $flag + * @param bool $flag + * * @throws PHP_CodeCoverage_InvalidArgumentException + * * @since Method available since Release 3.0.2 */ public function setIgnoreDeprecatedCode($flag) @@ -554,6 +579,7 @@ public function setIgnoreDeprecatedCode($flag) /** * @param array $whitelist + * * @since Method available since Release 3.3.0 */ public function setUnintentionallyCoveredSubclassesWhitelist(array $whitelist) @@ -564,9 +590,10 @@ public function setUnintentionallyCoveredSubclassesWhitelist(array $whitelist) /** * Applies the @covers annotation filtering. * - * @param array $data - * @param mixed $linesToBeCovered - * @param array $linesToBeUsed + * @param array $data + * @param mixed $linesToBeCovered + * @param array $linesToBeUsed + * * @throws PHP_CodeCoverage_MissingCoversAnnotationException * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException */ @@ -645,6 +672,7 @@ private function applyIgnoredLinesFilter(array &$data) /** * @param array $data + * * @since Method available since Release 1.1.0 */ private function initializeFilesThatAreSeenTheFirstTime(array $data) @@ -724,9 +752,12 @@ private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, /** * Returns the lines of a source file that should be ignored. * - * @param string $filename + * @param string $filename + * * @return array + * * @throws PHP_CodeCoverage_InvalidArgumentException + * * @since Method available since Release 2.0.0 */ private function getLinesToBeIgnored($filename) @@ -896,10 +927,12 @@ private function getLinesToBeIgnored($filename) } /** - * @param array $data - * @param array $linesToBeCovered - * @param array $linesToBeUsed + * @param array $data + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException + * * @since Method available since Release 2.0.0 */ private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) @@ -929,9 +962,10 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin } /** - * @param array $data - * @param array $linesToBeCovered - * @param array $linesToBeUsed + * @param array $data + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * * @throws PHP_CodeCoverage_CoveredCodeNotExecutedException */ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) @@ -969,9 +1003,11 @@ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToB } /** - * @param array $linesToBeCovered - * @param array $linesToBeUsed + * @param array $linesToBeCovered + * @param array $linesToBeUsed + * * @return array + * * @since Method available since Release 2.0.0 */ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) @@ -1011,6 +1047,7 @@ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) /** * @return PHP_CodeCoverage_Driver + * * @throws PHP_CodeCoverage_RuntimeException */ private function selectDriver() diff --git a/src/CodeCoverage/Driver.php b/src/CodeCoverage/Driver.php index 8635acefe..02be5fff1 100644 --- a/src/CodeCoverage/Driver.php +++ b/src/CodeCoverage/Driver.php @@ -17,18 +17,21 @@ interface PHP_CodeCoverage_Driver { /** * @var int + * * @see http://xdebug.org/docs/code_coverage */ const LINE_EXECUTED = 1; /** * @var int + * * @see http://xdebug.org/docs/code_coverage */ const LINE_NOT_EXECUTED = -1; /** * @var int + * * @see http://xdebug.org/docs/code_coverage */ const LINE_NOT_EXECUTABLE = -2; diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/CodeCoverage/Driver/PHPDBG.php index 2c39c8c80..7e8fbf6c2 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/CodeCoverage/Driver/PHPDBG.php @@ -84,8 +84,9 @@ public function stop() /** * Convert phpdbg based data into the format CodeCoverage expects * - * @param array $sourceLines - * @param array $dbgData + * @param array $sourceLines + * @param array $dbgData + * * @return array */ private function detectExecutedLines(array $sourceLines, array $dbgData) diff --git a/src/CodeCoverage/Driver/Xdebug.php b/src/CodeCoverage/Driver/Xdebug.php index 069f16aac..34420c1f1 100644 --- a/src/CodeCoverage/Driver/Xdebug.php +++ b/src/CodeCoverage/Driver/Xdebug.php @@ -55,8 +55,10 @@ public function stop() } /** - * @param array $data + * @param array $data + * * @return array + * * @since Method available since Release 2.0.0 */ private function cleanup(array $data) @@ -79,8 +81,10 @@ private function cleanup(array $data) } /** - * @param string $file + * @param string $file + * * @return int + * * @since Method available since Release 2.0.0 */ private function getNumberOfLinesInFile($file) diff --git a/src/CodeCoverage/Exception/InvalidArgumentException.php b/src/CodeCoverage/Exception/InvalidArgumentException.php index 30f754007..ca7b25973 100644 --- a/src/CodeCoverage/Exception/InvalidArgumentException.php +++ b/src/CodeCoverage/Exception/InvalidArgumentException.php @@ -14,9 +14,10 @@ class PHP_CodeCoverage_InvalidArgumentException extends InvalidArgumentException implements PHP_CodeCoverage_Exception { /** - * @param int $argument - * @param string $type - * @param mixed $value + * @param int $argument + * @param string $type + * @param mixed $value + * * @return PHP_CodeCoverage_InvalidArgumentException */ public static function create($argument, $type, $value = null) diff --git a/src/CodeCoverage/Filter.php b/src/CodeCoverage/Filter.php index 467fd98bb..20f1a7311 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/CodeCoverage/Filter.php @@ -93,7 +93,8 @@ public function removeFileFromWhitelist($filename) /** * Checks whether a filename is a real filename. * - * @param string $filename + * @param string $filename + * * @return bool */ public function isFile($filename) @@ -115,7 +116,8 @@ public function isFile($filename) /** * Checks whether or not a file is filtered. * - * @param string $filename + * @param string $filename + * * @return bool */ public function isFiltered($filename) @@ -143,6 +145,7 @@ public function getWhitelist() * Returns whether this filter has a whitelist. * * @return bool + * * @since Method available since Release 1.1.0 */ public function hasWhitelist() @@ -154,6 +157,7 @@ public function hasWhitelist() * Returns the whitelisted files. * * @return array + * * @since Method available since Release 2.0.0 */ public function getWhitelistedFiles() @@ -165,6 +169,7 @@ public function getWhitelistedFiles() * Sets the whitelisted files. * * @param array $whitelistedFiles + * * @since Method available since Release 2.0.0 */ public function setWhitelistedFiles($whitelistedFiles) diff --git a/src/CodeCoverage/Report/Clover.php b/src/CodeCoverage/Report/Clover.php index 6c8fda190..d238189cf 100644 --- a/src/CodeCoverage/Report/Clover.php +++ b/src/CodeCoverage/Report/Clover.php @@ -16,9 +16,10 @@ class PHP_CodeCoverage_Report_Clover { /** - * @param PHP_CodeCoverage $coverage - * @param string $target - * @param string $name + * @param PHP_CodeCoverage $coverage + * @param string $target + * @param string $name + * * @return string */ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null) diff --git a/src/CodeCoverage/Report/Crap4j.php b/src/CodeCoverage/Report/Crap4j.php index 3801107b1..0bd369d2f 100644 --- a/src/CodeCoverage/Report/Crap4j.php +++ b/src/CodeCoverage/Report/Crap4j.php @@ -34,9 +34,10 @@ public function __construct($threshold = 30) } /** - * @param PHP_CodeCoverage $coverage - * @param string $target - * @param string $name + * @param PHP_CodeCoverage $coverage + * @param string $target + * @param string $name + * * @return string */ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null) @@ -136,9 +137,10 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null } /** - * @param float $crapValue - * @param int $cyclomaticComplexity - * @param float $coveragePercent + * @param float $crapValue + * @param int $cyclomaticComplexity + * @param float $coveragePercent + * * @return float */ private function getCrapLoad($crapValue, $cyclomaticComplexity, $coveragePercent) @@ -154,7 +156,8 @@ private function getCrapLoad($crapValue, $cyclomaticComplexity, $coveragePercent } /** - * @param float $value + * @param float $value + * * @return float */ private function roundValue($value) diff --git a/src/CodeCoverage/Report/Factory.php b/src/CodeCoverage/Report/Factory.php index 519e92e9b..e87851d02 100644 --- a/src/CodeCoverage/Report/Factory.php +++ b/src/CodeCoverage/Report/Factory.php @@ -16,7 +16,8 @@ class PHP_CodeCoverage_Report_Factory { /** - * @param PHP_CodeCoverage $coverage + * @param PHP_CodeCoverage $coverage + * * @return PHP_CodeCoverage_Report_Node_Directory */ public function create(PHP_CodeCoverage $coverage) @@ -100,7 +101,8 @@ private function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $i * ) * * - * @param array $files + * @param array $files + * * @return array */ private function buildDirectoryStructure($files) @@ -165,7 +167,8 @@ private function buildDirectoryStructure($files) * ) * * - * @param array $files + * @param array $files + * * @return string */ private function reducePaths(&$files) diff --git a/src/CodeCoverage/Report/HTML.php b/src/CodeCoverage/Report/HTML.php index 4829dd68f..15bb87438 100644 --- a/src/CodeCoverage/Report/HTML.php +++ b/src/CodeCoverage/Report/HTML.php @@ -153,9 +153,12 @@ private function copyFiles($target) } /** - * @param string $directory + * @param string $directory + * * @return string + * * @throws PHP_CodeCoverage_RuntimeException + * * @since Method available since Release 1.2.0 */ private function getDirectory($directory) diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 2b52c3c83..717b1c3e6 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -69,8 +69,9 @@ public function __construct($templatePath, $generator, $date, $lowUpperBound, $h } /** - * @param Text_Template $template - * @param array $data + * @param Text_Template $template + * @param array $data + * * @return string */ protected function renderItemTemplate(Text_Template $template, array $data) @@ -254,7 +255,8 @@ protected function getCoverageBar($percent) } /** - * @param int $percent + * @param int $percent + * * @return string */ protected function getColorLevel($percent) diff --git a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php b/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php index b61766a8d..7c0dd2301 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php +++ b/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php @@ -55,8 +55,9 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) /** * Returns the data for the Class/Method Complexity charts. * - * @param array $classes - * @param string $baseLink + * @param array $classes + * @param string $baseLink + * * @return array */ protected function complexity(array $classes, $baseLink) @@ -100,7 +101,8 @@ protected function complexity(array $classes, $baseLink) /** * Returns the data for the Class / Method Coverage Distribution chart. * - * @param array $classes + * @param array $classes + * * @return array */ protected function coverageDistribution(array $classes) @@ -169,8 +171,9 @@ protected function coverageDistribution(array $classes) /** * Returns the classes / methods with insufficient coverage. * - * @param array $classes - * @param string $baseLink + * @param array $classes + * @param string $baseLink + * * @return array */ protected function insufficientCoverage(array $classes, $baseLink) @@ -227,8 +230,9 @@ protected function insufficientCoverage(array $classes, $baseLink) /** * Returns the project risks according to the CRAP index. * - * @param array $classes - * @param string $baseLink + * @param array $classes + * @param string $baseLink + * * @return array */ protected function projectRisks(array $classes, $baseLink) diff --git a/src/CodeCoverage/Report/HTML/Renderer/Directory.php b/src/CodeCoverage/Report/HTML/Renderer/Directory.php index b7c0d0d61..a881cdeba 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Directory.php +++ b/src/CodeCoverage/Report/HTML/Renderer/Directory.php @@ -46,8 +46,9 @@ public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) } /** - * @param PHP_CodeCoverage_Report_Node $item - * @param bool $total + * @param PHP_CodeCoverage_Report_Node $item + * @param bool $total + * * @return string */ protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false) diff --git a/src/CodeCoverage/Report/HTML/Renderer/File.php b/src/CodeCoverage/Report/HTML/Renderer/File.php index 5ab20c5bd..ad36c6410 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/File.php +++ b/src/CodeCoverage/Report/HTML/Renderer/File.php @@ -65,7 +65,8 @@ public function render(PHP_CodeCoverage_Report_Node_File $node, $file) } /** - * @param PHP_CodeCoverage_Report_Node_File $node + * @param PHP_CodeCoverage_Report_Node_File $node + * * @return string */ protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) @@ -119,9 +120,10 @@ protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) } /** - * @param array $items - * @param Text_Template $template - * @param Text_Template $methodItemTemplate + * @param array $items + * @param Text_Template $template + * @param Text_Template $methodItemTemplate + * * @return string */ protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate) @@ -199,8 +201,9 @@ protected function renderTraitOrClassItems(array $items, Text_Template $template } /** - * @param array $functions - * @param Text_Template $template + * @param array $functions + * @param Text_Template $template + * * @return string */ protected function renderFunctionItems(array $functions, Text_Template $template) @@ -222,7 +225,8 @@ protected function renderFunctionItems(array $functions, Text_Template $template } /** - * @param Text_Template $template + * @param Text_Template $template + * * @return string */ protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '') @@ -269,7 +273,8 @@ protected function renderFunctionOrMethodItem(Text_Template $template, array $it } /** - * @param PHP_CodeCoverage_Report_Node_File $node + * @param PHP_CodeCoverage_Report_Node_File $node + * * @return string */ protected function renderSource(PHP_CodeCoverage_Report_Node_File $node) @@ -382,7 +387,8 @@ protected function renderSource(PHP_CodeCoverage_Report_Node_File $node) } /** - * @param string $file + * @param string $file + * * @return array */ protected function loadFile($file) diff --git a/src/CodeCoverage/Report/Node.php b/src/CodeCoverage/Report/Node.php index e515a847a..c8f3c7041 100644 --- a/src/CodeCoverage/Report/Node.php +++ b/src/CodeCoverage/Report/Node.php @@ -133,7 +133,8 @@ public function getParent() /** * Returns the percentage of classes that has been tested. * - * @param bool $asString + * @param bool $asString + * * @return int */ public function getTestedClassesPercent($asString = true) @@ -148,7 +149,8 @@ public function getTestedClassesPercent($asString = true) /** * Returns the percentage of traits that has been tested. * - * @param bool $asString + * @param bool $asString + * * @return int */ public function getTestedTraitsPercent($asString = true) @@ -163,8 +165,10 @@ public function getTestedTraitsPercent($asString = true) /** * Returns the percentage of traits that has been tested. * - * @param bool $asString + * @param bool $asString + * * @return int + * * @since Method available since Release 1.2.0 */ public function getTestedClassesAndTraitsPercent($asString = true) @@ -179,7 +183,8 @@ public function getTestedClassesAndTraitsPercent($asString = true) /** * Returns the percentage of methods that has been tested. * - * @param bool $asString + * @param bool $asString + * * @return int */ public function getTestedMethodsPercent($asString = true) @@ -194,7 +199,8 @@ public function getTestedMethodsPercent($asString = true) /** * Returns the percentage of executed lines. * - * @param bool $asString + * @param bool $asString + * * @return int */ public function getLineExecutedPercent($asString = true) @@ -210,6 +216,7 @@ public function getLineExecutedPercent($asString = true) * Returns the number of classes and traits. * * @return int + * * @since Method available since Release 1.2.0 */ public function getNumClassesAndTraits() @@ -221,6 +228,7 @@ public function getNumClassesAndTraits() * Returns the number of tested classes and traits. * * @return int + * * @since Method available since Release 1.2.0 */ public function getNumTestedClassesAndTraits() @@ -232,6 +240,7 @@ public function getNumTestedClassesAndTraits() * Returns the classes and traits of this node. * * @return array + * * @since Method available since Release 1.2.0 */ public function getClassesAndTraits() diff --git a/src/CodeCoverage/Report/Node/Directory.php b/src/CodeCoverage/Report/Node/Directory.php index b3a650a2b..c8ad08ad4 100644 --- a/src/CodeCoverage/Report/Node/Directory.php +++ b/src/CodeCoverage/Report/Node/Directory.php @@ -139,7 +139,8 @@ public function getIterator() /** * Adds a new directory. * - * @param string $name + * @param string $name + * * @return PHP_CodeCoverage_Report_Node_Directory */ public function addDirectory($name) @@ -155,11 +156,13 @@ public function addDirectory($name) /** * Adds a new file. * - * @param string $name - * @param array $coverageData - * @param array $testData - * @param bool $cacheTokens + * @param string $name + * @param array $coverageData + * @param array $testData + * @param bool $cacheTokens + * * @return PHP_CodeCoverage_Report_Node_File + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function addFile($name, array $coverageData, array $testData, $cacheTokens) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index f5b2ffb48..60ab8374f 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -98,11 +98,12 @@ class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node /** * Constructor. * - * @param string $name - * @param PHP_CodeCoverage_Report_Node $parent - * @param array $coverageData - * @param array $testData - * @param bool $cacheTokens + * @param string $name + * @param PHP_CodeCoverage_Report_Node $parent + * @param array $coverageData + * @param array $testData + * @param bool $cacheTokens + * * @throws PHP_CodeCoverage_InvalidArgumentException */ public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens) @@ -634,9 +635,11 @@ protected function processFunctions(PHP_Token_Stream $tokens) * Calculates the Change Risk Anti-Patterns (CRAP) index for a unit of code * based on its cyclomatic complexity and percentage of code coverage. * - * @param int $ccn - * @param float $coverage + * @param int $ccn + * @param float $coverage + * * @return string + * * @since Method available since Release 1.2.0 */ protected function crap($ccn, $coverage) diff --git a/src/CodeCoverage/Report/PHP.php b/src/CodeCoverage/Report/PHP.php index 5871975ac..2466548a0 100644 --- a/src/CodeCoverage/Report/PHP.php +++ b/src/CodeCoverage/Report/PHP.php @@ -16,8 +16,9 @@ class PHP_CodeCoverage_Report_PHP { /** - * @param PHP_CodeCoverage $coverage - * @param string $target + * @param PHP_CodeCoverage $coverage + * @param string $target + * * @return string */ public function process(PHP_CodeCoverage $coverage, $target = null) diff --git a/src/CodeCoverage/Report/Text.php b/src/CodeCoverage/Report/Text.php index d37a6d77c..179966966 100644 --- a/src/CodeCoverage/Report/Text.php +++ b/src/CodeCoverage/Report/Text.php @@ -40,8 +40,9 @@ public function __construct($lowUpperBound, $highLowerBound, $showUncoveredFiles } /** - * @param PHP_CodeCoverage $coverage - * @param bool $showColors + * @param PHP_CodeCoverage $coverage + * @param bool $showColors + * * @return string */ public function process(PHP_CodeCoverage $coverage, $showColors = false) diff --git a/src/CodeCoverage/Util.php b/src/CodeCoverage/Util.php index 3ae47e5d6..db92b7852 100644 --- a/src/CodeCoverage/Util.php +++ b/src/CodeCoverage/Util.php @@ -16,10 +16,11 @@ class PHP_CodeCoverage_Util { /** - * @param float $a - * @param float $b - * @param bool $asString - * @param bool $fixedWidth + * @param float $a + * @param float $b + * @param bool $asString + * @param bool $fixedWidth + * * @return float|int|string */ public static function percent($a, $b, $asString = false, $fixedWidth = false) diff --git a/tests/PHP/CodeCoverage/Report/HTMLTest.php b/tests/PHP/CodeCoverage/Report/HTMLTest.php index 1d38c9971..cd9104e62 100644 --- a/tests/PHP/CodeCoverage/Report/HTMLTest.php +++ b/tests/PHP/CodeCoverage/Report/HTMLTest.php @@ -17,7 +17,7 @@ */ class PHP_CodeCoverage_Report_HTMLTest extends PHP_CodeCoverage_TestCase { - static private $TEST_REPORT_PATH_SOURCE; + private static $TEST_REPORT_PATH_SOURCE; public static function setUpBeforeClass() { diff --git a/tests/PHP/CodeCoverage/Report/XMLTest.php b/tests/PHP/CodeCoverage/Report/XMLTest.php index 90699192c..f40210fa0 100644 --- a/tests/PHP/CodeCoverage/Report/XMLTest.php +++ b/tests/PHP/CodeCoverage/Report/XMLTest.php @@ -17,7 +17,7 @@ */ class PHP_CodeCoverage_Report_XMLTest extends PHP_CodeCoverage_TestCase { - static private $TEST_REPORT_PATH_SOURCE; + private static $TEST_REPORT_PATH_SOURCE; public static function setUpBeforeClass() { diff --git a/tests/TestCase.php b/tests/TestCase.php index d03585cef..7ce8ffe8b 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -19,7 +19,7 @@ */ abstract class PHP_CodeCoverage_TestCase extends PHPUnit_Framework_TestCase { - static protected $TEST_TMP_PATH; + protected static $TEST_TMP_PATH; public static function setUpBeforeClass() { From fcec4609a3e819b65311e8453058b34b7dd9205a Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Wed, 9 Mar 2016 14:44:36 +0100 Subject: [PATCH 099/114] Reflect release of Xdebug 2.4 --- README.md | 4 ++-- composer.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 41e253487..6376cb62b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Requirements -PHP 5.6 is required but using the latest version of PHP is highly recommended +PHP 5.6 is required but using the latest version of PHP is highly recommended. ### PHP 5 @@ -15,7 +15,7 @@ PHP 5.6 is required but using the latest version of PHP is highly recommended ### PHP 7 -[phpdbg](http://phpdbg.com/docs) is currently the only source of raw code coverage data supported for PHP 7. Once Xdebug has been updated for PHP 7 it, too, will be supported. +Version 2.4.0 (or later) of [Xdebug](http://xdebug.org/) as well as [phpdbg](http://phpdbg.com/docs) are supported sources of raw code coverage data for PHP 7. ### HHVM diff --git a/composer.json b/composer.json index 9125ac631..7c94bab37 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ }, "suggest": { "ext-dom": "*", - "ext-xdebug": ">=2.2.1", + "ext-xdebug": ">=2.4.0", "ext-xmlwriter": "*" }, "autoload": { From e10e643892ab36bd2b8b55df6bdebf29d90cd7ec Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Wed, 9 Mar 2016 14:45:36 +0100 Subject: [PATCH 100/114] Bump --- ChangeLog-4.0.md | 8 ++++++++ README.md | 2 +- composer.json | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 ChangeLog-4.0.md diff --git a/ChangeLog-4.0.md b/ChangeLog-4.0.md new file mode 100644 index 000000000..9b83ab28f --- /dev/null +++ b/ChangeLog-4.0.md @@ -0,0 +1,8 @@ +# Changes in PHP_CodeCoverage 4.0 + +All notable changes of the PHP_CodeCoverage 4.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [4.0.0] - 2016-MM-DD + +[4.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.3...4.0.0 + diff --git a/README.md b/README.md index 6376cb62b..bf055749e 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ To add PHP_CodeCoverage as a local, per-project dependency to your project, simp { "require": { - "phpunit/php-code-coverage": "^3" + "phpunit/php-code-coverage": "^4" } } diff --git a/composer.json b/composer.json index 7c94bab37..77adc235f 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.3.x-dev" + "dev-master": "4.0.x-dev" } } } diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 717b1c3e6..ef34c56c8 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.3.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('4.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From be326c334adfa35084fe821cdac6a9e1517ce899 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 8 Apr 2016 10:13:44 +0200 Subject: [PATCH 101/114] Handle lines with declare statements correctly --- ChangeLog-3.3.md | 7 +++++++ src/CodeCoverage.php | 1 + 2 files changed, 8 insertions(+) diff --git a/ChangeLog-3.3.md b/ChangeLog-3.3.md index a65036c78..5a87127a3 100644 --- a/ChangeLog-3.3.md +++ b/ChangeLog-3.3.md @@ -2,11 +2,18 @@ All notable changes of the PHP_CodeCoverage 3.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [3.3.1] - 2016-MM-DD + +### Fixed + +* Fixed handling of lines that contain `declare` statements + ## [3.3.0] - 2016-03-03 ### Added * Added support for whitelisting classes for the unintentionally covered code unit check +[3.3.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.3.0...3.3.1 [3.3.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.2...3.3.0 diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 9942e4b42..6646d705f 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -897,6 +897,7 @@ private function getLinesToBeIgnored($filename) $this->ignoredLines[$filename][] = $token->getEndLine(); // Intentional fallthrough + case 'PHP_Token_DECLARE': case 'PHP_Token_OPEN_TAG': case 'PHP_Token_CLOSE_TAG': case 'PHP_Token_USE': From 2431befdd451fac43fbcde94d1a92fb3b8b68f86 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 8 Apr 2016 10:14:53 +0200 Subject: [PATCH 102/114] Prepare release --- ChangeLog-3.3.md | 2 +- src/CodeCoverage/Report/HTML/Renderer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog-3.3.md b/ChangeLog-3.3.md index 5a87127a3..7a5f84fbe 100644 --- a/ChangeLog-3.3.md +++ b/ChangeLog-3.3.md @@ -2,7 +2,7 @@ All notable changes of the PHP_CodeCoverage 3.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. -## [3.3.1] - 2016-MM-DD +## [3.3.1] - 2016-04-08 ### Fixed diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/CodeCoverage/Report/HTML/Renderer.php index 717b1c3e6..c2672a8ef 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/CodeCoverage/Report/HTML/Renderer.php @@ -58,7 +58,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('3.3.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new SebastianBergmann\Version('3.3.1', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; From 4712fc6b1328d62c5da00316e0c16d4f2147fed1 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:19:15 +0200 Subject: [PATCH 103/114] Initial work on moving to namespaces --- .gitignore | 2 +- .php_cs | 2 + build/phpunit.xml | 16 ++ composer.json | 2 +- phpunit.xml.dist | 23 --- src/CodeCoverage.php | 191 ++++++++---------- src/CodeCoverage/Exception/Exception.php | 18 -- .../Exception/RuntimeException.php | 16 -- .../Report/HTML/Renderer/Directory.php | 98 --------- .../Renderer/Template/css/bootstrap.min.css | 5 - src/{CodeCoverage => Driver}/Driver.php | 8 +- src/{CodeCoverage => }/Driver/HHVM.php | 7 +- src/{CodeCoverage => }/Driver/PHPDBG.php | 13 +- src/{CodeCoverage => }/Driver/Xdebug.php | 17 +- .../CoveredCodeNotExecutedException.php | 8 +- .../Directory.php => Exception/Exception.php} | 8 +- .../Exception/InvalidArgumentException.php | 11 +- .../MissingCoversAnnotationException.php | 8 +- src/Exception/RuntimeException.php | 15 ++ .../UnintentionallyCoveredCodeException.php | 8 +- src/{CodeCoverage => }/Filter.php | 18 +- .../Report/Node.php => Node/AbstractNode.php} | 48 ++--- .../Report/Factory.php => Node/Builder.php} | 31 ++- .../Report => }/Node/Directory.php | 68 ++++--- src/{CodeCoverage/Report => }/Node/File.php | 76 +++---- .../Report => }/Node/Iterator.php | 28 ++- src/{CodeCoverage => }/Report/Clover.php | 27 ++- src/{CodeCoverage => }/Report/Crap4j.php | 27 +-- .../HTML.php => Report/Html/Facade.php} | 33 +-- .../Report/HTML => Report/Html}/Renderer.php | 44 ++-- .../Html}/Renderer/Dashboard.php | 22 +- src/Report/Html/Renderer/Directory.php | 101 +++++++++ .../HTML => Report/Html}/Renderer/File.php | 71 +++---- .../Renderer/Template/coverage_bar.html.dist | 0 .../Renderer/Template/css/bootstrap.min.css | 5 + .../Html}/Renderer/Template/css/nv.d3.min.css | 0 .../Html}/Renderer/Template/css/style.css | 0 .../Renderer/Template/dashboard.html.dist | 2 +- .../Renderer/Template/directory.html.dist | 2 +- .../Template/directory_item.html.dist | 0 .../Html}/Renderer/Template/file.html.dist | 2 +- .../Renderer/Template/file_item.html.dist | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../fonts/glyphicons-halflings-regular.woff2 | Bin .../Renderer/Template/js/bootstrap.min.js | 0 .../Html}/Renderer/Template/js/d3.min.js | 0 .../Html}/Renderer/Template/js/holder.min.js | 0 .../Renderer/Template/js/html5shiv.min.js | 0 .../Html}/Renderer/Template/js/jquery.min.js | 0 .../Html}/Renderer/Template/js/nv.d3.min.js | 0 .../Html}/Renderer/Template/js/respond.min.js | 0 .../Renderer/Template/method_item.html.dist | 0 src/{CodeCoverage => }/Report/PHP.php | 20 +- src/{CodeCoverage => }/Report/Text.php | 44 ++-- .../XML/File => Report/Xml}/Coverage.php | 21 +- src/Report/Xml/Directory.php | 15 ++ .../Report/XML.php => Report/Xml/Facade.php} | 72 ++++--- .../Report/XML => Report/Xml}/File.php | 19 +- .../Report/XML/File => Report/Xml}/Method.php | 13 +- .../Report/XML => Report/Xml}/Node.php | 23 +-- .../Report/XML => Report/Xml}/Project.php | 13 +- .../Report/XML/File => Report/Xml}/Report.php | 15 +- .../Report/XML => Report/Xml}/Tests.php | 12 +- .../Report/XML => Report/Xml}/Totals.php | 35 ++-- .../Report/XML/File => Report/Xml}/Unit.php | 15 +- src/{CodeCoverage => }/Util.php | 8 +- tests/PHP/CodeCoverage/UtilTest.php | 32 --- tests/TestCase.php | 58 +++--- .../BankAccount.php.html | 2 +- .../CoverageForBankAccount/dashboard.html | 2 +- .../HTML/CoverageForBankAccount/index.html | 2 +- .../dashboard.html | 2 +- .../index.html | 2 +- ...with_class_and_anonymous_function.php.html | 2 +- .../dashboard.html | 2 +- .../index.html | 2 +- .../source_with_ignore.php.html | 2 +- tests/bootstrap.php | 5 + .../FactoryTest.php => tests/BuilderTest.php} | 28 +-- .../Report => tests}/CloverTest.php | 27 +-- tests/{PHP => tests}/CodeCoverageTest.php | 157 ++++---------- .../Report => tests}/Crap4jTest.php | 27 +-- .../CodeCoverage => tests}/FilterTest.php | 59 +++--- .../Report => tests}/HTMLTest.php | 48 ++--- .../Report => tests}/TextTest.php | 27 +-- tests/tests/UtilTest.php | 27 +++ .../CodeCoverage/Report => tests}/XMLTest.php | 43 ++-- 90 files changed, 917 insertions(+), 1045 deletions(-) create mode 100644 build/phpunit.xml delete mode 100644 phpunit.xml.dist delete mode 100644 src/CodeCoverage/Exception/Exception.php delete mode 100644 src/CodeCoverage/Exception/RuntimeException.php delete mode 100644 src/CodeCoverage/Report/HTML/Renderer/Directory.php delete mode 100644 src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css rename src/{CodeCoverage => Driver}/Driver.php (85%) rename src/{CodeCoverage => }/Driver/HHVM.php (71%) rename src/{CodeCoverage => }/Driver/PHPDBG.php (89%) rename src/{CodeCoverage => }/Driver/Xdebug.php (82%) rename src/{CodeCoverage => }/Exception/CoveredCodeNotExecutedException.php (57%) rename src/{CodeCoverage/Report/XML/Directory.php => Exception/Exception.php} (52%) rename src/{CodeCoverage => }/Exception/InvalidArgumentException.php (73%) rename src/{CodeCoverage => }/Exception/MissingCoversAnnotationException.php (57%) create mode 100644 src/Exception/RuntimeException.php rename src/{CodeCoverage => }/Exception/UnintentionallyCoveredCodeException.php (83%) rename src/{CodeCoverage => }/Filter.php (90%) rename src/{CodeCoverage/Report/Node.php => Node/AbstractNode.php} (86%) rename src/{CodeCoverage/Report/Factory.php => Node/Builder.php} (86%) rename src/{CodeCoverage/Report => }/Node/Directory.php (86%) rename src/{CodeCoverage/Report => }/Node/File.php (90%) rename src/{CodeCoverage/Report => }/Node/Iterator.php (68%) rename src/{CodeCoverage => }/Report/Clover.php (94%) rename src/{CodeCoverage => }/Report/Crap4j.php (89%) rename src/{CodeCoverage/Report/HTML.php => Report/Html/Facade.php} (86%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer.php (85%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Dashboard.php (93%) create mode 100644 src/Report/Html/Renderer/Directory.php rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/File.php (87%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/coverage_bar.html.dist (100%) create mode 100644 src/Report/Html/Renderer/Template/css/bootstrap.min.css rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/css/nv.d3.min.css (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/css/style.css (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/dashboard.html.dist (97%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/directory.html.dist (90%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/directory_item.html.dist (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/file.html.dist (93%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/file_item.html.dist (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/fonts/glyphicons-halflings-regular.eot (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/fonts/glyphicons-halflings-regular.svg (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/fonts/glyphicons-halflings-regular.ttf (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/fonts/glyphicons-halflings-regular.woff (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/bootstrap.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/d3.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/holder.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/html5shiv.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/jquery.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/nv.d3.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/js/respond.min.js (100%) rename src/{CodeCoverage/Report/HTML => Report/Html}/Renderer/Template/method_item.html.dist (100%) rename src/{CodeCoverage => }/Report/PHP.php (63%) rename src/{CodeCoverage => }/Report/Text.php (89%) rename src/{CodeCoverage/Report/XML/File => Report/Xml}/Coverage.php (74%) create mode 100644 src/Report/Xml/Directory.php rename src/{CodeCoverage/Report/XML.php => Report/Xml/Facade.php} (75%) rename src/{CodeCoverage/Report/XML => Report/Xml}/File.php (78%) rename src/{CodeCoverage/Report/XML/File => Report/Xml}/Method.php (83%) rename src/{CodeCoverage/Report/XML => Report/Xml}/Node.php (76%) rename src/{CodeCoverage/Report/XML => Report/Xml}/Project.php (82%) rename src/{CodeCoverage/Report/XML/File => Report/Xml}/Report.php (79%) rename src/{CodeCoverage/Report/XML => Report/Xml}/Tests.php (86%) rename src/{CodeCoverage/Report/XML => Report/Xml}/Totals.php (82%) rename src/{CodeCoverage/Report/XML/File => Report/Xml}/Unit.php (88%) rename src/{CodeCoverage => }/Util.php (87%) delete mode 100644 tests/PHP/CodeCoverage/UtilTest.php create mode 100644 tests/bootstrap.php rename tests/{PHP/CodeCoverage/Report/FactoryTest.php => tests/BuilderTest.php} (91%) rename tests/{PHP/CodeCoverage/Report => tests}/CloverTest.php (59%) rename tests/{PHP => tests}/CodeCoverageTest.php (71%) rename tests/{PHP/CodeCoverage/Report => tests}/Crap4jTest.php (61%) rename tests/{PHP/CodeCoverage => tests}/FilterTest.php (80%) rename tests/{PHP/CodeCoverage/Report => tests}/HTMLTest.php (67%) rename tests/{PHP/CodeCoverage/Report => tests}/TextTest.php (59%) create mode 100644 tests/tests/UtilTest.php rename tests/{PHP/CodeCoverage/Report => tests}/XMLTest.php (70%) diff --git a/.gitignore b/.gitignore index 4486ead43..1f3de0e3a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,9 @@ build/coverage build/logs build/pdepend cache.properties -phpunit.xml /tests/_files/tmp /vendor /composer.lock /composer.phar /.idea +/.php_cs.cache diff --git a/.php_cs b/.php_cs index b7393bdac..de5cde180 100644 --- a/.php_cs +++ b/.php_cs @@ -3,9 +3,11 @@ $finder = Symfony\CS\Finder\DefaultFinder::create() ->files() ->in('src') ->in('tests') + ->exclude('_files') ->name('*.php'); return Symfony\CS\Config\Config::create() + ->setUsingCache(true) ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) ->fixers( array( diff --git a/build/phpunit.xml b/build/phpunit.xml new file mode 100644 index 000000000..fa15d5d4c --- /dev/null +++ b/build/phpunit.xml @@ -0,0 +1,16 @@ + + + + ../tests/tests + + + + + ../src + + + diff --git a/composer.json b/composer.json index 77adc235f..acc645e3b 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "sebastian/version": "~1.0|~2.0" }, "require-dev": { - "phpunit/phpunit": "~5", + "phpunit/phpunit": "^5.4", "ext-xdebug": ">=2.1.4" }, "suggest": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index f5fa606e2..000000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,23 +0,0 @@ - - - - - tests/PHP - - - - - - - - - - - - src - - - - diff --git a/src/CodeCoverage.php b/src/CodeCoverage.php index 9942e4b42..2f8f5ebd2 100644 --- a/src/CodeCoverage.php +++ b/src/CodeCoverage.php @@ -1,6 +1,6 @@ * @@ -8,23 +8,29 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + +use SebastianBergmann\CodeCoverage\Driver\Driver; +use SebastianBergmann\CodeCoverage\Driver\Xdebug; +use SebastianBergmann\CodeCoverage\Driver\HHVM; +use SebastianBergmann\CodeCoverage\Driver\PHPDBG; +use SebastianBergmann\CodeCoverage\Node\Builder; +use SebastianBergmann\CodeCoverage\Node\Directory; use SebastianBergmann\CodeUnitReverseLookup\Wizard; use SebastianBergmann\Environment\Runtime; /** * Provides collection functionality for PHP code coverage information. - * - * @since Class available since Release 1.0.0 */ -class PHP_CodeCoverage +class CodeCoverage { /** - * @var PHP_CodeCoverage_Driver + * @var Driver */ private $driver; /** - * @var PHP_CodeCoverage_Filter + * @var Filter */ private $filter; @@ -110,19 +116,19 @@ class PHP_CodeCoverage /** * Constructor. * - * @param PHP_CodeCoverage_Driver $driver - * @param PHP_CodeCoverage_Filter $filter + * @param Driver $driver + * @param Filter $filter * - * @throws PHP_CodeCoverage_RuntimeException + * @throws RuntimeException */ - public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCoverage_Filter $filter = null) + public function __construct(Driver $driver = null, Filter $filter = null) { if ($driver === null) { $driver = $this->selectDriver(); } if ($filter === null) { - $filter = new PHP_CodeCoverage_Filter; + $filter = new Filter; } $this->driver = $driver; @@ -132,18 +138,15 @@ public function __construct(PHP_CodeCoverage_Driver $driver = null, PHP_CodeCove } /** - * Returns the PHP_CodeCoverage_Report_Node_* object graph - * for this PHP_CodeCoverage object. + * Returns the code coverage information as a graph of node objects. * - * @return PHP_CodeCoverage_Report_Node_Directory - * - * @since Method available since Release 1.1.0 + * @return Directory */ public function getReport() { - $factory = new PHP_CodeCoverage_Report_Factory; + $builder = new Builder; - return $factory->create($this); + return $builder->build($this); } /** @@ -157,9 +160,9 @@ public function clear() } /** - * Returns the PHP_CodeCoverage_Filter used. + * Returns the filter object used. * - * @return PHP_CodeCoverage_Filter + * @return Filter */ public function filter() { @@ -173,8 +176,6 @@ public function filter() * @param bool $raw * * @return array - * - * @since Method available since Release 1.1.0 */ public function getData($raw = false) { @@ -189,8 +190,6 @@ public function getData($raw = false) * Sets the coverage data. * * @param array $data - * - * @since Method available since Release 2.0.0 */ public function setData(array $data) { @@ -201,8 +200,6 @@ public function setData(array $data) * Returns the test data. * * @return array - * - * @since Method available since Release 1.1.0 */ public function getTests() { @@ -213,8 +210,6 @@ public function getTests() * Sets the test data. * * @param array $tests - * - * @since Method available since Release 2.0.0 */ public function setTests(array $tests) { @@ -227,12 +222,12 @@ public function setTests(array $tests) * @param mixed $id * @param bool $clear * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function start($id, $clear = false) { if (!is_bool($clear)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -256,19 +251,19 @@ public function start($id, $clear = false) * * @return array * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function stop($append = true, $linesToBeCovered = [], array $linesToBeUsed = []) { if (!is_bool($append)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); } if (!is_array($linesToBeCovered) && $linesToBeCovered !== false) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 2, 'array or false' ); @@ -291,7 +286,7 @@ public function stop($append = true, $linesToBeCovered = [], array $linesToBeUse * @param mixed $linesToBeCovered * @param array $linesToBeUsed * - * @throws PHP_CodeCoverage_RuntimeException + * @throws RuntimeException */ public function append(array $data, $id = null, $append = true, $linesToBeCovered = [], array $linesToBeUsed = []) { @@ -300,7 +295,7 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere } if ($id === null) { - throw new PHP_CodeCoverage_RuntimeException; + throw new RuntimeException; } $this->applyListsFilter($data); @@ -326,20 +321,20 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere $size = 'unknown'; $status = null; - if ($id instanceof PHPUnit_Framework_TestCase) { + if ($id instanceof \PHPUnit_Framework_TestCase) { $_size = $id->getSize(); - if ($_size == PHPUnit_Util_Test::SMALL) { + if ($_size == \PHPUnit_Util_Test::SMALL) { $size = 'small'; - } elseif ($_size == PHPUnit_Util_Test::MEDIUM) { + } elseif ($_size == \PHPUnit_Util_Test::MEDIUM) { $size = 'medium'; - } elseif ($_size == PHPUnit_Util_Test::LARGE) { + } elseif ($_size == \PHPUnit_Util_Test::LARGE) { $size = 'large'; } $status = $id->getStatus(); $id = get_class($id) . '::' . $id->getName(); - } elseif ($id instanceof PHPUnit_Extensions_PhptTestCase) { + } elseif ($id instanceof \PHPUnit_Extensions_PhptTestCase) { $size = 'large'; $id = $id->getName(); } @@ -352,7 +347,7 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere } foreach ($lines as $k => $v) { - if ($v == PHP_CodeCoverage_Driver::LINE_EXECUTED) { + if ($v == Driver::LINE_EXECUTED) { if (empty($this->data[$file][$k]) || !in_array($id, $this->data[$file][$k])) { $this->data[$file][$k][] = $id; } @@ -362,11 +357,11 @@ public function append(array $data, $id = null, $append = true, $linesToBeCovere } /** - * Merges the data from another instance of PHP_CodeCoverage. + * Merges the data from another instance. * - * @param PHP_CodeCoverage $that + * @param CodeCoverage $that */ - public function merge(PHP_CodeCoverage $that) + public function merge(CodeCoverage $that) { $this->filter->setWhitelistedFiles( array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) @@ -400,14 +395,12 @@ public function merge(PHP_CodeCoverage $that) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException - * - * @since Method available since Release 1.1.0 + * @throws InvalidArgumentException */ public function setCacheTokens($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -417,7 +410,7 @@ public function setCacheTokens($flag) } /** - * @since Method available since Release 1.1.0 + * @return bool */ public function getCacheTokens() { @@ -427,14 +420,12 @@ public function getCacheTokens() /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException - * - * @since Method available since Release 2.0.0 + * @throws InvalidArgumentException */ public function setCheckForUnintentionallyCoveredCode($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -446,12 +437,12 @@ public function setCheckForUnintentionallyCoveredCode($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function setForceCoversAnnotation($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -463,14 +454,12 @@ public function setForceCoversAnnotation($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException - * - * @since Method available since Release 3.2.0 + * @throws InvalidArgumentException */ public function setCheckForMissingCoversAnnotation($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -482,12 +471,12 @@ public function setCheckForMissingCoversAnnotation($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function setCheckForUnexecutedCoveredCode($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -501,7 +490,7 @@ public function setCheckForUnexecutedCoveredCode($flag) * * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function setMapTestClassNameToCoveredClassName($flag) { @@ -510,12 +499,12 @@ public function setMapTestClassNameToCoveredClassName($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function setAddUncoveredFilesFromWhitelist($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -527,12 +516,12 @@ public function setAddUncoveredFilesFromWhitelist($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function setProcessUncoveredFilesFromWhitelist($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -544,12 +533,12 @@ public function setProcessUncoveredFilesFromWhitelist($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function setDisableIgnoredLines($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -561,14 +550,12 @@ public function setDisableIgnoredLines($flag) /** * @param bool $flag * - * @throws PHP_CodeCoverage_InvalidArgumentException - * - * @since Method available since Release 3.0.2 + * @throws InvalidArgumentException */ public function setIgnoreDeprecatedCode($flag) { if (!is_bool($flag)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -579,8 +566,6 @@ public function setIgnoreDeprecatedCode($flag) /** * @param array $whitelist - * - * @since Method available since Release 3.3.0 */ public function setUnintentionallyCoveredSubclassesWhitelist(array $whitelist) { @@ -594,15 +579,15 @@ public function setUnintentionallyCoveredSubclassesWhitelist(array $whitelist) * @param mixed $linesToBeCovered * @param array $linesToBeUsed * - * @throws PHP_CodeCoverage_MissingCoversAnnotationException - * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException + * @throws MissingCoversAnnotationException + * @throws UnintentionallyCoveredCodeException */ private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed) { if ($linesToBeCovered === false || ($this->forceCoversAnnotation && empty($linesToBeCovered))) { if ($this->checkForMissingCoversAnnotation) { - throw new PHP_CodeCoverage_MissingCoversAnnotationException; + throw new MissingCoversAnnotationException; } $data = []; @@ -672,8 +657,6 @@ private function applyIgnoredLinesFilter(array &$data) /** * @param array $data - * - * @since Method available since Release 1.1.0 */ private function initializeFilesThatAreSeenTheFirstTime(array $data) { @@ -716,7 +699,7 @@ private function addUncoveredFilesFromWhitelist() $lines = count(file($uncoveredFile)); for ($i = 1; $i <= $lines; $i++) { - $data[$uncoveredFile][$i] = PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED; + $data[$uncoveredFile][$i] = Driver::LINE_NOT_EXECUTED; } } } @@ -739,8 +722,8 @@ private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, if (!isset($data[$file]) && in_array($file, $uncoveredFiles)) { foreach (array_keys($fileCoverage) as $key) { - if ($fileCoverage[$key] == PHP_CodeCoverage_Driver::LINE_EXECUTED) { - $fileCoverage[$key] = PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED; + if ($fileCoverage[$key] == Driver::LINE_EXECUTED) { + $fileCoverage[$key] = Driver::LINE_NOT_EXECUTED; } } @@ -756,14 +739,12 @@ private function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, * * @return array * - * @throws PHP_CodeCoverage_InvalidArgumentException - * - * @since Method available since Release 2.0.0 + * @throws InvalidArgumentException */ private function getLinesToBeIgnored($filename) { if (!is_string($filename)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'string' ); @@ -788,9 +769,9 @@ private function getLinesToBeIgnored($filename) } if ($this->cacheTokens) { - $tokens = PHP_Token_Stream_CachingFactory::get($filename); + $tokens = \PHP_Token_Stream_CachingFactory::get($filename); } else { - $tokens = new PHP_Token_Stream($filename); + $tokens = new \PHP_Token_Stream($filename); } $classes = array_merge($tokens->getClasses(), $tokens->getTraits()); @@ -841,7 +822,7 @@ private function getLinesToBeIgnored($filename) case 'PHP_Token_TRAIT': case 'PHP_Token_CLASS': case 'PHP_Token_FUNCTION': - /* @var PHP_Token_Interface $token */ + /* @var \PHP_Token_Interface $token */ $docblock = $token->getDocblock(); @@ -853,9 +834,9 @@ private function getLinesToBeIgnored($filename) for ($i = $token->getLine(); $i <= $endLine; $i++) { $this->ignoredLines[$filename][] = $i; } - } elseif ($token instanceof PHP_Token_INTERFACE || - $token instanceof PHP_Token_TRAIT || - $token instanceof PHP_Token_CLASS) { + } elseif ($token instanceof \PHP_Token_INTERFACE || + $token instanceof \PHP_Token_TRAIT || + $token instanceof \PHP_Token_CLASS) { if (empty($classes[$token->getName()]['methods'])) { for ($i = $token->getLine(); $i <= $token->getEndLine(); @@ -931,9 +912,7 @@ private function getLinesToBeIgnored($filename) * @param array $linesToBeCovered * @param array $linesToBeUsed * - * @throws PHP_CodeCoverage_UnintentionallyCoveredCodeException - * - * @since Method available since Release 2.0.0 + * @throws UnintentionallyCoveredCodeException */ private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) { @@ -955,7 +934,7 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); if (!empty($unintentionallyCoveredUnits)) { - throw new PHP_CodeCoverage_UnintentionallyCoveredCodeException( + throw new UnintentionallyCoveredCodeException( $unintentionallyCoveredUnits ); } @@ -966,7 +945,7 @@ private function performUnintentionallyCoveredCodeCheck(array &$data, array $lin * @param array $linesToBeCovered * @param array $linesToBeUsed * - * @throws PHP_CodeCoverage_CoveredCodeNotExecutedException + * @throws CoveredCodeNotExecutedException */ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed) { @@ -998,7 +977,7 @@ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToB } if (!empty($message)) { - throw new PHP_CodeCoverage_CoveredCodeNotExecutedException($message); + throw new CoveredCodeNotExecutedException($message); } } @@ -1007,8 +986,6 @@ private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToB * @param array $linesToBeUsed * * @return array - * - * @since Method available since Release 2.0.0 */ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) { @@ -1046,24 +1023,24 @@ private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed) } /** - * @return PHP_CodeCoverage_Driver + * @return Driver * - * @throws PHP_CodeCoverage_RuntimeException + * @throws RuntimeException */ private function selectDriver() { $runtime = new Runtime; if (!$runtime->canCollectCodeCoverage()) { - throw new PHP_CodeCoverage_RuntimeException('No code coverage driver available'); + throw new RuntimeException('No code coverage driver available'); } if ($runtime->isHHVM()) { - return new PHP_CodeCoverage_Driver_HHVM; + return new HHVM; } elseif ($runtime->isPHPDBG()) { - return new PHP_CodeCoverage_Driver_PHPDBG; + return new PHPDBG; } else { - return new PHP_CodeCoverage_Driver_Xdebug; + return new Xdebug; } } @@ -1084,7 +1061,7 @@ private function processUnintentionallyCoveredUnits(array $unintentionallyCovere continue; } - $class = new ReflectionClass($unit[0]); + $class = new \ReflectionClass($unit[0]); foreach ($this->unintentionallyCoveredSubclassesWhitelist as $whitelisted) { if ($class->isSubclassOf($whitelisted)) { diff --git a/src/CodeCoverage/Exception/Exception.php b/src/CodeCoverage/Exception/Exception.php deleted file mode 100644 index 9118a78b7..000000000 --- a/src/CodeCoverage/Exception/Exception.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Exception interface for PHP_CodeCoverage component. - * - * @since Interface available since Release 3.0.0 - */ -interface PHP_CodeCoverage_Exception -{ -} diff --git a/src/CodeCoverage/Exception/RuntimeException.php b/src/CodeCoverage/Exception/RuntimeException.php deleted file mode 100644 index bb6bc5ecc..000000000 --- a/src/CodeCoverage/Exception/RuntimeException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * @since Class available since Release 3.0.0 - */ -class PHP_CodeCoverage_RuntimeException extends RuntimeException implements PHP_CodeCoverage_Exception -{ -} diff --git a/src/CodeCoverage/Report/HTML/Renderer/Directory.php b/src/CodeCoverage/Report/HTML/Renderer/Directory.php deleted file mode 100644 index a881cdeba..000000000 --- a/src/CodeCoverage/Report/HTML/Renderer/Directory.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * Renders a PHP_CodeCoverage_Report_Node_Directory node. - * - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_HTML_Renderer_Directory 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) - { - $template = new Text_Template($this->templatePath . 'directory.html', '{{', '}}'); - - $this->setCommonTemplateVariables($template, $node); - - $items = $this->renderItem($node, true); - - foreach ($node->getDirectories() as $item) { - $items .= $this->renderItem($item); - } - - foreach ($node->getFiles() as $item) { - $items .= $this->renderItem($item); - } - - $template->setVar( - [ - 'id' => $node->getId(), - 'items' => $items - ] - ); - - $template->renderTo($file); - } - - /** - * @param PHP_CodeCoverage_Report_Node $item - * @param bool $total - * - * @return string - */ - protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = false) - { - $data = [ - 'numClasses' => $item->getNumClassesAndTraits(), - 'numTestedClasses' => $item->getNumTestedClassesAndTraits(), - 'numMethods' => $item->getNumMethods(), - 'numTestedMethods' => $item->getNumTestedMethods(), - 'linesExecutedPercent' => $item->getLineExecutedPercent(false), - 'linesExecutedPercentAsString' => $item->getLineExecutedPercent(), - 'numExecutedLines' => $item->getNumExecutedLines(), - 'numExecutableLines' => $item->getNumExecutableLines(), - 'testedMethodsPercent' => $item->getTestedMethodsPercent(false), - 'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(), - 'testedClassesPercent' => $item->getTestedClassesAndTraitsPercent(false), - 'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent() - ]; - - if ($total) { - $data['name'] = 'Total'; - } else { - if ($item instanceof PHP_CodeCoverage_Report_Node_Directory) { - $data['name'] = sprintf( - '%s', - $item->getName(), - $item->getName() - ); - - $data['icon'] = ' '; - } else { - $data['name'] = sprintf( - '%s', - $item->getName(), - $item->getName() - ); - - $data['icon'] = ' '; - } - } - - return $this->renderItemTemplate( - new Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'), - $data - ); - } -} diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css b/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css deleted file mode 100644 index cd1c616ad..000000000 --- a/src/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.3.4 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/src/CodeCoverage/Driver.php b/src/Driver/Driver.php similarity index 85% rename from src/CodeCoverage/Driver.php rename to src/Driver/Driver.php index 02be5fff1..8d9ef5357 100644 --- a/src/CodeCoverage/Driver.php +++ b/src/Driver/Driver.php @@ -1,6 +1,6 @@ * @@ -8,12 +8,12 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Driver; + /** * Interface for code coverage drivers. - * - * @since Class available since Release 1.0.0 */ -interface PHP_CodeCoverage_Driver +interface Driver { /** * @var int diff --git a/src/CodeCoverage/Driver/HHVM.php b/src/Driver/HHVM.php similarity index 71% rename from src/CodeCoverage/Driver/HHVM.php rename to src/Driver/HHVM.php index a9d8f0cef..76758cb6e 100644 --- a/src/CodeCoverage/Driver/HHVM.php +++ b/src/Driver/HHVM.php @@ -1,6 +1,6 @@ * @@ -8,13 +8,14 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Driver; + /** * Driver for HHVM's code coverage functionality. * - * @since Class available since Release 2.2.2 * @codeCoverageIgnore */ -class PHP_CodeCoverage_Driver_HHVM extends PHP_CodeCoverage_Driver_Xdebug +class HHVM extends Xdebug { /** * Start collection of code coverage information. diff --git a/src/CodeCoverage/Driver/PHPDBG.php b/src/Driver/PHPDBG.php similarity index 89% rename from src/CodeCoverage/Driver/PHPDBG.php rename to src/Driver/PHPDBG.php index 7e8fbf6c2..6e1cdd943 100644 --- a/src/CodeCoverage/Driver/PHPDBG.php +++ b/src/Driver/PHPDBG.php @@ -1,6 +1,6 @@ * @@ -8,13 +8,16 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Driver; + +use SebastianBergmann\CodeCoverage\RuntimeException; + /** * Driver for PHPDBG's code coverage functionality. * - * @since Class available since Release 2.2.0 * @codeCoverageIgnore */ -class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver +class PHPDBG implements Driver { /** * Constructor. @@ -22,13 +25,13 @@ class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver public function __construct() { if (PHP_SAPI !== 'phpdbg') { - throw new PHP_CodeCoverage_RuntimeException( + throw new RuntimeException( 'This driver requires the PHPDBG SAPI' ); } if (!function_exists('phpdbg_start_oplog')) { - throw new PHP_CodeCoverage_RuntimeException( + throw new RuntimeException( 'This build of PHPDBG does not support code coverage' ); } diff --git a/src/CodeCoverage/Driver/Xdebug.php b/src/Driver/Xdebug.php similarity index 82% rename from src/CodeCoverage/Driver/Xdebug.php rename to src/Driver/Xdebug.php index 34420c1f1..98dab1391 100644 --- a/src/CodeCoverage/Driver/Xdebug.php +++ b/src/Driver/Xdebug.php @@ -1,6 +1,6 @@ * @@ -8,13 +8,16 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Driver; + +use SebastianBergmann\CodeCoverage\RuntimeException; + /** * Driver for Xdebug's code coverage functionality. * - * @since Class available since Release 1.0.0 * @codeCoverageIgnore */ -class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver +class Xdebug implements Driver { /** * Constructor. @@ -22,12 +25,12 @@ class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver public function __construct() { if (!extension_loaded('xdebug')) { - throw new PHP_CodeCoverage_RuntimeException('This driver requires Xdebug'); + throw new RuntimeException('This driver requires Xdebug'); } if (version_compare(phpversion('xdebug'), '2.2.1', '>=') && !ini_get('xdebug.coverage_enable')) { - throw new PHP_CodeCoverage_RuntimeException( + throw new RuntimeException( 'xdebug.coverage_enable=On has to be set in php.ini' ); } @@ -58,8 +61,6 @@ public function stop() * @param array $data * * @return array - * - * @since Method available since Release 2.0.0 */ private function cleanup(array $data) { @@ -84,8 +85,6 @@ private function cleanup(array $data) * @param string $file * * @return int - * - * @since Method available since Release 2.0.0 */ private function getNumberOfLinesInFile($file) { diff --git a/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php b/src/Exception/CoveredCodeNotExecutedException.php similarity index 57% rename from src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php rename to src/Exception/CoveredCodeNotExecutedException.php index 80feff19a..ca28a231b 100644 --- a/src/CodeCoverage/Exception/CoveredCodeNotExecutedException.php +++ b/src/Exception/CoveredCodeNotExecutedException.php @@ -1,6 +1,6 @@ * @@ -8,11 +8,11 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + /** * Exception that is raised when covered code is not executed. - * - * @since Class available since Release 3.1.0 */ -class PHP_CodeCoverage_CoveredCodeNotExecutedException extends PHP_CodeCoverage_RuntimeException +class CoveredCodeNotExecutedException extends RuntimeException { } diff --git a/src/CodeCoverage/Report/XML/Directory.php b/src/Exception/Exception.php similarity index 52% rename from src/CodeCoverage/Report/XML/Directory.php rename to src/Exception/Exception.php index 8e292b506..a3ba4c4c6 100644 --- a/src/CodeCoverage/Report/XML/Directory.php +++ b/src/Exception/Exception.php @@ -1,6 +1,6 @@ * @@ -8,9 +8,11 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + /** - * @since Class available since Release 2.0.0 + * Exception interface for php-code-coverage component. */ -class PHP_CodeCoverage_Report_XML_Directory extends PHP_CodeCoverage_Report_XML_Node +interface Exception { } diff --git a/src/CodeCoverage/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php similarity index 73% rename from src/CodeCoverage/Exception/InvalidArgumentException.php rename to src/Exception/InvalidArgumentException.php index ca7b25973..1733f6cb5 100644 --- a/src/CodeCoverage/Exception/InvalidArgumentException.php +++ b/src/Exception/InvalidArgumentException.php @@ -1,6 +1,6 @@ * @@ -8,17 +8,16 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 3.0.0 - */ -class PHP_CodeCoverage_InvalidArgumentException extends InvalidArgumentException implements PHP_CodeCoverage_Exception +namespace SebastianBergmann\CodeCoverage; + +class InvalidArgumentException extends \InvalidArgumentException implements Exception { /** * @param int $argument * @param string $type * @param mixed $value * - * @return PHP_CodeCoverage_InvalidArgumentException + * @return InvalidArgumentException */ public static function create($argument, $type, $value = null) { diff --git a/src/CodeCoverage/Exception/MissingCoversAnnotationException.php b/src/Exception/MissingCoversAnnotationException.php similarity index 57% rename from src/CodeCoverage/Exception/MissingCoversAnnotationException.php rename to src/Exception/MissingCoversAnnotationException.php index 442aaa3e3..7bc5cf3e8 100644 --- a/src/CodeCoverage/Exception/MissingCoversAnnotationException.php +++ b/src/Exception/MissingCoversAnnotationException.php @@ -1,6 +1,6 @@ * @@ -8,11 +8,11 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + /** * Exception that is raised when @covers must be used but is not. - * - * @since Class available since Release 3.2.0 */ -class PHP_CodeCoverage_MissingCoversAnnotationException extends PHP_CodeCoverage_RuntimeException +class MissingCoversAnnotationException extends RuntimeException { } diff --git a/src/Exception/RuntimeException.php b/src/Exception/RuntimeException.php new file mode 100644 index 000000000..c143db7da --- /dev/null +++ b/src/Exception/RuntimeException.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\CodeCoverage; + +class RuntimeException extends \RuntimeException implements Exception +{ +} diff --git a/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php b/src/Exception/UnintentionallyCoveredCodeException.php similarity index 83% rename from src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php rename to src/Exception/UnintentionallyCoveredCodeException.php index d4268a0b9..3ea542b1f 100644 --- a/src/CodeCoverage/Exception/UnintentionallyCoveredCodeException.php +++ b/src/Exception/UnintentionallyCoveredCodeException.php @@ -1,6 +1,6 @@ * @@ -8,12 +8,12 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + /** * Exception that is raised when code is unintentionally covered. - * - * @since Class available since Release 2.0.0 */ -class PHP_CodeCoverage_UnintentionallyCoveredCodeException extends PHP_CodeCoverage_RuntimeException +class UnintentionallyCoveredCodeException extends RuntimeException { /** * @var array diff --git a/src/CodeCoverage/Filter.php b/src/Filter.php similarity index 90% rename from src/CodeCoverage/Filter.php rename to src/Filter.php index 20f1a7311..771a657ae 100644 --- a/src/CodeCoverage/Filter.php +++ b/src/Filter.php @@ -1,6 +1,6 @@ * @@ -8,12 +8,12 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + /** * Filter for whitelisting of code coverage information. - * - * @since Class available since Release 1.0.0 */ -class PHP_CodeCoverage_Filter +class Filter { /** * Source files that are whitelisted. @@ -31,7 +31,7 @@ class PHP_CodeCoverage_Filter */ public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '') { - $facade = new File_Iterator_Facade; + $facade = new \File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, $suffix, $prefix); foreach ($files as $file) { @@ -70,7 +70,7 @@ public function addFilesToWhitelist(array $files) */ public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '') { - $facade = new File_Iterator_Facade; + $facade = new \File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, $suffix, $prefix); foreach ($files as $file) { @@ -145,8 +145,6 @@ public function getWhitelist() * Returns whether this filter has a whitelist. * * @return bool - * - * @since Method available since Release 1.1.0 */ public function hasWhitelist() { @@ -157,8 +155,6 @@ public function hasWhitelist() * Returns the whitelisted files. * * @return array - * - * @since Method available since Release 2.0.0 */ public function getWhitelistedFiles() { @@ -169,8 +165,6 @@ public function getWhitelistedFiles() * Sets the whitelisted files. * * @param array $whitelistedFiles - * - * @since Method available since Release 2.0.0 */ public function setWhitelistedFiles($whitelistedFiles) { diff --git a/src/CodeCoverage/Report/Node.php b/src/Node/AbstractNode.php similarity index 86% rename from src/CodeCoverage/Report/Node.php rename to src/Node/AbstractNode.php index c8f3c7041..f3608058e 100644 --- a/src/CodeCoverage/Report/Node.php +++ b/src/Node/AbstractNode.php @@ -1,6 +1,6 @@ * @@ -8,45 +8,47 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Node; + +use SebastianBergmann\CodeCoverage\Util; + /** * Base class for nodes in the code coverage information tree. - * - * @since Class available since Release 1.1.0 */ -abstract class PHP_CodeCoverage_Report_Node implements Countable +abstract class AbstractNode implements \Countable { /** * @var string */ - protected $name; + private $name; /** * @var string */ - protected $path; + private $path; /** * @var array */ - protected $pathArray; + private $pathArray; /** - * @var PHP_CodeCoverage_Report_Node + * @var AbstractNode */ - protected $parent; + private $parent; /** * @var string */ - protected $id; + private $id; /** * Constructor. * - * @param string $name - * @param PHP_CodeCoverage_Report_Node $parent + * @param string $name + * @param AbstractNode $parent */ - public function __construct($name, PHP_CodeCoverage_Report_Node $parent = null) + public function __construct($name, AbstractNode $parent = null) { if (substr($name, -1) == '/') { $name = substr($name, 0, -1); @@ -123,7 +125,7 @@ public function getPathAsArray() } /** - * @return PHP_CodeCoverage_Report_Node + * @return AbstractNode */ public function getParent() { @@ -139,7 +141,7 @@ public function getParent() */ public function getTestedClassesPercent($asString = true) { - return PHP_CodeCoverage_Util::percent( + return Util::percent( $this->getNumTestedClasses(), $this->getNumClasses(), $asString @@ -155,7 +157,7 @@ public function getTestedClassesPercent($asString = true) */ public function getTestedTraitsPercent($asString = true) { - return PHP_CodeCoverage_Util::percent( + return Util::percent( $this->getNumTestedTraits(), $this->getNumTraits(), $asString @@ -168,12 +170,10 @@ public function getTestedTraitsPercent($asString = true) * @param bool $asString * * @return int - * - * @since Method available since Release 1.2.0 */ public function getTestedClassesAndTraitsPercent($asString = true) { - return PHP_CodeCoverage_Util::percent( + return Util::percent( $this->getNumTestedClassesAndTraits(), $this->getNumClassesAndTraits(), $asString @@ -189,7 +189,7 @@ public function getTestedClassesAndTraitsPercent($asString = true) */ public function getTestedMethodsPercent($asString = true) { - return PHP_CodeCoverage_Util::percent( + return Util::percent( $this->getNumTestedMethods(), $this->getNumMethods(), $asString @@ -205,7 +205,7 @@ public function getTestedMethodsPercent($asString = true) */ public function getLineExecutedPercent($asString = true) { - return PHP_CodeCoverage_Util::percent( + return Util::percent( $this->getNumExecutedLines(), $this->getNumExecutableLines(), $asString @@ -216,8 +216,6 @@ public function getLineExecutedPercent($asString = true) * Returns the number of classes and traits. * * @return int - * - * @since Method available since Release 1.2.0 */ public function getNumClassesAndTraits() { @@ -228,8 +226,6 @@ public function getNumClassesAndTraits() * Returns the number of tested classes and traits. * * @return int - * - * @since Method available since Release 1.2.0 */ public function getNumTestedClassesAndTraits() { @@ -240,8 +236,6 @@ public function getNumTestedClassesAndTraits() * Returns the classes and traits of this node. * * @return array - * - * @since Method available since Release 1.2.0 */ public function getClassesAndTraits() { diff --git a/src/CodeCoverage/Report/Factory.php b/src/Node/Builder.php similarity index 86% rename from src/CodeCoverage/Report/Factory.php rename to src/Node/Builder.php index e87851d02..8a6a65c1b 100644 --- a/src/CodeCoverage/Report/Factory.php +++ b/src/Node/Builder.php @@ -1,6 +1,6 @@ * @@ -8,23 +8,22 @@ * file that was distributed with this source code. */ -/** - * Factory for PHP_CodeCoverage_Report_Node_* object graphs. - * - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_Factory +namespace SebastianBergmann\CodeCoverage\Node; + +use SebastianBergmann\CodeCoverage\CodeCoverage; + +class Builder { /** - * @param PHP_CodeCoverage $coverage + * @param CodeCoverage $coverage * - * @return PHP_CodeCoverage_Report_Node_Directory + * @return Directory */ - public function create(PHP_CodeCoverage $coverage) + public function build(CodeCoverage $coverage) { $files = $coverage->getData(); $commonPath = $this->reducePaths($files); - $root = new PHP_CodeCoverage_Report_Node_Directory( + $root = new Directory( $commonPath, null ); @@ -40,12 +39,12 @@ public function create(PHP_CodeCoverage $coverage) } /** - * @param PHP_CodeCoverage_Report_Node_Directory $root - * @param array $items - * @param array $tests - * @param bool $cacheTokens + * @param Directory $root + * @param array $items + * @param array $tests + * @param bool $cacheTokens */ - private function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $items, array $tests, $cacheTokens) + private function addItems(Directory $root, array $items, array $tests, $cacheTokens) { foreach ($items as $key => $value) { if (substr($key, -2) == '/f') { diff --git a/src/CodeCoverage/Report/Node/Directory.php b/src/Node/Directory.php similarity index 86% rename from src/CodeCoverage/Report/Node/Directory.php rename to src/Node/Directory.php index c8ad08ad4..6a9f28db5 100644 --- a/src/CodeCoverage/Report/Node/Directory.php +++ b/src/Node/Directory.php @@ -1,6 +1,6 @@ * @@ -8,102 +8,104 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Node; + +use SebastianBergmann\CodeCoverage\InvalidArgumentException; + /** * Represents a directory in the code coverage information tree. - * - * @since Class available since Release 1.1.0 */ -class PHP_CodeCoverage_Report_Node_Directory extends PHP_CodeCoverage_Report_Node implements IteratorAggregate +class Directory extends AbstractNode implements \IteratorAggregate { /** - * @var PHP_CodeCoverage_Report_Node[] + * @var AbstractNode[] */ - protected $children = []; + private $children = []; /** - * @var PHP_CodeCoverage_Report_Node_Directory[] + * @var Directory[] */ - protected $directories = []; + private $directories = []; /** - * @var PHP_CodeCoverage_Report_Node_File[] + * @var File[] */ - protected $files = []; + private $files = []; /** * @var array */ - protected $classes; + private $classes; /** * @var array */ - protected $traits; + private $traits; /** * @var array */ - protected $functions; + private $functions; /** * @var array */ - protected $linesOfCode = null; + private $linesOfCode = null; /** * @var int */ - protected $numFiles = -1; + private $numFiles = -1; /** * @var int */ - protected $numExecutableLines = -1; + private $numExecutableLines = -1; /** * @var int */ - protected $numExecutedLines = -1; + private $numExecutedLines = -1; /** * @var int */ - protected $numClasses = -1; + private $numClasses = -1; /** * @var int */ - protected $numTestedClasses = -1; + private $numTestedClasses = -1; /** * @var int */ - protected $numTraits = -1; + private $numTraits = -1; /** * @var int */ - protected $numTestedTraits = -1; + private $numTestedTraits = -1; /** * @var int */ - protected $numMethods = -1; + private $numMethods = -1; /** * @var int */ - protected $numTestedMethods = -1; + private $numTestedMethods = -1; /** * @var int */ - protected $numFunctions = -1; + private $numFunctions = -1; /** * @var int */ - protected $numTestedFunctions = -1; + private $numTestedFunctions = -1; /** * Returns the number of files in/under this node. @@ -126,13 +128,13 @@ public function count() /** * Returns an iterator for this node. * - * @return RecursiveIteratorIterator + * @return \RecursiveIteratorIterator */ public function getIterator() { - return new RecursiveIteratorIterator( - new PHP_CodeCoverage_Report_Node_Iterator($this), - RecursiveIteratorIterator::SELF_FIRST + return new \RecursiveIteratorIterator( + new Iterator($this), + \RecursiveIteratorIterator::SELF_FIRST ); } @@ -141,7 +143,7 @@ public function getIterator() * * @param string $name * - * @return PHP_CodeCoverage_Report_Node_Directory + * @return Directory */ public function addDirectory($name) { @@ -161,13 +163,13 @@ public function addDirectory($name) * @param array $testData * @param bool $cacheTokens * - * @return PHP_CodeCoverage_Report_Node_File + * @return File * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ public function addFile($name, array $coverageData, array $testData, $cacheTokens) { - $file = new PHP_CodeCoverage_Report_Node_File( + $file = new File( $name, $this, $coverageData, diff --git a/src/CodeCoverage/Report/Node/File.php b/src/Node/File.php similarity index 90% rename from src/CodeCoverage/Report/Node/File.php rename to src/Node/File.php index 60ab8374f..b94f20765 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/Node/File.php @@ -1,6 +1,6 @@ * @@ -8,108 +8,110 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Node; + +use SebastianBergmann\CodeCoverage\InvalidArgumentException; + /** * Represents a file in the code coverage information tree. - * - * @since Class available since Release 1.1.0 */ -class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node +class File extends AbstractNode { /** * @var array */ - protected $coverageData; + private $coverageData; /** * @var array */ - protected $testData; + private $testData; /** * @var int */ - protected $numExecutableLines = 0; + private $numExecutableLines = 0; /** * @var int */ - protected $numExecutedLines = 0; + private $numExecutedLines = 0; /** * @var array */ - protected $classes = []; + private $classes = []; /** * @var array */ - protected $traits = []; + private $traits = []; /** * @var array */ - protected $functions = []; + private $functions = []; /** * @var array */ - protected $linesOfCode = []; + private $linesOfCode = []; /** * @var int */ - protected $numTestedTraits = 0; + private $numTestedTraits = 0; /** * @var int */ - protected $numTestedClasses = 0; + private $numTestedClasses = 0; /** * @var int */ - protected $numMethods = null; + private $numMethods = null; /** * @var int */ - protected $numTestedMethods = null; + private $numTestedMethods = null; /** * @var int */ - protected $numTestedFunctions = null; + private $numTestedFunctions = null; /** * @var array */ - protected $startLines = []; + private $startLines = []; /** * @var array */ - protected $endLines = []; + private $endLines = []; /** * @var bool */ - protected $cacheTokens; + private $cacheTokens; /** * Constructor. * - * @param string $name - * @param PHP_CodeCoverage_Report_Node $parent - * @param array $coverageData - * @param array $testData - * @param bool $cacheTokens + * @param string $name + * @param AbstractNode $parent + * @param array $coverageData + * @param array $testData + * @param bool $cacheTokens * - * @throws PHP_CodeCoverage_InvalidArgumentException + * @throws InvalidArgumentException */ - public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens) + public function __construct($name, AbstractNode $parent, array $coverageData, array $testData, $cacheTokens) { if (!is_bool($cacheTokens)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'boolean' ); @@ -355,9 +357,9 @@ protected function calculateStatistics() $classStack = $functionStack = []; if ($this->cacheTokens) { - $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath()); + $tokens = \PHP_Token_Stream_CachingFactory::get($this->getPath()); } else { - $tokens = new PHP_Token_Stream($this->getPath()); + $tokens = new \PHP_Token_Stream($this->getPath()); } $this->processClasses($tokens); @@ -532,9 +534,9 @@ protected function calculateStatistics() } /** - * @param PHP_Token_Stream $tokens + * @param \PHP_Token_Stream $tokens */ - protected function processClasses(PHP_Token_Stream $tokens) + protected function processClasses(\PHP_Token_Stream $tokens) { $classes = $tokens->getClasses(); unset($tokens); @@ -568,9 +570,9 @@ protected function processClasses(PHP_Token_Stream $tokens) } /** - * @param PHP_Token_Stream $tokens + * @param \PHP_Token_Stream $tokens */ - protected function processTraits(PHP_Token_Stream $tokens) + protected function processTraits(\PHP_Token_Stream $tokens) { $traits = $tokens->getTraits(); unset($tokens); @@ -604,9 +606,9 @@ protected function processTraits(PHP_Token_Stream $tokens) } /** - * @param PHP_Token_Stream $tokens + * @param \PHP_Token_Stream $tokens */ - protected function processFunctions(PHP_Token_Stream $tokens) + protected function processFunctions(\PHP_Token_Stream $tokens) { $functions = $tokens->getFunctions(); unset($tokens); @@ -639,8 +641,6 @@ protected function processFunctions(PHP_Token_Stream $tokens) * @param float $coverage * * @return string - * - * @since Method available since Release 1.2.0 */ protected function crap($ccn, $coverage) { diff --git a/src/CodeCoverage/Report/Node/Iterator.php b/src/Node/Iterator.php similarity index 68% rename from src/CodeCoverage/Report/Node/Iterator.php rename to src/Node/Iterator.php index f468b6b8b..e24638059 100644 --- a/src/CodeCoverage/Report/Node/Iterator.php +++ b/src/Node/Iterator.php @@ -1,6 +1,6 @@ * @@ -8,29 +8,27 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Node; + /** - * Recursive iterator for PHP_CodeCoverage_Report_Node object graphs. - * - * @since Class available since Release 1.1.0 + * Recursive iterator for node object graphs. */ -class PHP_CodeCoverage_Report_Node_Iterator implements RecursiveIterator +class Iterator implements \RecursiveIterator { /** * @var int */ - protected $position; + private $position; /** - * @var PHP_CodeCoverage_Report_Node[] + * @var AbstractNode[] */ - protected $nodes; + private $nodes; /** - * Constructor. - * - * @param PHP_CodeCoverage_Report_Node_Directory $node + * @param Directory $node */ - public function __construct(PHP_CodeCoverage_Report_Node_Directory $node) + public function __construct(Directory $node) { $this->nodes = $node->getChildNodes(); } @@ -66,7 +64,7 @@ public function key() /** * Returns the current element. * - * @return PHPUnit_Framework_Test + * @return \PHPUnit_Framework_Test */ public function current() { @@ -84,7 +82,7 @@ public function next() /** * Returns the sub iterator for the current element. * - * @return PHP_CodeCoverage_Report_Node_Iterator + * @return Iterator */ public function getChildren() { @@ -100,6 +98,6 @@ public function getChildren() */ public function hasChildren() { - return $this->nodes[$this->position] instanceof PHP_CodeCoverage_Report_Node_Directory; + return $this->nodes[$this->position] instanceof Directory; } } diff --git a/src/CodeCoverage/Report/Clover.php b/src/Report/Clover.php similarity index 94% rename from src/CodeCoverage/Report/Clover.php rename to src/Report/Clover.php index d238189cf..7b0fa38e9 100644 --- a/src/CodeCoverage/Report/Clover.php +++ b/src/Report/Clover.php @@ -1,6 +1,6 @@ * @@ -8,23 +8,26 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\File; + /** - * Generates a Clover XML logfile from an PHP_CodeCoverage object. - * - * @since Class available since Release 1.0.0 + * Generates a Clover XML logfile from a code coverage object. */ -class PHP_CodeCoverage_Report_Clover +class Clover { /** - * @param PHP_CodeCoverage $coverage - * @param string $target - * @param string $name + * @param CodeCoverage $coverage + * @param string $target + * @param string $name * * @return string */ - public function process(PHP_CodeCoverage $coverage, $target = null, $name = null) + public function process(CodeCoverage $coverage, $target = null, $name = null) { - $xmlDocument = new DOMDocument('1.0', 'UTF-8'); + $xmlDocument = new \DOMDocument('1.0', 'UTF-8'); $xmlDocument->formatOutput = true; $xmlCoverage = $xmlDocument->createElement('coverage'); @@ -45,10 +48,12 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null unset($coverage); foreach ($report as $item) { - if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { + if (!$item instanceof File) { continue; } + /* @var File $item */ + $xmlFile = $xmlDocument->createElement('file'); $xmlFile->setAttribute('name', $item->getPath()); diff --git a/src/CodeCoverage/Report/Crap4j.php b/src/Report/Crap4j.php similarity index 89% rename from src/CodeCoverage/Report/Crap4j.php rename to src/Report/Crap4j.php index 0bd369d2f..00180d0ea 100644 --- a/src/CodeCoverage/Report/Crap4j.php +++ b/src/Report/Crap4j.php @@ -1,6 +1,6 @@ * @@ -8,10 +8,13 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_Crap4j +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\File; +use SebastianBergmann\CodeCoverage\InvalidArgumentException; + +class Crap4j { /** * @var int @@ -24,7 +27,7 @@ class PHP_CodeCoverage_Report_Crap4j public function __construct($threshold = 30) { if (!is_int($threshold)) { - throw PHP_CodeCoverage_InvalidArgumentException::create( + throw InvalidArgumentException::create( 1, 'integer' ); @@ -34,15 +37,15 @@ public function __construct($threshold = 30) } /** - * @param PHP_CodeCoverage $coverage - * @param string $target - * @param string $name + * @param CodeCoverage $coverage + * @param string $target + * @param string $name * * @return string */ - public function process(PHP_CodeCoverage $coverage, $target = null, $name = null) + public function process(CodeCoverage $coverage, $target = null, $name = null) { - $document = new DOMDocument('1.0', 'UTF-8'); + $document = new \DOMDocument('1.0', 'UTF-8'); $document->formatOutput = true; $root = $document->createElement('crap_result'); @@ -66,7 +69,7 @@ public function process(PHP_CodeCoverage $coverage, $target = null, $name = null foreach ($report as $item) { $namespace = 'global'; - if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { + if (!$item instanceof File) { continue; } diff --git a/src/CodeCoverage/Report/HTML.php b/src/Report/Html/Facade.php similarity index 86% rename from src/CodeCoverage/Report/HTML.php rename to src/Report/Html/Facade.php index 15bb87438..acff5bda7 100644 --- a/src/CodeCoverage/Report/HTML.php +++ b/src/Report/Html/Facade.php @@ -1,6 +1,6 @@ * @@ -8,12 +8,15 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Report\Html; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; + /** - * Generates an HTML report from an PHP_CodeCoverage object. - * - * @since Class available since Release 1.0.0 + * Generates an HTML report from a code coverage object. */ -class PHP_CodeCoverage_Report_HTML +class Facade { /** * @var string @@ -59,10 +62,10 @@ public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generato } /** - * @param PHP_CodeCoverage $coverage - * @param string $target + * @param CodeCoverage $coverage + * @param string $target */ - public function process(PHP_CodeCoverage $coverage, $target) + public function process(CodeCoverage $coverage, $target) { $target = $this->getDirectory($target); $report = $coverage->getReport(); @@ -74,7 +77,7 @@ public function process(PHP_CodeCoverage $coverage, $target) $date = date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']); - $dashboard = new PHP_CodeCoverage_Report_HTML_Renderer_Dashboard( + $dashboard = new Dashboard( $this->templatePath, $this->generator, $date, @@ -82,7 +85,7 @@ public function process(PHP_CodeCoverage $coverage, $target) $this->highLowerBound ); - $directory = new PHP_CodeCoverage_Report_HTML_Renderer_Directory( + $directory = new Directory( $this->templatePath, $this->generator, $date, @@ -90,7 +93,7 @@ public function process(PHP_CodeCoverage $coverage, $target) $this->highLowerBound ); - $file = new PHP_CodeCoverage_Report_HTML_Renderer_File( + $file = new File( $this->templatePath, $this->generator, $date, @@ -104,7 +107,7 @@ public function process(PHP_CodeCoverage $coverage, $target) foreach ($report as $node) { $id = $node->getId(); - if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { + if ($node instanceof DirectoryNode) { if (!file_exists($target . $id)) { mkdir($target . $id, 0777, true); } @@ -157,9 +160,7 @@ private function copyFiles($target) * * @return string * - * @throws PHP_CodeCoverage_RuntimeException - * - * @since Method available since Release 1.2.0 + * @throws RuntimeException */ private function getDirectory($directory) { @@ -175,7 +176,7 @@ private function getDirectory($directory) return $directory; } - throw new PHP_CodeCoverage_RuntimeException( + throw new RuntimeException( sprintf( 'Directory "%s" does not exist.', $directory diff --git a/src/CodeCoverage/Report/HTML/Renderer.php b/src/Report/Html/Renderer.php similarity index 85% rename from src/CodeCoverage/Report/HTML/Renderer.php rename to src/Report/Html/Renderer.php index ef34c56c8..7fe5c466c 100644 --- a/src/CodeCoverage/Report/HTML/Renderer.php +++ b/src/Report/Html/Renderer.php @@ -1,6 +1,6 @@ * @@ -8,14 +8,18 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Report\Html; + +use SebastianBergmann\CodeCoverage\Node\AbstractNode; +use SebastianBergmann\CodeCoverage\Node\File as FileNode; +use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; use SebastianBergmann\Environment\Runtime; +use SebastianBergmann\Version; /** - * Base class for PHP_CodeCoverage_Report_Node renderers. - * - * @since Class available since Release 1.1.0 + * Base class for node renderers. */ -abstract class PHP_CodeCoverage_Report_HTML_Renderer +abstract class Renderer { /** * @var string @@ -58,7 +62,7 @@ abstract class PHP_CodeCoverage_Report_HTML_Renderer */ public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) { - $version = new SebastianBergmann\Version('4.0', dirname(dirname(dirname(dirname(__DIR__))))); + $version = new Version('4.0', dirname(dirname(dirname(dirname(__DIR__))))); $this->templatePath = $templatePath; $this->generator = $generator; @@ -69,12 +73,12 @@ public function __construct($templatePath, $generator, $date, $lowUpperBound, $h } /** - * @param Text_Template $template - * @param array $data + * @param \Text_Template $template + * @param array $data * * @return string */ - protected function renderItemTemplate(Text_Template $template, array $data) + protected function renderItemTemplate(\Text_Template $template, array $data) { $numSeparator = ' / '; @@ -149,10 +153,10 @@ protected function renderItemTemplate(Text_Template $template, array $data) } /** - * @param Text_Template $template - * @param PHP_CodeCoverage_Report_Node $node + * @param \Text_Template $template + * @param AbstractNode $node */ - protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node) + protected function setCommonTemplateVariables(\Text_Template $template, AbstractNode $node) { $runtime = new Runtime; @@ -174,14 +178,14 @@ protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeC ); } - protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node) + protected function getBreadcrumbs(AbstractNode $node) { $breadcrumbs = ''; $path = $node->getPathAsArray(); $pathToRoot = []; $max = count($path); - if ($node instanceof PHP_CodeCoverage_Report_Node_File) { + if ($node instanceof FileNode) { $max--; } @@ -203,21 +207,21 @@ protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node) return $breadcrumbs; } - protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) + protected function getActiveBreadcrumb(AbstractNode $node) { $buffer = sprintf( '
  • %s
  • ' . "\n", $node->getName() ); - if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { + if ($node instanceof DirectoryNode) { $buffer .= '
  • (Dashboard)
  • ' . "\n"; } return $buffer; } - protected function getInactiveBreadcrumb(PHP_CodeCoverage_Report_Node $node, $pathToRoot) + protected function getInactiveBreadcrumb(AbstractNode $node, $pathToRoot) { return sprintf( '
  • %s
  • ' . "\n", @@ -226,13 +230,13 @@ protected function getInactiveBreadcrumb(PHP_CodeCoverage_Report_Node $node, $pa ); } - protected function getPathToRoot(PHP_CodeCoverage_Report_Node $node) + protected function getPathToRoot(AbstractNode $node) { $id = $node->getId(); $depth = substr_count($id, '/'); if ($id != 'index' && - $node instanceof PHP_CodeCoverage_Report_Node_Directory) { + $node instanceof DirectoryNode) { $depth++; } @@ -243,7 +247,7 @@ protected function getCoverageBar($percent) { $level = $this->getColorLevel($percent); - $template = new Text_Template( + $template = new \Text_Template( $this->templatePath . 'coverage_bar.html', '{{', '}}' diff --git a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php similarity index 93% rename from src/CodeCoverage/Report/HTML/Renderer/Dashboard.php rename to src/Report/Html/Renderer/Dashboard.php index 7c0dd2301..15ba66765 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -1,6 +1,6 @@ * @@ -8,21 +8,23 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Report\Html; + +use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; + /** - * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node. - * - * @since Class available since Release 1.1.0 + * Renders the dashboard for a directory node. */ -class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer +class Dashboard extends Renderer { /** - * @param PHP_CodeCoverage_Report_Node_Directory $node - * @param string $file + * @param DirectoryNode $node + * @param string $file */ - public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) + public function render(DirectoryNode $node, $file) { $classes = $node->getClassesAndTraits(); - $template = new Text_Template( + $template = new \Text_Template( $this->templatePath . 'dashboard.html', '{{', '}}' @@ -288,7 +290,7 @@ protected function projectRisks(array $classes, $baseLink) return $result; } - protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) + protected function getActiveBreadcrumb(DirectoryNode $node) { return sprintf( '
  • %s
  • ' . "\n" . diff --git a/src/Report/Html/Renderer/Directory.php b/src/Report/Html/Renderer/Directory.php new file mode 100644 index 000000000..a4b1b96f4 --- /dev/null +++ b/src/Report/Html/Renderer/Directory.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\CodeCoverage\Report\Html; + +use SebastianBergmann\CodeCoverage\Node\AbstractNode as Node; +use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; + +/** + * Renders a directory node. + */ +class Directory extends Renderer +{ + /** + * @param DirectoryNode $node + * @param string $file + */ + public function render(DirectoryNode $node, $file) + { + $template = new \Text_Template($this->templatePath . 'directory.html', '{{', '}}'); + + $this->setCommonTemplateVariables($template, $node); + + $items = $this->renderItem($node, true); + + foreach ($node->getDirectories() as $item) { + $items .= $this->renderItem($item); + } + + foreach ($node->getFiles() as $item) { + $items .= $this->renderItem($item); + } + + $template->setVar( + [ + 'id' => $node->getId(), + 'items' => $items + ] + ); + + $template->renderTo($file); + } + + /** + * @param Node $node + * @param bool $total + * + * @return string + */ + protected function renderItem(Node $node, $total = false) + { + $data = [ + 'numClasses' => $node->getNumClassesAndTraits(), + 'numTestedClasses' => $node->getNumTestedClassesAndTraits(), + 'numMethods' => $node->getNumMethods(), + 'numTestedMethods' => $node->getNumTestedMethods(), + 'linesExecutedPercent' => $node->getLineExecutedPercent(false), + 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(), + 'numExecutedLines' => $node->getNumExecutedLines(), + 'numExecutableLines' => $node->getNumExecutableLines(), + 'testedMethodsPercent' => $node->getTestedMethodsPercent(false), + 'testedMethodsPercentAsString' => $node->getTestedMethodsPercent(), + 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false), + 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent() + ]; + + if ($total) { + $data['name'] = 'Total'; + } else { + if ($node instanceof DirectoryNode) { + $data['name'] = sprintf( + '%s', + $node->getName(), + $node->getName() + ); + + $data['icon'] = ' '; + } else { + $data['name'] = sprintf( + '%s', + $node->getName(), + $node->getName() + ); + + $data['icon'] = ' '; + } + } + + return $this->renderItemTemplate( + new \Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'), + $data + ); + } +} diff --git a/src/CodeCoverage/Report/HTML/Renderer/File.php b/src/Report/Html/Renderer/File.php similarity index 87% rename from src/CodeCoverage/Report/HTML/Renderer/File.php rename to src/Report/Html/Renderer/File.php index ad36c6410..e6b11ef03 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/File.php +++ b/src/Report/Html/Renderer/File.php @@ -1,6 +1,6 @@ * @@ -8,12 +8,15 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Report\Html; + +use SebastianBergmann\CodeCoverage\Node\File as FileNode; +use SebastianBergmann\CodeCoverage\Util; + /** - * Renders a PHP_CodeCoverage_Report_Node_File node. - * - * @since Class available since Release 1.1.0 + * Renders a file node. */ -class PHP_CodeCoverage_Report_HTML_Renderer_File extends PHP_CodeCoverage_Report_HTML_Renderer +class File extends Renderer { /** * @var int @@ -45,12 +48,12 @@ public function __construct($templatePath, $generator, $date, $lowUpperBound, $h } /** - * @param PHP_CodeCoverage_Report_Node_File $node - * @param string $file + * @param FileNode $node + * @param string $file */ - public function render(PHP_CodeCoverage_Report_Node_File $node, $file) + public function render(FileNode $node, $file) { - $template = new Text_Template($this->templatePath . 'file.html', '{{', '}}'); + $template = new \Text_Template($this->templatePath . 'file.html', '{{', '}}'); $template->setVar( [ @@ -65,15 +68,15 @@ public function render(PHP_CodeCoverage_Report_Node_File $node, $file) } /** - * @param PHP_CodeCoverage_Report_Node_File $node + * @param FileNode $node * * @return string */ - protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) + protected function renderItems(FileNode $node) { - $template = new Text_Template($this->templatePath . 'file_item.html', '{{', '}}'); + $template = new \Text_Template($this->templatePath . 'file_item.html', '{{', '}}'); - $methodItemTemplate = new Text_Template( + $methodItemTemplate = new \Text_Template( $this->templatePath . 'method_item.html', '{{', '}}' @@ -120,13 +123,13 @@ protected function renderItems(PHP_CodeCoverage_Report_Node_File $node) } /** - * @param array $items - * @param Text_Template $template - * @param Text_Template $methodItemTemplate + * @param array $items + * @param \Text_Template $template + * @param \Text_Template $methodItemTemplate * * @return string */ - protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate) + protected function renderTraitOrClassItems(array $items, \Text_Template $template, \Text_Template $methodItemTemplate) { if (empty($items)) { return ''; @@ -152,34 +155,34 @@ protected function renderTraitOrClassItems(array $items, Text_Template $template 'numTestedClasses' => $numTestedMethods == $numMethods ? 1 : 0, 'numMethods' => $numMethods, 'numTestedMethods' => $numTestedMethods, - 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent( + 'linesExecutedPercent' => Util::percent( $item['executedLines'], $item['executableLines'], false ), - 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent( + 'linesExecutedPercentAsString' => Util::percent( $item['executedLines'], $item['executableLines'], true ), 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], - 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent( + 'testedMethodsPercent' => Util::percent( $numTestedMethods, $numMethods, false ), - 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent( + 'testedMethodsPercentAsString' => Util::percent( $numTestedMethods, $numMethods, true ), - 'testedClassesPercent' => PHP_CodeCoverage_Util::percent( + 'testedClassesPercent' => Util::percent( $numTestedMethods == $numMethods ? 1 : 0, 1, false ), - 'testedClassesPercentAsString' => PHP_CodeCoverage_Util::percent( + 'testedClassesPercentAsString' => Util::percent( $numTestedMethods == $numMethods ? 1 : 0, 1, true @@ -201,12 +204,12 @@ protected function renderTraitOrClassItems(array $items, Text_Template $template } /** - * @param array $functions - * @param Text_Template $template + * @param array $functions + * @param \Text_Template $template * * @return string */ - protected function renderFunctionItems(array $functions, Text_Template $template) + protected function renderFunctionItems(array $functions, \Text_Template $template) { if (empty($functions)) { return ''; @@ -225,11 +228,11 @@ protected function renderFunctionItems(array $functions, Text_Template $template } /** - * @param Text_Template $template + * @param \Text_Template $template * * @return string */ - protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '') + protected function renderFunctionOrMethodItem(\Text_Template $template, array $item, $indent = '') { $numTestedItems = $item['executedLines'] == $item['executableLines'] ? 1 : 0; @@ -245,24 +248,24 @@ protected function renderFunctionOrMethodItem(Text_Template $template, array $it ), 'numMethods' => 1, 'numTestedMethods' => $numTestedItems, - 'linesExecutedPercent' => PHP_CodeCoverage_Util::percent( + 'linesExecutedPercent' => Util::percent( $item['executedLines'], $item['executableLines'], false ), - 'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent( + 'linesExecutedPercentAsString' => Util::percent( $item['executedLines'], $item['executableLines'], true ), 'numExecutedLines' => $item['executedLines'], 'numExecutableLines' => $item['executableLines'], - 'testedMethodsPercent' => PHP_CodeCoverage_Util::percent( + 'testedMethodsPercent' => Util::percent( $numTestedItems, 1, false ), - 'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent( + 'testedMethodsPercentAsString' => Util::percent( $numTestedItems, 1, true @@ -273,11 +276,11 @@ protected function renderFunctionOrMethodItem(Text_Template $template, array $it } /** - * @param PHP_CodeCoverage_Report_Node_File $node + * @param FileNode $node * * @return string */ - protected function renderSource(PHP_CodeCoverage_Report_Node_File $node) + protected function renderSource(FileNode $node) { $coverageData = $node->getCoverageData(); $testData = $node->getTestData(); diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist b/src/Report/Html/Renderer/Template/coverage_bar.html.dist similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist rename to src/Report/Html/Renderer/Template/coverage_bar.html.dist diff --git a/src/Report/Html/Renderer/Template/css/bootstrap.min.css b/src/Report/Html/Renderer/Template/css/bootstrap.min.css new file mode 100644 index 000000000..670b1f5f0 --- /dev/null +++ b/src/Report/Html/Renderer/Template/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')} .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} .glyphicon-asterisk:before{content:"\2a"} .glyphicon-plus:before{content:"\2b"} .glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"} .glyphicon-minus:before{content:"\2212"} .glyphicon-cloud:before{content:"\2601"} .glyphicon-envelope:before{content:"\2709"} .glyphicon-pencil:before{content:"\270f"} .glyphicon-glass:before{content:"\e001"} .glyphicon-music:before{content:"\e002"} .glyphicon-search:before{content:"\e003"} .glyphicon-heart:before{content:"\e005"} .glyphicon-star:before{content:"\e006"} .glyphicon-star-empty:before{content:"\e007"} .glyphicon-user:before{content:"\e008"} .glyphicon-film:before{content:"\e009"} .glyphicon-th-large:before{content:"\e010"} .glyphicon-th:before{content:"\e011"} .glyphicon-th-list:before{content:"\e012"} .glyphicon-ok:before{content:"\e013"} .glyphicon-remove:before{content:"\e014"} .glyphicon-zoom-in:before{content:"\e015"} .glyphicon-zoom-out:before{content:"\e016"} .glyphicon-off:before{content:"\e017"} .glyphicon-signal:before{content:"\e018"} .glyphicon-cog:before{content:"\e019"} .glyphicon-trash:before{content:"\e020"} .glyphicon-home:before{content:"\e021"} .glyphicon-file:before{content:"\e022"} .glyphicon-time:before{content:"\e023"} .glyphicon-road:before{content:"\e024"} .glyphicon-download-alt:before{content:"\e025"} .glyphicon-download:before{content:"\e026"} .glyphicon-upload:before{content:"\e027"} .glyphicon-inbox:before{content:"\e028"} .glyphicon-play-circle:before{content:"\e029"} .glyphicon-repeat:before{content:"\e030"} .glyphicon-refresh:before{content:"\e031"} .glyphicon-list-alt:before{content:"\e032"} .glyphicon-lock:before{content:"\e033"} .glyphicon-flag:before{content:"\e034"} .glyphicon-headphones:before{content:"\e035"} .glyphicon-volume-off:before{content:"\e036"} .glyphicon-volume-down:before{content:"\e037"} .glyphicon-volume-up:before{content:"\e038"} .glyphicon-qrcode:before{content:"\e039"} .glyphicon-barcode:before{content:"\e040"} .glyphicon-tag:before{content:"\e041"} .glyphicon-tags:before{content:"\e042"} .glyphicon-book:before{content:"\e043"} .glyphicon-bookmark:before{content:"\e044"} .glyphicon-print:before{content:"\e045"} .glyphicon-camera:before{content:"\e046"} .glyphicon-font:before{content:"\e047"} .glyphicon-bold:before{content:"\e048"} .glyphicon-italic:before{content:"\e049"} .glyphicon-text-height:before{content:"\e050"} .glyphicon-text-width:before{content:"\e051"} .glyphicon-align-left:before{content:"\e052"} .glyphicon-align-center:before{content:"\e053"} .glyphicon-align-right:before{content:"\e054"} .glyphicon-align-justify:before{content:"\e055"} .glyphicon-list:before{content:"\e056"} .glyphicon-indent-left:before{content:"\e057"} .glyphicon-indent-right:before{content:"\e058"} .glyphicon-facetime-video:before{content:"\e059"} .glyphicon-picture:before{content:"\e060"} .glyphicon-map-marker:before{content:"\e062"} .glyphicon-adjust:before{content:"\e063"} .glyphicon-tint:before{content:"\e064"} .glyphicon-edit:before{content:"\e065"} .glyphicon-share:before{content:"\e066"} .glyphicon-check:before{content:"\e067"} .glyphicon-move:before{content:"\e068"} .glyphicon-step-backward:before{content:"\e069"} .glyphicon-fast-backward:before{content:"\e070"} .glyphicon-backward:before{content:"\e071"} .glyphicon-play:before{content:"\e072"} .glyphicon-pause:before{content:"\e073"} .glyphicon-stop:before{content:"\e074"} .glyphicon-forward:before{content:"\e075"} .glyphicon-fast-forward:before{content:"\e076"} .glyphicon-step-forward:before{content:"\e077"} .glyphicon-eject:before{content:"\e078"} .glyphicon-chevron-left:before{content:"\e079"} .glyphicon-chevron-right:before{content:"\e080"} .glyphicon-plus-sign:before{content:"\e081"} .glyphicon-minus-sign:before{content:"\e082"} .glyphicon-remove-sign:before{content:"\e083"} .glyphicon-ok-sign:before{content:"\e084"} .glyphicon-question-sign:before{content:"\e085"} .glyphicon-info-sign:before{content:"\e086"} .glyphicon-screenshot:before{content:"\e087"} .glyphicon-remove-circle:before{content:"\e088"} .glyphicon-ok-circle:before{content:"\e089"} .glyphicon-ban-circle:before{content:"\e090"} .glyphicon-arrow-left:before{content:"\e091"} .glyphicon-arrow-right:before{content:"\e092"} .glyphicon-arrow-up:before{content:"\e093"} .glyphicon-arrow-down:before{content:"\e094"} .glyphicon-share-alt:before{content:"\e095"} .glyphicon-resize-full:before{content:"\e096"} .glyphicon-resize-small:before{content:"\e097"} .glyphicon-exclamation-sign:before{content:"\e101"} .glyphicon-gift:before{content:"\e102"} .glyphicon-leaf:before{content:"\e103"} .glyphicon-fire:before{content:"\e104"} .glyphicon-eye-open:before{content:"\e105"} .glyphicon-eye-close:before{content:"\e106"} .glyphicon-warning-sign:before{content:"\e107"} .glyphicon-plane:before{content:"\e108"} .glyphicon-calendar:before{content:"\e109"} .glyphicon-random:before{content:"\e110"} .glyphicon-comment:before{content:"\e111"} .glyphicon-magnet:before{content:"\e112"} .glyphicon-chevron-up:before{content:"\e113"} .glyphicon-chevron-down:before{content:"\e114"} .glyphicon-retweet:before{content:"\e115"} .glyphicon-shopping-cart:before{content:"\e116"} .glyphicon-folder-close:before{content:"\e117"} .glyphicon-folder-open:before{content:"\e118"} .glyphicon-resize-vertical:before{content:"\e119"} .glyphicon-resize-horizontal:before{content:"\e120"} .glyphicon-hdd:before{content:"\e121"} .glyphicon-bullhorn:before{content:"\e122"} .glyphicon-bell:before{content:"\e123"} .glyphicon-certificate:before{content:"\e124"} .glyphicon-thumbs-up:before{content:"\e125"} .glyphicon-thumbs-down:before{content:"\e126"} .glyphicon-hand-right:before{content:"\e127"} .glyphicon-hand-left:before{content:"\e128"} .glyphicon-hand-up:before{content:"\e129"} .glyphicon-hand-down:before{content:"\e130"} .glyphicon-circle-arrow-right:before{content:"\e131"} .glyphicon-circle-arrow-left:before{content:"\e132"} .glyphicon-circle-arrow-up:before{content:"\e133"} .glyphicon-circle-arrow-down:before{content:"\e134"} .glyphicon-globe:before{content:"\e135"} .glyphicon-wrench:before{content:"\e136"} .glyphicon-tasks:before{content:"\e137"} .glyphicon-filter:before{content:"\e138"} .glyphicon-briefcase:before{content:"\e139"} .glyphicon-fullscreen:before{content:"\e140"} .glyphicon-dashboard:before{content:"\e141"} .glyphicon-paperclip:before{content:"\e142"} .glyphicon-heart-empty:before{content:"\e143"} .glyphicon-link:before{content:"\e144"} .glyphicon-phone:before{content:"\e145"} .glyphicon-pushpin:before{content:"\e146"} .glyphicon-usd:before{content:"\e148"} .glyphicon-gbp:before{content:"\e149"} .glyphicon-sort:before{content:"\e150"} .glyphicon-sort-by-alphabet:before{content:"\e151"} .glyphicon-sort-by-alphabet-alt:before{content:"\e152"} .glyphicon-sort-by-order:before{content:"\e153"} .glyphicon-sort-by-order-alt:before{content:"\e154"} .glyphicon-sort-by-attributes:before{content:"\e155"} .glyphicon-sort-by-attributes-alt:before{content:"\e156"} .glyphicon-unchecked:before{content:"\e157"} .glyphicon-expand:before{content:"\e158"} .glyphicon-collapse-down:before{content:"\e159"} .glyphicon-collapse-up:before{content:"\e160"} .glyphicon-log-in:before{content:"\e161"} .glyphicon-flash:before{content:"\e162"} .glyphicon-log-out:before{content:"\e163"} .glyphicon-new-window:before{content:"\e164"} .glyphicon-record:before{content:"\e165"} .glyphicon-save:before{content:"\e166"} .glyphicon-open:before{content:"\e167"} .glyphicon-saved:before{content:"\e168"} .glyphicon-import:before{content:"\e169"} .glyphicon-export:before{content:"\e170"} .glyphicon-send:before{content:"\e171"} .glyphicon-floppy-disk:before{content:"\e172"} .glyphicon-floppy-saved:before{content:"\e173"} .glyphicon-floppy-remove:before{content:"\e174"} .glyphicon-floppy-save:before{content:"\e175"} .glyphicon-floppy-open:before{content:"\e176"} .glyphicon-credit-card:before{content:"\e177"} .glyphicon-transfer:before{content:"\e178"} .glyphicon-cutlery:before{content:"\e179"} .glyphicon-header:before{content:"\e180"} .glyphicon-compressed:before{content:"\e181"} .glyphicon-earphone:before{content:"\e182"} .glyphicon-phone-alt:before{content:"\e183"} .glyphicon-tower:before{content:"\e184"} .glyphicon-stats:before{content:"\e185"} .glyphicon-sd-video:before{content:"\e186"} .glyphicon-hd-video:before{content:"\e187"} .glyphicon-subtitles:before{content:"\e188"} .glyphicon-sound-stereo:before{content:"\e189"} .glyphicon-sound-dolby:before{content:"\e190"} .glyphicon-sound-5-1:before{content:"\e191"} .glyphicon-sound-6-1:before{content:"\e192"} .glyphicon-sound-7-1:before{content:"\e193"} .glyphicon-copyright-mark:before{content:"\e194"} .glyphicon-registration-mark:before{content:"\e195"} .glyphicon-cloud-download:before{content:"\e197"} .glyphicon-cloud-upload:before{content:"\e198"} .glyphicon-tree-conifer:before{content:"\e199"} .glyphicon-tree-deciduous:before{content:"\e200"} .glyphicon-cd:before{content:"\e201"} .glyphicon-save-file:before{content:"\e202"} .glyphicon-open-file:before{content:"\e203"} .glyphicon-level-up:before{content:"\e204"} .glyphicon-copy:before{content:"\e205"} .glyphicon-paste:before{content:"\e206"} .glyphicon-alert:before{content:"\e209"} .glyphicon-equalizer:before{content:"\e210"} .glyphicon-king:before{content:"\e211"} .glyphicon-queen:before{content:"\e212"} .glyphicon-pawn:before{content:"\e213"} .glyphicon-bishop:before{content:"\e214"} .glyphicon-knight:before{content:"\e215"} .glyphicon-baby-formula:before{content:"\e216"} .glyphicon-tent:before{content:"\26fa"} .glyphicon-blackboard:before{content:"\e218"} .glyphicon-bed:before{content:"\e219"} .glyphicon-apple:before{content:"\f8ff"} .glyphicon-erase:before{content:"\e221"} .glyphicon-hourglass:before{content:"\231b"} .glyphicon-lamp:before{content:"\e223"} .glyphicon-duplicate:before{content:"\e224"} .glyphicon-piggy-bank:before{content:"\e225"} .glyphicon-scissors:before{content:"\e226"} .glyphicon-bitcoin:before{content:"\e227"} .glyphicon-btc:before{content:"\e227"} .glyphicon-xbt:before{content:"\e227"} .glyphicon-yen:before{content:"\00a5"} .glyphicon-jpy:before{content:"\00a5"} .glyphicon-ruble:before{content:"\20bd"} .glyphicon-rub:before{content:"\20bd"} .glyphicon-scale:before{content:"\e230"} .glyphicon-ice-lolly:before{content:"\e231"} .glyphicon-ice-lolly-tasted:before{content:"\e232"} .glyphicon-education:before{content:"\e233"} .glyphicon-option-horizontal:before{content:"\e234"} .glyphicon-option-vertical:before{content:"\e235"} .glyphicon-menu-hamburger:before{content:"\e236"} .glyphicon-modal-window:before{content:"\e237"} .glyphicon-oil:before{content:"\e238"} .glyphicon-grain:before{content:"\e239"} .glyphicon-sunglasses:before{content:"\e240"} .glyphicon-text-size:before{content:"\e241"} .glyphicon-text-color:before{content:"\e242"} .glyphicon-text-background:before{content:"\e243"} .glyphicon-object-align-top:before{content:"\e244"} .glyphicon-object-align-bottom:before{content:"\e245"} .glyphicon-object-align-horizontal:before{content:"\e246"} .glyphicon-object-align-left:before{content:"\e247"} .glyphicon-object-align-vertical:before{content:"\e248"} .glyphicon-object-align-right:before{content:"\e249"} .glyphicon-triangle-right:before{content:"\e250"} .glyphicon-triangle-left:before{content:"\e251"} .glyphicon-triangle-bottom:before{content:"\e252"} .glyphicon-triangle-top:before{content:"\e253"} .glyphicon-console:before{content:"\e254"} .glyphicon-superscript:before{content:"\e255"} .glyphicon-subscript:before{content:"\e256"} .glyphicon-menu-left:before{content:"\e257"} .glyphicon-menu-right:before{content:"\e258"} .glyphicon-menu-down:before{content:"\e259"} .glyphicon-menu-up:before{content:"\e260"} *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} :after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)} body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff} button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit} a{color:#337ab7;text-decoration:none} a:focus,a:hover{color:#23527c;text-decoration:underline} a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px} figure{margin:0} img{vertical-align:middle} .carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto} .img-rounded{border-radius:6px} .img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out} .img-circle{border-radius:50%} hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee} .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0} .sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} [role=button]{cursor:pointer} .h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit} .h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777} .h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px} .h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%} .h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px} .h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%} .h1,h1{font-size:36px} .h2,h2{font-size:30px} .h3,h3{font-size:24px} .h4,h4{font-size:18px} .h5,h5{font-size:14px} .h6,h6{font-size:12px} p{margin:0 0 10px} .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}} .small,small{font-size:85%} .mark,mark{padding:.2em;background-color:#fcf8e3} .text-left{text-align:left} .text-right{text-align:right} .text-center{text-align:center} .text-justify{text-align:justify} .text-nowrap{white-space:nowrap} .text-lowercase{text-transform:lowercase} .text-uppercase{text-transform:uppercase} .text-capitalize{text-transform:capitalize} .text-muted{color:#777} .text-primary{color:#337ab7} a.text-primary:hover{color:#286090} .text-success{color:#3c763d} a.text-success:hover{color:#2b542c} .text-info{color:#31708f} a.text-info:hover{color:#245269} .text-warning{color:#8a6d3b} a.text-warning:hover{color:#66512c} .text-danger{color:#a94442} a.text-danger:hover{color:#843534} .bg-primary{color:#fff;background-color:#337ab7} a.bg-primary:hover{background-color:#286090} .bg-success{background-color:#dff0d8} a.bg-success:hover{background-color:#c1e2b3} .bg-info{background-color:#d9edf7} a.bg-info:hover{background-color:#afd9ee} .bg-warning{background-color:#fcf8e3} a.bg-warning:hover{background-color:#f7ecb5} .bg-danger{background-color:#f2dede} a.bg-danger:hover{background-color:#e4b9b9} .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee} ol,ul{margin-top:0;margin-bottom:10px} ol ol,ol ul,ul ol,ul ul{margin-bottom:0} .list-unstyled{padding-left:0;list-style:none} .list-inline{padding-left:0;margin-left:-5px;list-style:none} .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px} dl{margin-top:0;margin-bottom:20px} dd,dt{line-height:1.42857143} dt{font-weight:700} dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}} abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777} .initialism{font-size:90%;text-transform:uppercase} blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee} blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0} blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777} blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'} .blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0} .blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''} .blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'} address{margin-bottom:20px;font-style:normal;line-height:1.42857143} code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace} code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px} kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)} kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none} pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px} pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0} .pre-scrollable{max-height:340px;overflow-y:scroll} .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}} .container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto} .row{margin-right:-15px;margin-left:-15px} .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px} .col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left} .col-xs-12{width:100%} .col-xs-11{width:91.66666667%} .col-xs-10{width:83.33333333%} .col-xs-9{width:75%} .col-xs-8{width:66.66666667%} .col-xs-7{width:58.33333333%} .col-xs-6{width:50%} .col-xs-5{width:41.66666667%} .col-xs-4{width:33.33333333%} .col-xs-3{width:25%} .col-xs-2{width:16.66666667%} .col-xs-1{width:8.33333333%} .col-xs-pull-12{right:100%} .col-xs-pull-11{right:91.66666667%} .col-xs-pull-10{right:83.33333333%} .col-xs-pull-9{right:75%} .col-xs-pull-8{right:66.66666667%} .col-xs-pull-7{right:58.33333333%} .col-xs-pull-6{right:50%} .col-xs-pull-5{right:41.66666667%} .col-xs-pull-4{right:33.33333333%} .col-xs-pull-3{right:25%} .col-xs-pull-2{right:16.66666667%} .col-xs-pull-1{right:8.33333333%} .col-xs-pull-0{right:auto} .col-xs-push-12{left:100%} .col-xs-push-11{left:91.66666667%} .col-xs-push-10{left:83.33333333%} .col-xs-push-9{left:75%} .col-xs-push-8{left:66.66666667%} .col-xs-push-7{left:58.33333333%} .col-xs-push-6{left:50%} .col-xs-push-5{left:41.66666667%} .col-xs-push-4{left:33.33333333%} .col-xs-push-3{left:25%} .col-xs-push-2{left:16.66666667%} .col-xs-push-1{left:8.33333333%} .col-xs-push-0{left:auto} .col-xs-offset-12{margin-left:100%} .col-xs-offset-11{margin-left:91.66666667%} .col-xs-offset-10{margin-left:83.33333333%} .col-xs-offset-9{margin-left:75%} .col-xs-offset-8{margin-left:66.66666667%} .col-xs-offset-7{margin-left:58.33333333%} .col-xs-offset-6{margin-left:50%} .col-xs-offset-5{margin-left:41.66666667%} .col-xs-offset-4{margin-left:33.33333333%} .col-xs-offset-3{margin-left:25%} .col-xs-offset-2{margin-left:16.66666667%} .col-xs-offset-1{margin-left:8.33333333%} .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}} table{background-color:transparent} caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left} th{text-align:left} .table{width:100%;max-width:100%;margin-bottom:20px} .table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd} .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd} .table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0} .table>tbody+tbody{border-top:2px solid #ddd} .table .table{background-color:#fff} .table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px} .table-bordered{border:1px solid #ddd} .table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd} .table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px} .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9} .table-hover>tbody>tr:hover{background-color:#f5f5f5} table col[class*=col-]{position:static;display:table-column;float:none} table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none} .table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5} .table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8} .table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8} .table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6} .table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7} .table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3} .table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3} .table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc} .table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede} .table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc} .table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}} fieldset{min-width:0;padding:0;margin:0;border:0} legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5} label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700} input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal} input[type=file]{display:block} input[type=range]{display:block;width:100%} select[multiple],select[size]{height:auto} input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px} output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555} .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s} .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)} .form-control::-moz-placeholder{color:#999;opacity:1} .form-control:-ms-input-placeholder{color:#999} .form-control::-webkit-input-placeholder{color:#999} .form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1} .form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed} textarea.form-control{height:auto} input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}} .form-group{margin-bottom:15px} .checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px} .checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer} .checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px} .checkbox+.checkbox,.radio+.radio{margin-top:-5px} .checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer} .checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px} fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed} .checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed} .checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed} .form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0} .form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0} .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} select.input-sm{height:30px;line-height:30px} select[multiple].input-sm,textarea.input-sm{height:auto} .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} select.form-group-sm .form-control{height:30px;line-height:30px} select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto} .form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5} .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} select.input-lg{height:46px;line-height:46px} select[multiple].input-lg,textarea.input-lg{height:auto} .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} select.form-group-lg .form-control{height:46px;line-height:46px} select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto} .form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333} .has-feedback{position:relative} .has-feedback .form-control{padding-right:42.5px} .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none} .input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px} .input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px} .has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d} .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168} .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d} .has-success .form-control-feedback{color:#3c763d} .has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b} .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b} .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b} .has-warning .form-control-feedback{color:#8a6d3b} .has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442} .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)} .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483} .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442} .has-error .form-control-feedback{color:#a94442} .has-feedback label~.form-control-feedback{top:25px} .has-feedback label.sr-only~.form-control-feedback{top:0} .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}} .form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0} .form-horizontal .checkbox,.form-horizontal .radio{min-height:27px} .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}} .form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}} .btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px} .btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px} .btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none} .btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} .btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65} .btn-default{color:#333;background-color:#fff;border-color:#ccc} .btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad} .btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none} .btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc} .btn-default .badge{color:#fff;background-color:#333} .btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4} .btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74} .btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none} .btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4} .btn-primary .badge{color:#337ab7;background-color:#fff} .btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c} .btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439} .btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none} .btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c} .btn-success .badge{color:#5cb85c;background-color:#fff} .btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da} .btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc} .btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none} .btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da} .btn-info .badge{color:#5bc0de;background-color:#fff} .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236} .btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512} .btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none} .btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236} .btn-warning .badge{color:#f0ad4e;background-color:#fff} .btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a} .btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925} .btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none} .btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a} .btn-danger .badge{color:#d9534f;background-color:#fff} .btn-link{font-weight:400;color:#337ab7;border-radius:0} .btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none} .btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent} .btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent} .btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none} .btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} .btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} .btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px} .btn-block{display:block;width:100%} .btn-block+.btn-block{margin-top:5px} input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%} .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear} .fade.in{opacity:1} .collapse{display:none} .collapse.in{display:block} tr.collapse.in{display:table-row} tbody.collapse.in{display:table-row-group} .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility} .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent} .dropdown,.dropup{position:relative} .dropdown-toggle:focus{outline:0} .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)} .dropdown-menu.pull-right{right:0;left:auto} .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap} .dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5} .dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0} .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777} .dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)} .open>.dropdown-menu{display:block} .open>a{outline:0} .dropdown-menu-right{right:0;left:auto} .dropdown-menu-left{right:auto;left:0} .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap} .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990} .pull-right>.dropdown-menu{right:0;left:auto} .dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid} .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}} .btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle} .btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left} .btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2} .btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px} .btn-toolbar{margin-left:-5px} .btn-toolbar .btn-group,.btn-toolbar .input-group{float:left} .btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px} .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0} .btn-group>.btn:first-child{margin-left:0} .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0} .btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0} .btn-group>.btn-group{float:left} .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0} .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0} .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0} .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0} .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px} .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px} .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none} .btn .caret{margin-left:0} .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0} .dropup .btn-lg .caret{border-width:0 5px 5px} .btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%} .btn-group-vertical>.btn-group>.btn{float:none} .btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0} .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0} .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0} .btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px} .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0} .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0} .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0} .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate} .btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%} .btn-group-justified>.btn-group .btn{width:100%} .btn-group-justified>.btn-group .dropdown-menu{left:auto} [data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none} .input-group{position:relative;display:table;border-collapse:separate} .input-group[class*=col-]{float:none;padding-right:0;padding-left:0} .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0} .input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px} select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px} select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto} .input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px} select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px} select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto} .input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell} .input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0} .input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle} .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px} .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px} .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px} .input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0} .input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0} .input-group-addon:first-child{border-right:0} .input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0} .input-group-addon:last-child{border-left:0} .input-group-btn{position:relative;font-size:0;white-space:nowrap} .input-group-btn>.btn{position:relative} .input-group-btn>.btn+.btn{margin-left:-1px} .input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2} .input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px} .input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px} .nav{padding-left:0;margin-bottom:0;list-style:none} .nav>li{position:relative;display:block} .nav>li>a{position:relative;display:block;padding:10px 15px} .nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee} .nav>li.disabled>a{color:#777} .nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent} .nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7} .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5} .nav>li>a>img{max-width:none} .nav-tabs{border-bottom:1px solid #ddd} .nav-tabs>li{float:left;margin-bottom:-1px} .nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0} .nav-tabs>li>a:hover{border-color:#eee #eee #ddd} .nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent} .nav-tabs.nav-justified{width:100%;border-bottom:0} .nav-tabs.nav-justified>li{float:none} .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center} .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}} .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px} .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}} .nav-pills>li{float:left} .nav-pills>li>a{border-radius:4px} .nav-pills>li+li{margin-left:2px} .nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7} .nav-stacked>li{float:none} .nav-stacked>li+li{margin-top:2px;margin-left:0} .nav-justified{width:100%} .nav-justified>li{float:none} .nav-justified>li>a{margin-bottom:5px;text-align:center} .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}} .nav-tabs-justified{border-bottom:0} .nav-tabs-justified>li>a{margin-right:0;border-radius:4px} .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}} .tab-content>.tab-pane{display:none} .tab-content>.active{display:block} .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0} .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}} .navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)} .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}} .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}} .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}} .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}} .navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}} .navbar-fixed-top{top:0;border-width:0 0 1px} .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0} .navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px} .navbar-brand:focus,.navbar-brand:hover{text-decoration:none} .navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}} .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px} .navbar-toggle:focus{outline:0} .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px} .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}} .navbar-nav{margin:7.5px -15px} .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}} .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}} .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0} .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0} .navbar-btn{margin-top:8px;margin-bottom:8px} .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px} .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px} .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}} .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7} .navbar-default .navbar-brand{color:#777} .navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent} .navbar-default .navbar-text{color:#777} .navbar-default .navbar-nav>li>a{color:#777} .navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent} .navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7} .navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent} .navbar-default .navbar-toggle{border-color:#ddd} .navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd} .navbar-default .navbar-toggle .icon-bar{background-color:#888} .navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7} .navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}} .navbar-default .navbar-link{color:#777} .navbar-default .navbar-link:hover{color:#333} .navbar-default .btn-link{color:#777} .navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333} .navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc} .navbar-inverse{background-color:#222;border-color:#080808} .navbar-inverse .navbar-brand{color:#9d9d9d} .navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent} .navbar-inverse .navbar-text{color:#9d9d9d} .navbar-inverse .navbar-nav>li>a{color:#9d9d9d} .navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent} .navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808} .navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent} .navbar-inverse .navbar-toggle{border-color:#333} .navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333} .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff} .navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010} .navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}} .navbar-inverse .navbar-link{color:#9d9d9d} .navbar-inverse .navbar-link:hover{color:#fff} .navbar-inverse .btn-link{color:#9d9d9d} .navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff} .navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444} .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px} .breadcrumb>li{display:inline-block} .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"} .breadcrumb>.active{color:#777} .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px} .pagination>li{display:inline} .pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd} .pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px} .pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px} .pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd} .pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7} .pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd} .pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px} .pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px} .pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px} .pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px} .pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px} .pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px} .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none} .pager li{display:inline} .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px} .pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee} .pager .next>a,.pager .next>span{float:right} .pager .previous>a,.pager .previous>span{float:left} .pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff} .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em} a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer} .label:empty{display:none} .btn .label{position:relative;top:-1px} .label-default{background-color:#777} .label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e} .label-primary{background-color:#337ab7} .label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090} .label-success{background-color:#5cb85c} .label-success[href]:focus,.label-success[href]:hover{background-color:#449d44} .label-info{background-color:#5bc0de} .label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5} .label-warning{background-color:#f0ad4e} .label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f} .label-danger{background-color:#d9534f} .label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c} .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px} .badge:empty{display:none} .btn .badge{position:relative;top:-1px} .btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px} a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer} .list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff} .list-group-item>.badge{float:right} .list-group-item>.badge+.badge{margin-right:5px} .nav-pills>li>a>.badge{margin-left:3px} .jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee} .jumbotron .h1,.jumbotron h1{color:inherit} .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200} .jumbotron>hr{border-top-color:#d5d5d5} .container .jumbotron,.container-fluid .jumbotron{border-radius:6px} .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}} .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out} .thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto} a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7} .thumbnail .caption{padding:9px;color:#333} .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px} .alert h4{margin-top:0;color:inherit} .alert .alert-link{font-weight:700} .alert>p,.alert>ul{margin-bottom:0} .alert>p+p{margin-top:5px} .alert-dismissable,.alert-dismissible{padding-right:35px} .alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit} .alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6} .alert-success hr{border-top-color:#c9e2b3} .alert-success .alert-link{color:#2b542c} .alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1} .alert-info hr{border-top-color:#a6e1ec} .alert-info .alert-link{color:#245269} .alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc} .alert-warning hr{border-top-color:#f7e1b5} .alert-warning .alert-link{color:#66512c} .alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1} .alert-danger hr{border-top-color:#e4b9c0} .alert-danger .alert-link{color:#843534} @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}} @-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}} @keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}} .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)} .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease} .progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px} .progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite} .progress-bar-success{background-color:#5cb85c} .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} .progress-bar-info{background-color:#5bc0de} .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} .progress-bar-warning{background-color:#f0ad4e} .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} .progress-bar-danger{background-color:#d9534f} .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)} .media{margin-top:15px} .media:first-child{margin-top:0} .media,.media-body{overflow:hidden;zoom:1} .media-body{width:10000px} .media-object{display:block} .media-right,.media>.pull-right{padding-left:10px} .media-left,.media>.pull-left{padding-right:10px} .media-body,.media-left,.media-right{display:table-cell;vertical-align:top} .media-middle{vertical-align:middle} .media-bottom{vertical-align:bottom} .media-heading{margin-top:0;margin-bottom:5px} .media-list{padding-left:0;list-style:none} .list-group{padding-left:0;margin-bottom:20px} .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd} .list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px} .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} a.list-group-item{color:#555} a.list-group-item .list-group-item-heading{color:#333} a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5} .list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee} .list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit} .list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777} .list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7} .list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit} .list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef} .list-group-item-success{color:#3c763d;background-color:#dff0d8} a.list-group-item-success{color:#3c763d} a.list-group-item-success .list-group-item-heading{color:inherit} a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6} a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d} .list-group-item-info{color:#31708f;background-color:#d9edf7} a.list-group-item-info{color:#31708f} a.list-group-item-info .list-group-item-heading{color:inherit} a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3} a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f} .list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3} a.list-group-item-warning{color:#8a6d3b} a.list-group-item-warning .list-group-item-heading{color:inherit} a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc} a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b} .list-group-item-danger{color:#a94442;background-color:#f2dede} a.list-group-item-danger{color:#a94442} a.list-group-item-danger .list-group-item-heading{color:inherit} a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc} a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442} .list-group-item-heading{margin-top:0;margin-bottom:5px} .list-group-item-text{margin-bottom:0;line-height:1.3} .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)} .panel-body{padding:15px} .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px} .panel-heading>.dropdown .dropdown-toggle{color:inherit} .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit} .panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit} .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px} .panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0} .panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0} .panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px} .panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px} .panel-heading+.list-group .list-group-item:first-child{border-top-width:0} .list-group+.panel-footer{border-top-width:0} .panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0} .panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px} .panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px} .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px} .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px} .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px} .panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px} .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px} .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px} .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px} .panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd} .panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0} .panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0} .panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0} .panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0} .panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0} .panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0} .panel>.table-responsive{margin-bottom:0;border:0} .panel-group{margin-bottom:20px} .panel-group .panel{margin-bottom:0;border-radius:4px} .panel-group .panel+.panel{margin-top:5px} .panel-group .panel-heading{border-bottom:0} .panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd} .panel-group .panel-footer{border-top:0} .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd} .panel-default{border-color:#ddd} .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd} .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd} .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333} .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd} .panel-primary{border-color:#337ab7} .panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7} .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7} .panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff} .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7} .panel-success{border-color:#d6e9c6} .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6} .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6} .panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d} .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6} .panel-info{border-color:#bce8f1} .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1} .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1} .panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f} .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1} .panel-warning{border-color:#faebcc} .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc} .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc} .panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b} .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc} .panel-danger{border-color:#ebccd1} .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1} .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1} .panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442} .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1} .embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden} .embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0} .embed-responsive-16by9{padding-bottom:56.25%} .embed-responsive-4by3{padding-bottom:75%} .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)} .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)} .well-lg{padding:24px;border-radius:6px} .well-sm{padding:9px;border-radius:3px} .close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2} .close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5} button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0} .modal-open{overflow:hidden} .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0} .modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)} .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)} .modal-open .modal{overflow-x:hidden;overflow-y:auto} .modal-dialog{position:relative;width:auto;margin:10px} .modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)} .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000} .modal-backdrop.fade{filter:alpha(opacity=0);opacity:0} .modal-backdrop.in{filter:alpha(opacity=50);opacity:.5} .modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5} .modal-header .close{margin-top:-2px} .modal-title{margin:0;line-height:1.42857143} .modal-body{position:relative;padding:15px} .modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5} .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px} .modal-footer .btn-group .btn+.btn{margin-left:-1px} .modal-footer .btn-block+.btn-block{margin-left:0} .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}} .tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0} .tooltip.in{filter:alpha(opacity=90);opacity:.9} .tooltip.top{padding:5px 0;margin-top:-3px} .tooltip.right{padding:0 5px;margin-left:3px} .tooltip.bottom{padding:5px 0;margin-top:3px} .tooltip.left{padding:0 5px;margin-left:-3px} .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px} .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid} .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000} .tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000} .tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000} .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000} .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000} .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000} .tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000} .tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000} .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)} .popover.top{margin-top:-10px} .popover.right{margin-left:10px} .popover.bottom{margin-top:10px} .popover.left{margin-left:-10px} .popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0} .popover-content{padding:9px 14px} .popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid} .popover>.arrow{border-width:11px} .popover>.arrow:after{content:"";border-width:10px} .popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0} .popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0} .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0} .popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0} .popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)} .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff} .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)} .popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff} .carousel{position:relative} .carousel-inner{position:relative;width:100%;overflow:hidden} .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left} .carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}} .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block} .carousel-inner>.active{left:0} .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%} .carousel-inner>.next{left:100%} .carousel-inner>.prev{left:-100%} .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0} .carousel-inner>.active.left{left:-100%} .carousel-inner>.active.right{left:100%} .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5} .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x} .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x} .carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9} .carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block} .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px} .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px} .carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1} .carousel-control .icon-prev:before{content:'\2039'} .carousel-control .icon-next:before{content:'\203a'} .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none} .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px} .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff} .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)} .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}} .btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "} .btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both} .center-block{display:block;margin-right:auto;margin-left:auto} .pull-right{float:right!important} .pull-left{float:left!important} .hide{display:none!important} .show{display:block!important} .invisible{visibility:hidden} .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0} .hidden{display:none!important} .affix{position:fixed}@-ms-viewport{width:device-width} .visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important} .visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}} .visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}} .visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}} .visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}} .visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css b/src/Report/Html/Renderer/Template/css/nv.d3.min.css similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/css/nv.d3.min.css rename to src/Report/Html/Renderer/Template/css/nv.d3.min.css diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/css/style.css b/src/Report/Html/Renderer/Template/css/style.css similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/css/style.css rename to src/Report/Html/Renderer/Template/css/style.css diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist b/src/Report/Html/Renderer/Template/dashboard.html.dist similarity index 97% rename from src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist rename to src/Report/Html/Renderer/Template/dashboard.html.dist index ed1898867..06fc0052b 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist +++ b/src/Report/Html/Renderer/Template/dashboard.html.dist @@ -134,7 +134,7 @@ diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist b/src/Report/Html/Renderer/Template/directory.html.dist similarity index 90% rename from src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist rename to src/Report/Html/Renderer/Template/directory.html.dist index efe743f51..60c41070f 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist +++ b/src/Report/Html/Renderer/Template/directory.html.dist @@ -50,7 +50,7 @@ High: {{high_lower_bound}}% to 100%

    - Generated by PHP_CodeCoverage {{version}} using {{runtime_name}} {{runtime_version}}{{generator}} at {{date}}. + Generated by php-code-coverage {{version}} using {{runtime_name}} {{runtime_version}}{{generator}} at {{date}}.

    diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist b/src/Report/Html/Renderer/Template/directory_item.html.dist similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist rename to src/Report/Html/Renderer/Template/directory_item.html.dist diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist b/src/Report/Html/Renderer/Template/file.html.dist similarity index 93% rename from src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist rename to src/Report/Html/Renderer/Template/file.html.dist index 59a068430..93039e3bd 100644 --- a/src/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist +++ b/src/Report/Html/Renderer/Template/file.html.dist @@ -55,7 +55,7 @@ Dead Code

    - Generated by PHP_CodeCoverage {{version}} using {{runtime_name}} {{runtime_version}}{{generator}} at {{date}}. + Generated by php-code-coverage {{version}} using {{runtime_name}} {{runtime_version}}{{generator}} at {{date}}.

    diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist b/src/Report/Html/Renderer/Template/file_item.html.dist similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist rename to src/Report/Html/Renderer/Template/file_item.html.dist diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eot b/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.eot rename to src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.eot diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.svg b/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.svg rename to src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.svg diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf b/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.ttf rename to src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.ttf diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff b/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff rename to src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 b/src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 rename to src/Report/Html/Renderer/Template/fonts/glyphicons-halflings-regular.woff2 diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js b/src/Report/Html/Renderer/Template/js/bootstrap.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js rename to src/Report/Html/Renderer/Template/js/bootstrap.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.js b/src/Report/Html/Renderer/Template/js/d3.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/d3.min.js rename to src/Report/Html/Renderer/Template/js/d3.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js b/src/Report/Html/Renderer/Template/js/holder.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/holder.min.js rename to src/Report/Html/Renderer/Template/js/holder.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.min.js b/src/Report/Html/Renderer/Template/js/html5shiv.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.min.js rename to src/Report/Html/Renderer/Template/js/html5shiv.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js b/src/Report/Html/Renderer/Template/js/jquery.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js rename to src/Report/Html/Renderer/Template/js/jquery.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/nv.d3.min.js b/src/Report/Html/Renderer/Template/js/nv.d3.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/nv.d3.min.js rename to src/Report/Html/Renderer/Template/js/nv.d3.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/js/respond.min.js b/src/Report/Html/Renderer/Template/js/respond.min.js similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/js/respond.min.js rename to src/Report/Html/Renderer/Template/js/respond.min.js diff --git a/src/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.dist b/src/Report/Html/Renderer/Template/method_item.html.dist similarity index 100% rename from src/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.dist rename to src/Report/Html/Renderer/Template/method_item.html.dist diff --git a/src/CodeCoverage/Report/PHP.php b/src/Report/PHP.php similarity index 63% rename from src/CodeCoverage/Report/PHP.php rename to src/Report/PHP.php index 2466548a0..0adb0a383 100644 --- a/src/CodeCoverage/Report/PHP.php +++ b/src/Report/PHP.php @@ -1,6 +1,6 @@ * @@ -8,26 +8,28 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\CodeCoverage; + /** - * Uses var_export() to write a PHP_CodeCoverage object to a file. - * - * @since Class available since Release 1.1.0 + * Uses var_export() to write a SebastianBergmann\CodeCoverage\CodeCoverage object to a file. */ -class PHP_CodeCoverage_Report_PHP +class PHP { /** - * @param PHP_CodeCoverage $coverage - * @param string $target + * @param CodeCoverage $coverage + * @param string $target * * @return string */ - public function process(PHP_CodeCoverage $coverage, $target = null) + public function process(CodeCoverage $coverage, $target = null) { $filter = $coverage->filter(); $output = sprintf( 'setData(%s); $coverage->setTests(%s); diff --git a/src/CodeCoverage/Report/Text.php b/src/Report/Text.php similarity index 89% rename from src/CodeCoverage/Report/Text.php rename to src/Report/Text.php index 179966966..08ae0ea26 100644 --- a/src/CodeCoverage/Report/Text.php +++ b/src/Report/Text.php @@ -1,6 +1,6 @@ * @@ -8,21 +8,25 @@ * 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 an PHP_CodeCoverage object. + * Generates human readable output from a code coverage object. * * The output gets put into a text file our written to the CLI. - * - * @since Class available since Release 1.1.0 */ -class PHP_CodeCoverage_Report_Text +class Text { - protected $lowUpperBound; - protected $highLowerBound; - protected $showUncoveredFiles; - protected $showOnlySummary; + private $lowUpperBound; + private $highLowerBound; + private $showUncoveredFiles; + private $showOnlySummary; - protected $colors = [ + private $colors = [ 'green' => "\x1b[30;42m", 'yellow' => "\x1b[30;43m", 'red' => "\x1b[37;41m", @@ -40,12 +44,12 @@ public function __construct($lowUpperBound, $highLowerBound, $showUncoveredFiles } /** - * @param PHP_CodeCoverage $coverage - * @param bool $showColors + * @param CodeCoverage $coverage + * @param bool $showColors * * @return string */ - public function process(PHP_CodeCoverage $coverage, $showColors = false) + public function process(CodeCoverage $coverage, $showColors = false) { $output = PHP_EOL . PHP_EOL; $report = $coverage->getReport(); @@ -80,7 +84,7 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $classes = sprintf( ' Classes: %6s (%d/%d)', - PHP_CodeCoverage_Util::percent( + Util::percent( $report->getNumTestedClassesAndTraits(), $report->getNumClassesAndTraits(), true @@ -91,7 +95,7 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $methods = sprintf( ' Methods: %6s (%d/%d)', - PHP_CodeCoverage_Util::percent( + Util::percent( $report->getNumTestedMethods(), $report->getNumMethods(), true @@ -102,7 +106,7 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $lines = sprintf( ' Lines: %6s (%d/%d)', - PHP_CodeCoverage_Util::percent( + Util::percent( $report->getNumExecutedLines(), $report->getNumExecutableLines(), true @@ -139,11 +143,11 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) $classCoverage = []; foreach ($report as $item) { - if (!$item instanceof PHP_CodeCoverage_Report_Node_File) { + if (!$item instanceof File) { continue; } - $classes = $item->getClassesAndTraits(); + $classes = $item->getClassesAndTraits(); foreach ($classes as $className => $class) { $classStatements = 0; @@ -210,7 +214,7 @@ public function process(PHP_CodeCoverage $coverage, $showColors = false) protected function getCoverageColor($numberOfCoveredElements, $totalNumberOfElements) { - $coverage = PHP_CodeCoverage_Util::percent( + $coverage = Util::percent( $numberOfCoveredElements, $totalNumberOfElements ); @@ -228,7 +232,7 @@ protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfE { $format = '%' . $precision . 's'; - return PHP_CodeCoverage_Util::percent( + return Util::percent( $numberOfCoveredElements, $totalNumberOfElements, true, diff --git a/src/CodeCoverage/Report/XML/File/Coverage.php b/src/Report/Xml/Coverage.php similarity index 74% rename from src/CodeCoverage/Report/XML/File/Coverage.php rename to src/Report/Xml/Coverage.php index 964924826..1a65fbe2e 100644 --- a/src/CodeCoverage/Report/XML/File/Coverage.php +++ b/src/Report/Xml/Coverage.php @@ -1,6 +1,6 @@ * @@ -8,18 +8,19 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_File_Coverage +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\RuntimeException; + +class Coverage { /** - * @var XMLWriter + * @var \XMLWriter */ private $writer; /** - * @var DOMElement + * @var \DOMElement */ private $contextNode; @@ -28,11 +29,11 @@ class PHP_CodeCoverage_Report_XML_File_Coverage */ private $finalized = false; - public function __construct(DOMElement $context, $line) + public function __construct(\DOMElement $context, $line) { $this->contextNode = $context; - $this->writer = new XMLWriter(); + $this->writer = new \XMLWriter; $this->writer->openMemory(); $this->writer->startElementNs(null, $context->nodeName, 'http://schema.phpunit.de/coverage/1.0'); $this->writer->writeAttribute('nr', $line); @@ -41,7 +42,7 @@ public function __construct(DOMElement $context, $line) public function addTest($test) { if ($this->finalized) { - throw new PHP_CodeCoverage_RuntimeException('Coverage Report already finalized'); + throw new RuntimeException('Coverage Report already finalized'); } $this->writer->startElement('covered'); diff --git a/src/Report/Xml/Directory.php b/src/Report/Xml/Directory.php new file mode 100644 index 000000000..71d5a40ca --- /dev/null +++ b/src/Report/Xml/Directory.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Directory extends Node +{ +} diff --git a/src/CodeCoverage/Report/XML.php b/src/Report/Xml/Facade.php similarity index 75% rename from src/CodeCoverage/Report/XML.php rename to src/Report/Xml/Facade.php index ebdd7e284..34c8ad52f 100644 --- a/src/CodeCoverage/Report/XML.php +++ b/src/Report/Xml/Facade.php @@ -1,6 +1,6 @@ * @@ -8,10 +8,15 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\AbstractNode; +use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use SebastianBergmann\CodeCoverage\Node\File as FileNode; +use SebastianBergmann\CodeCoverage\RuntimeException; + +class Facade { /** * @var string @@ -19,11 +24,17 @@ class PHP_CodeCoverage_Report_XML private $target; /** - * @var PHP_CodeCoverage_Report_XML_Project + * @var Project */ private $project; - public function process(PHP_CodeCoverage $coverage, $target) + /** + * @param CodeCoverage $coverage + * @param string $target + * + * @throws RuntimeException + */ + public function process(CodeCoverage $coverage, $target) { if (substr($target, -1, 1) != DIRECTORY_SEPARATOR) { $target .= DIRECTORY_SEPARATOR; @@ -34,7 +45,7 @@ public function process(PHP_CodeCoverage $coverage, $target) $report = $coverage->getReport(); - $this->project = new PHP_CodeCoverage_Report_XML_Project( + $this->project = new Project( $coverage->getReport()->getName() ); @@ -47,51 +58,54 @@ public function process(PHP_CodeCoverage $coverage, $target) $index->save($target . '/index.xml'); } - private function initTargetDirectory($dir) + /** + * @param string $directory + */ + private function initTargetDirectory($directory) { - if (file_exists($dir)) { - if (!is_dir($dir)) { - throw new PHP_CodeCoverage_RuntimeException( - "'$dir' exists but is not a directory." + if (file_exists($directory)) { + if (!is_dir($directory)) { + throw new RuntimeException( + "'$directory' exists but is not a directory." ); } - if (!is_writable($dir)) { - throw new PHP_CodeCoverage_RuntimeException( - "'$dir' exists but is not writable." + if (!is_writable($directory)) { + throw new RuntimeException( + "'$directory' exists but is not writable." ); } - } elseif (!@mkdir($dir, 0777, true)) { - throw new PHP_CodeCoverage_RuntimeException( - "'$dir' could not be created." + } elseif (!@mkdir($directory, 0777, true)) { + throw new RuntimeException( + "'$directory' could not be created." ); } } - private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context) + private function processDirectory(DirectoryNode $directory, Node $context) { $dirObject = $context->addDirectory($directory->getName()); $this->setTotals($directory, $dirObject->getTotals()); foreach ($directory as $node) { - if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { + if ($node instanceof DirectoryNode) { $this->processDirectory($node, $dirObject); continue; } - if ($node instanceof PHP_CodeCoverage_Report_Node_File) { + if ($node instanceof FileNode) { $this->processFile($node, $dirObject); continue; } - throw new PHP_CodeCoverage_RuntimeException( + throw new RuntimeException( 'Unknown node type for XML report' ); } } - private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context) + private function processFile(FileNode $file, Directory $context) { $fileObject = $context->addFile( $file->getName(), @@ -100,9 +114,7 @@ private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCo $this->setTotals($file, $fileObject->getTotals()); - $fileReport = new PHP_CodeCoverage_Report_XML_File_Report( - $file->getName() - ); + $fileReport = new Report($file->getName()); $this->setTotals($file, $fileReport->getTotals()); @@ -138,7 +150,7 @@ private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCo $fileDom->save($this->target . $file->getId() . '.xml'); } - private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report) + private function processUnit($unit, Report $report) { if (isset($unit['className'])) { $unitObject = $report->getClassObject($unit['className']); @@ -176,7 +188,7 @@ private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $rep } } - private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report) + private function processFunction($function, Report $report) { $functionObject = $report->getFunctionObject($function['functionName']); @@ -199,7 +211,7 @@ private function processTests(array $tests) } } - private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals) + private function setTotals(AbstractNode $node, Totals $totals) { $loc = $node->getLinesOfCode(); diff --git a/src/CodeCoverage/Report/XML/File.php b/src/Report/Xml/File.php similarity index 78% rename from src/CodeCoverage/Report/XML/File.php rename to src/Report/Xml/File.php index 3c72bab20..5d6d71dec 100644 --- a/src/CodeCoverage/Report/XML/File.php +++ b/src/Report/Xml/File.php @@ -1,6 +1,6 @@ * @@ -8,22 +8,21 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_File +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class File { /** - * @var DOMDocument + * @var \DOMDocument */ protected $dom; /** - * @var DOMElement + * @var \DOMElement */ protected $contextNode; - public function __construct(DOMElement $context) + public function __construct(\DOMElement $context) { $this->dom = $context->ownerDocument; $this->contextNode = $context; @@ -42,7 +41,7 @@ public function getTotals() ); } - return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer); + return new Totals($totalsContainer); } public function getLineCoverage($line) @@ -68,6 +67,6 @@ public function getLineCoverage($line) ) ); - return new PHP_CodeCoverage_Report_XML_File_Coverage($lineNode, $line); + return new Coverage($lineNode, $line); } } diff --git a/src/CodeCoverage/Report/XML/File/Method.php b/src/Report/Xml/Method.php similarity index 83% rename from src/CodeCoverage/Report/XML/File/Method.php rename to src/Report/Xml/Method.php index 917628fd1..10eb762fd 100644 --- a/src/CodeCoverage/Report/XML/File/Method.php +++ b/src/Report/Xml/Method.php @@ -1,6 +1,6 @@ * @@ -8,17 +8,16 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_File_Method +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Method { /** - * @var DOMElement + * @var \DOMElement */ private $contextNode; - public function __construct(DOMElement $context, $name) + public function __construct(\DOMElement $context, $name) { $this->contextNode = $context; diff --git a/src/CodeCoverage/Report/XML/Node.php b/src/Report/Xml/Node.php similarity index 76% rename from src/CodeCoverage/Report/XML/Node.php rename to src/Report/Xml/Node.php index 43dda57ce..43776f1d0 100644 --- a/src/CodeCoverage/Report/XML/Node.php +++ b/src/Report/Xml/Node.php @@ -1,6 +1,6 @@ * @@ -8,27 +8,26 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_Node +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Node { /** - * @var DOMDocument + * @var \DOMDocument */ private $dom; /** - * @var DOMElement + * @var \DOMElement */ private $contextNode; - public function __construct(DOMElement $context) + public function __construct(\DOMElement $context) { $this->setContextNode($context); } - protected function setContextNode(DOMElement $context) + protected function setContextNode(\DOMElement $context) { $this->dom = $context->ownerDocument; $this->contextNode = $context; @@ -57,7 +56,7 @@ public function getTotals() ); } - return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer); + return new Totals($totalsContainer); } public function addDirectory($name) @@ -70,7 +69,7 @@ public function addDirectory($name) $dirNode->setAttribute('name', $name); $this->getContextNode()->appendChild($dirNode); - return new PHP_CodeCoverage_Report_XML_Directory($dirNode); + return new Directory($dirNode); } public function addFile($name, $href) @@ -84,6 +83,6 @@ public function addFile($name, $href) $fileNode->setAttribute('href', $href); $this->getContextNode()->appendChild($fileNode); - return new PHP_CodeCoverage_Report_XML_File($fileNode); + return new File($fileNode); } } diff --git a/src/CodeCoverage/Report/XML/Project.php b/src/Report/Xml/Project.php similarity index 82% rename from src/CodeCoverage/Report/XML/Project.php rename to src/Report/Xml/Project.php index b8dae04d1..17bf1e66e 100644 --- a/src/CodeCoverage/Report/XML/Project.php +++ b/src/Report/Xml/Project.php @@ -1,6 +1,6 @@ * @@ -8,10 +8,9 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_Project extends PHP_CodeCoverage_Report_XML_Node +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Project extends Node { public function __construct($name) { @@ -21,7 +20,7 @@ public function __construct($name) private function init() { - $dom = new DOMDocument; + $dom = new \DOMDocument; $dom->loadXML(''); $this->setContextNode( @@ -53,7 +52,7 @@ public function getTests() ); } - return new PHP_CodeCoverage_Report_XML_Tests($testsNode); + return new Tests($testsNode); } public function asDom() diff --git a/src/CodeCoverage/Report/XML/File/Report.php b/src/Report/Xml/Report.php similarity index 79% rename from src/CodeCoverage/Report/XML/File/Report.php rename to src/Report/Xml/Report.php index a6fe7ecf0..4c3e3e55b 100644 --- a/src/CodeCoverage/Report/XML/File/Report.php +++ b/src/Report/Xml/Report.php @@ -1,6 +1,6 @@ * @@ -8,14 +8,13 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_File_Report extends PHP_CodeCoverage_Report_XML_File +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Report extends File { public function __construct($name) { - $this->dom = new DOMDocument; + $this->dom = new \DOMDocument; $this->dom->loadXML(''); $this->contextNode = $this->dom->getElementsByTagNameNS( @@ -45,7 +44,7 @@ public function getFunctionObject($name) ) ); - return new PHP_CodeCoverage_Report_XML_File_Method($node, $name); + return new Method($node, $name); } public function getClassObject($name) @@ -67,6 +66,6 @@ private function getUnitObject($tagName, $name) ) ); - return new PHP_CodeCoverage_Report_XML_File_Unit($node, $name); + return new Unit($node, $name); } } diff --git a/src/CodeCoverage/Report/XML/Tests.php b/src/Report/Xml/Tests.php similarity index 86% rename from src/CodeCoverage/Report/XML/Tests.php rename to src/Report/Xml/Tests.php index 8ff352c30..5ce20714a 100644 --- a/src/CodeCoverage/Report/XML/Tests.php +++ b/src/Report/Xml/Tests.php @@ -1,6 +1,6 @@ * @@ -8,10 +8,9 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_Tests +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Tests { private $contextNode; @@ -24,7 +23,7 @@ class PHP_CodeCoverage_Report_XML_Tests 5 => 'RISKY' // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY ]; - public function __construct(DOMElement $context) + public function __construct(\DOMElement $context) { $this->contextNode = $context; } @@ -37,6 +36,7 @@ public function addTest($test, array $result) 'test' ) ); + $node->setAttribute('name', $test); $node->setAttribute('size', $result['size']); $node->setAttribute('result', (int) $result['status']); diff --git a/src/CodeCoverage/Report/XML/Totals.php b/src/Report/Xml/Totals.php similarity index 82% rename from src/CodeCoverage/Report/XML/Totals.php rename to src/Report/Xml/Totals.php index d6073d95f..a1eaa9e3a 100644 --- a/src/CodeCoverage/Report/XML/Totals.php +++ b/src/Report/Xml/Totals.php @@ -1,6 +1,6 @@ * @@ -8,42 +8,43 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_Totals +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\Util; + +class Totals { /** - * @var DOMNode + * @var \DOMNode */ private $container; /** - * @var DOMElement + * @var \DOMElement */ private $linesNode; /** - * @var DOMElement + * @var \DOMElement */ private $methodsNode; /** - * @var DOMElement + * @var \DOMElement */ private $functionsNode; /** - * @var DOMElement + * @var \DOMElement */ private $classesNode; /** - * @var DOMElement + * @var \DOMElement */ private $traitsNode; - public function __construct(DOMElement $container) + public function __construct(\DOMElement $container) { $this->container = $container; $dom = $container->ownerDocument; @@ -94,7 +95,7 @@ public function setNumLines($loc, $cloc, $ncloc, $executable, $executed) $this->linesNode->setAttribute('executed', $executed); $this->linesNode->setAttribute( 'percent', - PHP_CodeCoverage_Util::percent($executed, $executable, true) + Util::percent($executed, $executable, true) ); } @@ -104,7 +105,7 @@ public function setNumClasses($count, $tested) $this->classesNode->setAttribute('tested', $tested); $this->classesNode->setAttribute( 'percent', - PHP_CodeCoverage_Util::percent($tested, $count, true) + Util::percent($tested, $count, true) ); } @@ -114,7 +115,7 @@ public function setNumTraits($count, $tested) $this->traitsNode->setAttribute('tested', $tested); $this->traitsNode->setAttribute( 'percent', - PHP_CodeCoverage_Util::percent($tested, $count, true) + Util::percent($tested, $count, true) ); } @@ -124,7 +125,7 @@ public function setNumMethods($count, $tested) $this->methodsNode->setAttribute('tested', $tested); $this->methodsNode->setAttribute( 'percent', - PHP_CodeCoverage_Util::percent($tested, $count, true) + Util::percent($tested, $count, true) ); } @@ -134,7 +135,7 @@ public function setNumFunctions($count, $tested) $this->functionsNode->setAttribute('tested', $tested); $this->functionsNode->setAttribute( 'percent', - PHP_CodeCoverage_Util::percent($tested, $count, true) + Util::percent($tested, $count, true) ); } } diff --git a/src/CodeCoverage/Report/XML/File/Unit.php b/src/Report/Xml/Unit.php similarity index 88% rename from src/CodeCoverage/Report/XML/File/Unit.php rename to src/Report/Xml/Unit.php index 769d9dabb..854f84483 100644 --- a/src/CodeCoverage/Report/XML/File/Unit.php +++ b/src/Report/Xml/Unit.php @@ -1,6 +1,6 @@ * @@ -8,17 +8,16 @@ * file that was distributed with this source code. */ -/** - * @since Class available since Release 2.0.0 - */ -class PHP_CodeCoverage_Report_XML_File_Unit +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class Unit { /** - * @var DOMElement + * @var \DOMElement */ private $contextNode; - public function __construct(DOMElement $context, $name) + public function __construct(\DOMElement $context, $name) { $this->contextNode = $context; @@ -92,6 +91,6 @@ public function addMethod($name) ) ); - return new PHP_CodeCoverage_Report_XML_File_Method($node, $name); + return new Method($node, $name); } } diff --git a/src/CodeCoverage/Util.php b/src/Util.php similarity index 87% rename from src/CodeCoverage/Util.php rename to src/Util.php index db92b7852..89164f771 100644 --- a/src/CodeCoverage/Util.php +++ b/src/Util.php @@ -1,6 +1,6 @@ * @@ -8,12 +8,12 @@ * file that was distributed with this source code. */ +namespace SebastianBergmann\CodeCoverage; + /** * Utility methods. - * - * @since Class available since Release 1.0.0 */ -class PHP_CodeCoverage_Util +class Util { /** * @param float $a diff --git a/tests/PHP/CodeCoverage/UtilTest.php b/tests/PHP/CodeCoverage/UtilTest.php deleted file mode 100644 index 1cd8c20b8..000000000 --- a/tests/PHP/CodeCoverage/UtilTest.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'TestCase.php'; - -/** - * Tests for the PHP_CodeCoverage_Util class. - * - * @since Class available since Release 1.0.0 - */ -class PHP_CodeCoverage_UtilTest extends PHPUnit_Framework_TestCase -{ - /** - * @covers PHP_CodeCoverage_Util::percent - */ - public function testPercent() - { - $this->assertEquals(100, PHP_CodeCoverage_Util::percent(100, 0)); - $this->assertEquals(100, PHP_CodeCoverage_Util::percent(100, 100)); - $this->assertEquals( - '100.00%', - PHP_CodeCoverage_Util::percent(100, 100, true) - ); - } -} diff --git a/tests/TestCase.php b/tests/TestCase.php index 7ce8ffe8b..28a1895e1 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,6 +1,6 @@ * @@ -8,16 +8,16 @@ * file that was distributed with this source code. */ -if (!defined('TEST_FILES_PATH')) { - define('TEST_FILES_PATH', dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR); -} +namespace SebastianBergmann\CodeCoverage; + +use SebastianBergmann\CodeCoverage\Driver\Xdebug; /** * Abstract base class for test case classes. * * @since Class available since Release 1.0.0 */ -abstract class PHP_CodeCoverage_TestCase extends PHPUnit_Framework_TestCase +abstract class TestCase extends \PHPUnit_Framework_TestCase { protected static $TEST_TMP_PATH; @@ -81,9 +81,9 @@ protected function getXdebugDataForBankAccount() protected function getCoverageForBankAccount() { $data = $this->getXdebugDataForBankAccount(); - require_once TEST_FILES_PATH . 'BankAccountTest.php'; + require_once TEST_FILES_PATH . '/BankAccountTest.php'; - $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug'); + $stub = $this->getMock(Xdebug::class); $stub->expects($this->any()) ->method('stop') ->will($this->onConsecutiveCalls( @@ -93,13 +93,13 @@ protected function getCoverageForBankAccount() $data[3] )); - $filter = new PHP_CodeCoverage_Filter; + $filter = new Filter; $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); - $coverage = new PHP_CodeCoverage($stub, $filter); + $coverage = new CodeCoverage($stub, $filter); $coverage->start( - new BankAccountTest('testBalanceIsInitiallyZero'), + new \BankAccountTest('testBalanceIsInitiallyZero'), true ); @@ -109,7 +109,7 @@ protected function getCoverageForBankAccount() ); $coverage->start( - new BankAccountTest('testBalanceCannotBecomeNegative') + new \BankAccountTest('testBalanceCannotBecomeNegative') ); $coverage->stop( @@ -118,7 +118,7 @@ protected function getCoverageForBankAccount() ); $coverage->start( - new BankAccountTest('testBalanceCannotBecomeNegative2') + new \BankAccountTest('testBalanceCannotBecomeNegative2') ); $coverage->stop( @@ -127,7 +127,7 @@ protected function getCoverageForBankAccount() ); $coverage->start( - new BankAccountTest('testDepositWithdrawMoney') + new \BankAccountTest('testDepositWithdrawMoney') ); $coverage->stop( @@ -148,7 +148,7 @@ protected function getCoverageForBankAccountForFirstTwoTests() { $data = $this->getXdebugDataForBankAccount(); - $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug'); + $stub = $this->getMock(Xdebug::class); $stub->expects($this->any()) ->method('stop') ->will($this->onConsecutiveCalls( @@ -156,13 +156,13 @@ protected function getCoverageForBankAccountForFirstTwoTests() $data[1] )); - $filter = new PHP_CodeCoverage_Filter; + $filter = new Filter; $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); - $coverage = new PHP_CodeCoverage($stub, $filter); + $coverage = new CodeCoverage($stub, $filter); $coverage->start( - new BankAccountTest('testBalanceIsInitiallyZero'), + new \BankAccountTest('testBalanceIsInitiallyZero'), true ); @@ -172,7 +172,7 @@ protected function getCoverageForBankAccountForFirstTwoTests() ); $coverage->start( - new BankAccountTest('testBalanceCannotBecomeNegative') + new \BankAccountTest('testBalanceCannotBecomeNegative') ); $coverage->stop( @@ -187,7 +187,7 @@ protected function getCoverageForBankAccountForLastTwoTests() { $data = $this->getXdebugDataForBankAccount(); - $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug'); + $stub = $this->getMock(Xdebug::class); $stub->expects($this->any()) ->method('stop') ->will($this->onConsecutiveCalls( @@ -195,13 +195,13 @@ protected function getCoverageForBankAccountForLastTwoTests() $data[3] )); - $filter = new PHP_CodeCoverage_Filter; + $filter = new Filter; $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); - $coverage = new PHP_CodeCoverage($stub, $filter); + $coverage = new CodeCoverage($stub, $filter); $coverage->start( - new BankAccountTest('testBalanceCannotBecomeNegative2') + new \BankAccountTest('testBalanceCannotBecomeNegative2') ); $coverage->stop( @@ -210,7 +210,7 @@ protected function getCoverageForBankAccountForLastTwoTests() ); $coverage->start( - new BankAccountTest('testDepositWithdrawMoney') + new \BankAccountTest('testDepositWithdrawMoney') ); $coverage->stop( @@ -263,10 +263,10 @@ protected function getExpectedDataArrayForBankAccount() protected function getCoverageForFileWithIgnoredLines() { - $filter = new PHP_CodeCoverage_Filter; + $filter = new Filter; $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_ignore.php'); - $coverage = new PHP_CodeCoverage( + $coverage = new CodeCoverage( $this->setUpXdebugStubForFileWithIgnoredLines(), $filter ); @@ -279,7 +279,7 @@ protected function getCoverageForFileWithIgnoredLines() protected function setUpXdebugStubForFileWithIgnoredLines() { - $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug'); + $stub = $this->getMock(Xdebug::class); $stub->expects($this->any()) ->method('stop') ->will($this->returnValue( @@ -298,10 +298,10 @@ protected function setUpXdebugStubForFileWithIgnoredLines() protected function getCoverageForClassWithAnonymousFunction() { - $filter = new PHP_CodeCoverage_Filter; + $filter = new Filter; $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php'); - $coverage = new PHP_CodeCoverage( + $coverage = new CodeCoverage( $this->setUpXdebugStubForClassWithAnonymousFunction(), $filter ); @@ -314,7 +314,7 @@ protected function getCoverageForClassWithAnonymousFunction() protected function setUpXdebugStubForClassWithAnonymousFunction() { - $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug'); + $stub = $this->getMock(Xdebug::class); $stub->expects($this->any()) ->method('stop') ->will($this->returnValue( diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html b/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html index a5dcd4c2b..8cb228134 100644 --- a/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html +++ b/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html @@ -232,7 +232,7 @@

    Legend

    Dead Code

    - Generated by PHP_CodeCoverage %s using %s at %s. + Generated by php-code-coverage %s using %s at %s.

    diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html b/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html index 651217a99..2f0d97f42 100644 --- a/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html +++ b/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html @@ -140,7 +140,7 @@

    Project Risks

    diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/index.html b/tests/_files/Report/HTML/CoverageForBankAccount/index.html index 5c99c2e42..662b9679d 100644 --- a/tests/_files/Report/HTML/CoverageForBankAccount/index.html +++ b/tests/_files/Report/HTML/CoverageForBankAccount/index.html @@ -108,7 +108,7 @@

    Legend

    High: 90% to 100%

    - Generated by PHP_CodeCoverage %s using %s at %s. + Generated by php-code-coverage %s using %s at %s.

    diff --git a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html index 229b1675a..95ce2399a 100644 --- a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html +++ b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html @@ -138,7 +138,7 @@

    Project Risks

    diff --git a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html index ace676be4..d579da6ad 100644 --- a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html +++ b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html @@ -108,7 +108,7 @@

    Legend

    High: 90% to 100%

    - Generated by PHP_CodeCoverage %s using %s at %s. + Generated by php-code-coverage %s using %s at %s.

    diff --git a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html index ce90096b9..5f0c6a6c8 100644 --- a/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html +++ b/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html @@ -176,7 +176,7 @@

    Legend

    Dead Code

    - Generated by PHP_CodeCoverage %s using %s at %s. + Generated by php-code-coverage %s using %s at %s.

    diff --git a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html index 54deaeaba..6b982131c 100644 --- a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html +++ b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html @@ -136,7 +136,7 @@

    Project Risks

    diff --git a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html index 2687444ff..850163fc6 100644 --- a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html +++ b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html @@ -108,7 +108,7 @@

    Legend

    High: 90% to 100%

    - Generated by PHP_CodeCoverage %s using %s at %s. + Generated by php-code-coverage %s using %s at %s.

    diff --git a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html index 251b5c309..5493c6e4a 100644 --- a/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html +++ b/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html @@ -244,7 +244,7 @@

    Legend

    Dead Code

    - Generated by PHP_CodeCoverage %s using %s at %s. + Generated by php-code-coverage %s using %s at %s.

    diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 000000000..8e6d4134f --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,5 @@ + * @@ -8,20 +8,18 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage\Report; -/** - * Tests for the PHP_CodeCoverage_Report_Factory class. - * - * @since Class available since Release 1.1.0 - */ -class PHP_CodeCoverage_Report_FactoryTest extends PHP_CodeCoverage_TestCase +use SebastianBergmann\CodeCoverage\TestCase; +use SebastianBergmann\CodeCoverage\Node\Builder; + +class BuilderTest extends TestCase { protected $factory; protected function setUp() { - $this->factory = new PHP_CodeCoverage_Report_Factory; + $this->factory = new Builder; } public function testSomething() @@ -127,13 +125,10 @@ public function testSomething() $this->assertEquals([], $root->getFunctions()); } - /** - * @covers PHP_CodeCoverage_Report_Factory::buildDirectoryStructure - */ public function testBuildDirectoryStructure() { - $method = new ReflectionMethod( - 'PHP_CodeCoverage_Report_Factory', + $method = new \ReflectionMethod( + Builder::class, 'buildDirectoryStructure' ); @@ -154,13 +149,12 @@ public function testBuildDirectoryStructure() } /** - * @covers PHP_CodeCoverage_Report_Factory::reducePaths * @dataProvider reducePathsProvider */ public function testReducePaths($reducedPaths, $commonPath, $paths) { - $method = new ReflectionMethod( - 'PHP_CodeCoverage_Report_Factory', + $method = new \ReflectionMethod( + Builder::class, 'reducePaths' ); diff --git a/tests/PHP/CodeCoverage/Report/CloverTest.php b/tests/tests/CloverTest.php similarity index 59% rename from tests/PHP/CodeCoverage/Report/CloverTest.php rename to tests/tests/CloverTest.php index 1b2174ee9..85743abcf 100644 --- a/tests/PHP/CodeCoverage/Report/CloverTest.php +++ b/tests/tests/CloverTest.php @@ -1,6 +1,6 @@ * @@ -8,21 +8,18 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\TestCase; /** - * Tests for the PHP_CodeCoverage_Report_Clover class. - * - * @since Class available since Release 1.0.0 + * @covers SebastianBergmann\CodeCoverage\Report\Clover */ -class PHP_CodeCoverage_Report_CloverTest extends PHP_CodeCoverage_TestCase +class CloverTest extends TestCase { - /** - * @covers PHP_CodeCoverage_Report_Clover - */ public function testCloverForBankAccountTest() { - $clover = new PHP_CodeCoverage_Report_Clover; + $clover = new Clover; $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'BankAccount-clover.xml', @@ -30,12 +27,9 @@ public function testCloverForBankAccountTest() ); } - /** - * @covers PHP_CodeCoverage_Report_Clover - */ public function testCloverForFileWithIgnoredLines() { - $clover = new PHP_CodeCoverage_Report_Clover; + $clover = new Clover; $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'ignored-lines-clover.xml', @@ -43,12 +37,9 @@ public function testCloverForFileWithIgnoredLines() ); } - /** - * @covers PHP_CodeCoverage_Report_Clover - */ public function testCloverForClassWithAnonymousFunction() { - $clover = new PHP_CodeCoverage_Report_Clover; + $clover = new Clover; $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'class-with-anonymous-function-clover.xml', diff --git a/tests/PHP/CodeCoverageTest.php b/tests/tests/CodeCoverageTest.php similarity index 71% rename from tests/PHP/CodeCoverageTest.php rename to tests/tests/CodeCoverageTest.php index 76d7ac662..926d073ab 100644 --- a/tests/PHP/CodeCoverageTest.php +++ b/tests/tests/CodeCoverageTest.php @@ -1,6 +1,6 @@ * @@ -8,55 +8,47 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage; + +use SebastianBergmann\CodeCoverage\Driver\Xdebug; /** - * Tests for the PHP_CodeCoverage class. - * - * @since Class available since Release 1.0.0 + * @covers SebastianBergmann\CodeCoverage\CodeCoverage */ -class PHP_CodeCoverageTest extends PHP_CodeCoverage_TestCase +class CodeCoverageTest extends TestCase { /** - * @var PHP_CodeCoverage + * @var CodeCoverage */ private $coverage; protected function setUp() { - $this->coverage = new PHP_CodeCoverage; + $this->coverage = new CodeCoverage; } - /** - * @covers PHP_CodeCoverage::__construct - * @covers PHP_CodeCoverage::filter - */ public function testConstructor() { $this->assertAttributeInstanceOf( - 'PHP_CodeCoverage_Driver_Xdebug', + Xdebug::class, 'driver', $this->coverage ); $this->assertAttributeInstanceOf( - 'PHP_CodeCoverage_Filter', + Filter::class, 'filter', $this->coverage ); } - /** - * @covers PHP_CodeCoverage::__construct - * @covers PHP_CodeCoverage::filter - */ public function testConstructor2() { - $filter = new PHP_CodeCoverage_Filter; - $coverage = new PHP_CodeCoverage(null, $filter); + $filter = new Filter; + $coverage = new CodeCoverage(null, $filter); $this->assertAttributeInstanceOf( - 'PHP_CodeCoverage_Driver_Xdebug', + Xdebug::class, 'driver', $coverage ); @@ -65,17 +57,15 @@ public function testConstructor2() } /** - * @covers PHP_CodeCoverage::start - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testStartThrowsExceptionForInvalidArgument() { - $this->coverage->start(null, [], null); + $this->coverage->start(null, null); } /** - * @covers PHP_CodeCoverage::stop - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testStopThrowsExceptionForInvalidArgument() { @@ -83,8 +73,7 @@ public function testStopThrowsExceptionForInvalidArgument() } /** - * @covers PHP_CodeCoverage::stop - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testStopThrowsExceptionForInvalidArgument2() { @@ -92,8 +81,7 @@ public function testStopThrowsExceptionForInvalidArgument2() } /** - * @covers PHP_CodeCoverage::append - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testAppendThrowsExceptionForInvalidArgument() { @@ -101,17 +89,13 @@ public function testAppendThrowsExceptionForInvalidArgument() } /** - * @covers PHP_CodeCoverage::setCacheTokens - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetCacheTokensThrowsExceptionForInvalidArgument() { $this->coverage->setCacheTokens(null); } - /** - * @covers PHP_CodeCoverage::setCacheTokens - */ public function testSetCacheTokens() { $this->coverage->setCacheTokens(true); @@ -119,17 +103,13 @@ public function testSetCacheTokens() } /** - * @covers PHP_CodeCoverage::setCheckForUnintentionallyCoveredCode - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetCheckForUnintentionallyCoveredCodeThrowsExceptionForInvalidArgument() { $this->coverage->setCheckForUnintentionallyCoveredCode(null); } - /** - * @covers PHP_CodeCoverage::setCheckForUnintentionallyCoveredCode - */ public function testSetCheckForUnintentionallyCoveredCode() { $this->coverage->setCheckForUnintentionallyCoveredCode(true); @@ -141,17 +121,13 @@ public function testSetCheckForUnintentionallyCoveredCode() } /** - * @covers PHP_CodeCoverage::setForceCoversAnnotation - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetForceCoversAnnotationThrowsExceptionForInvalidArgument() { $this->coverage->setForceCoversAnnotation(null); } - /** - * @covers PHP_CodeCoverage::setCheckForMissingCoversAnnotation - */ public function testSetCheckForMissingCoversAnnotation() { $this->coverage->setCheckForMissingCoversAnnotation(true); @@ -163,17 +139,13 @@ public function testSetCheckForMissingCoversAnnotation() } /** - * @covers PHP_CodeCoverage::setCheckForMissingCoversAnnotation - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetCheckForMissingCoversAnnotationThrowsExceptionForInvalidArgument() { $this->coverage->setCheckForMissingCoversAnnotation(null); } - /** - * @covers PHP_CodeCoverage::setForceCoversAnnotation - */ public function testSetForceCoversAnnotation() { $this->coverage->setForceCoversAnnotation(true); @@ -185,17 +157,13 @@ public function testSetForceCoversAnnotation() } /** - * @covers PHP_CodeCoverage::setCheckForUnexecutedCoveredCode - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetCheckForUnexecutedCoveredCodeThrowsExceptionForInvalidArgument() { $this->coverage->setCheckForUnexecutedCoveredCode(null); } - /** - * @covers PHP_CodeCoverage::setCheckForUnexecutedCoveredCode - */ public function testSetCheckForUnexecutedCoveredCode() { $this->coverage->setCheckForUnexecutedCoveredCode(true); @@ -207,17 +175,13 @@ public function testSetCheckForUnexecutedCoveredCode() } /** - * @covers PHP_CodeCoverage::setAddUncoveredFilesFromWhitelist - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetAddUncoveredFilesFromWhitelistThrowsExceptionForInvalidArgument() { $this->coverage->setAddUncoveredFilesFromWhitelist(null); } - /** - * @covers PHP_CodeCoverage::setAddUncoveredFilesFromWhitelist - */ public function testSetAddUncoveredFilesFromWhitelist() { $this->coverage->setAddUncoveredFilesFromWhitelist(true); @@ -229,17 +193,13 @@ public function testSetAddUncoveredFilesFromWhitelist() } /** - * @covers PHP_CodeCoverage::setProcessUncoveredFilesFromWhitelist - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetProcessUncoveredFilesFromWhitelistThrowsExceptionForInvalidArgument() { $this->coverage->setProcessUncoveredFilesFromWhitelist(null); } - /** - * @covers PHP_CodeCoverage::setProcessUncoveredFilesFromWhitelist - */ public function testSetProcessUncoveredFilesFromWhitelist() { $this->coverage->setProcessUncoveredFilesFromWhitelist(true); @@ -250,9 +210,6 @@ public function testSetProcessUncoveredFilesFromWhitelist() ); } - /** - * @covers PHP_CodeCoverage::setIgnoreDeprecatedCode - */ public function testSetIgnoreDeprecatedCode() { $this->coverage->setIgnoreDeprecatedCode(true); @@ -264,17 +221,13 @@ public function testSetIgnoreDeprecatedCode() } /** - * @covers PHP_CodeCoverage::setIgnoreDeprecatedCode - * @expectedException PHP_CodeCoverage_Exception + * @expectedException SebastianBergmann\CodeCoverage\Exception */ public function testSetIgnoreDeprecatedCodeThrowsExceptionForInvalidArgument() { $this->coverage->setIgnoreDeprecatedCode(null); } - /** - * @covers PHP_CodeCoverage::clear - */ public function testClear() { $this->coverage->clear(); @@ -284,15 +237,6 @@ public function testClear() $this->assertAttributeEquals([], 'tests', $this->coverage); } - /** - * @covers PHP_CodeCoverage::start - * @covers PHP_CodeCoverage::stop - * @covers PHP_CodeCoverage::append - * @covers PHP_CodeCoverage::applyListsFilter - * @covers PHP_CodeCoverage::initializeFilesThatAreSeenTheFirstTime - * @covers PHP_CodeCoverage::applyCoversAnnotationFilter - * @covers PHP_CodeCoverage::getTests - */ public function testCollect() { $coverage = $this->getCoverageForBankAccount(); @@ -302,7 +246,7 @@ public function testCollect() $coverage->getData() ); - if (version_compare(PHPUnit_Runner_Version::id(), '4.7', '>=')) { + if (version_compare(\PHPUnit_Runner_Version::id(), '4.7', '>=')) { $size = 'unknown'; } else { $size = 'small'; @@ -319,10 +263,6 @@ public function testCollect() ); } - /** - * @covers PHP_CodeCoverage::getData - * @covers PHP_CodeCoverage::merge - */ public function testMerge() { $coverage = $this->getCoverageForBankAccountForFirstTwoTests(); @@ -334,15 +274,11 @@ public function testMerge() ); } - /** - * @covers PHP_CodeCoverage::getData - * @covers PHP_CodeCoverage::merge - */ public function testMerge2() { - $coverage = new PHP_CodeCoverage( - $this->getMock('PHP_CodeCoverage_Driver_Xdebug'), - new PHP_CodeCoverage_Filter + $coverage = new CodeCoverage( + $this->getMock(Xdebug::class), + new Filter ); $coverage->merge($this->getCoverageForBankAccount()); @@ -353,9 +289,6 @@ public function testMerge2() ); } - /** - * @covers PHP_CodeCoverage::getLinesToBeIgnored - */ public function testGetLinesToBeIgnored() { $this->assertEquals( @@ -402,9 +335,6 @@ public function testGetLinesToBeIgnored() ); } - /** - * @covers PHP_CodeCoverage::getLinesToBeIgnored - */ public function testGetLinesToBeIgnored2() { $this->assertEquals( @@ -416,9 +346,6 @@ public function testGetLinesToBeIgnored2() ); } - /** - * @covers PHP_CodeCoverage::getLinesToBeIgnored - */ public function testGetLinesToBeIgnored3() { $this->assertEquals( @@ -442,9 +369,6 @@ public function testGetLinesToBeIgnored3() ); } - /** - * @covers PHP_CodeCoverage::getLinesToBeIgnored - */ public function testGetLinesToBeIgnoredOneLineAnnotations() { $this->assertEquals( @@ -489,12 +413,12 @@ public function testGetLinesToBeIgnoredOneLineAnnotations() } /** - * @return ReflectionMethod + * @return \ReflectionMethod */ private function getLinesToBeIgnored() { - $getLinesToBeIgnored = new ReflectionMethod( - 'PHP_CodeCoverage', + $getLinesToBeIgnored = new \ReflectionMethod( + 'SebastianBergmann\CodeCoverage\CodeCoverage', 'getLinesToBeIgnored' ); @@ -503,9 +427,6 @@ private function getLinesToBeIgnored() return $getLinesToBeIgnored; } - /** - * @covers PHP_CodeCoverage::getLinesToBeIgnored - */ public function testGetLinesToBeIgnoredWhenIgnoreIsDisabled() { $this->coverage->setDisableIgnoredLines(true); @@ -520,50 +441,54 @@ public function testGetLinesToBeIgnoredWhenIgnoreIsDisabled() } /** - * @covers PHP_CodeCoverage::performUnexecutedCoveredCodeCheck - * @expectedException PHP_CodeCoverage_CoveredCodeNotExecutedException + * @expectedException SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException */ public function testAppendThrowsExceptionIfCoveredCodeWasNotExecuted() { $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); $this->coverage->setCheckForUnexecutedCoveredCode(true); + $data = [ TEST_FILES_PATH . 'BankAccount.php' => [ 29 => -1, 31 => -1 ] ]; + $linesToBeCovered = [ TEST_FILES_PATH . 'BankAccount.php' => [ 22, 24 ] ]; + $linesToBeUsed = []; $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); } /** - * @covers PHP_CodeCoverage::performUnexecutedCoveredCodeCheck - * @expectedException PHP_CodeCoverage_CoveredCodeNotExecutedException + * @expectedException SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException */ public function testAppendThrowsExceptionIfUsedCodeWasNotExecuted() { $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); $this->coverage->setCheckForUnexecutedCoveredCode(true); + $data = [ TEST_FILES_PATH . 'BankAccount.php' => [ 29 => -1, 31 => -1 ] ]; + $linesToBeCovered = [ TEST_FILES_PATH . 'BankAccount.php' => [ 29, 31 ] ]; + $linesToBeUsed = [ TEST_FILES_PATH . 'BankAccount.php' => [ 22, diff --git a/tests/PHP/CodeCoverage/Report/Crap4jTest.php b/tests/tests/Crap4jTest.php similarity index 61% rename from tests/PHP/CodeCoverage/Report/Crap4jTest.php rename to tests/tests/Crap4jTest.php index b768b8025..faa1ac51e 100644 --- a/tests/PHP/CodeCoverage/Report/Crap4jTest.php +++ b/tests/tests/Crap4jTest.php @@ -1,6 +1,6 @@ * @@ -8,21 +8,18 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\TestCase; /** - * Tests for the PHP_CodeCoverage_Report_Crap4j class. - * - * @since Class available since Release 3.1.0 + * @covers SebastianBergmann\CodeCoverage\Report\Crap4j */ -class PHP_CodeCoverage_Report_Crap4jTest extends PHP_CodeCoverage_TestCase +class Crap4jTest extends TestCase { - /** - * @covers PHP_CodeCoverage_Report_Crap4j - */ public function testForBankAccountTest() { - $crap4j = new PHP_CodeCoverage_Report_Crap4j; + $crap4j = new Crap4j; $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'BankAccount-crap4j.xml', @@ -30,12 +27,9 @@ public function testForBankAccountTest() ); } - /** - * @covers PHP_CodeCoverage_Report_Crap4j - */ public function testForFileWithIgnoredLines() { - $crap4j = new PHP_CodeCoverage_Report_Crap4j; + $crap4j = new Crap4j; $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'ignored-lines-crap4j.xml', @@ -43,12 +37,9 @@ public function testForFileWithIgnoredLines() ); } - /** - * @covers PHP_CodeCoverage_Report_Crap4j - */ public function testForClassWithAnonymousFunction() { - $crap4j = new PHP_CodeCoverage_Report_Crap4j; + $crap4j = new Crap4j; $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'class-with-anonymous-function-crap4j.xml', diff --git a/tests/PHP/CodeCoverage/FilterTest.php b/tests/tests/FilterTest.php similarity index 80% rename from tests/PHP/CodeCoverage/FilterTest.php rename to tests/tests/FilterTest.php index f39b95cdf..47ff21a0f 100644 --- a/tests/PHP/CodeCoverage/FilterTest.php +++ b/tests/tests/FilterTest.php @@ -1,6 +1,6 @@ * @@ -8,21 +8,23 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage; -/** - * Tests for the PHP_CodeCoverage_Filter class. - * - * @since Class available since Release 1.0.0 - */ -class PHP_CodeCoverage_FilterTest extends PHPUnit_Framework_TestCase +class FilterTest extends \PHPUnit_Framework_TestCase { - protected $filter; - protected $files; + /** + * @var Filter + */ + private $filter; + + /** + * @var array + */ + private $files = []; protected function setUp() { - $this->filter = unserialize('O:23:"PHP_CodeCoverage_Filter":0:{}'); + $this->filter = unserialize('O:37:"SebastianBergmann\CodeCoverage\Filter":0:{}'); $this->files = [ TEST_FILES_PATH . 'BankAccount.php', @@ -70,8 +72,8 @@ protected function setUp() } /** - * @covers PHP_CodeCoverage_Filter::addFileToWhitelist - * @covers PHP_CodeCoverage_Filter::getWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist */ public function testAddingAFileToTheWhitelistWorks() { @@ -84,8 +86,8 @@ public function testAddingAFileToTheWhitelistWorks() } /** - * @covers PHP_CodeCoverage_Filter::removeFileFromWhitelist - * @covers PHP_CodeCoverage_Filter::getWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::removeFileFromWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist */ public function testRemovingAFileFromTheWhitelistWorks() { @@ -96,8 +98,8 @@ public function testRemovingAFileFromTheWhitelistWorks() } /** - * @covers PHP_CodeCoverage_Filter::addDirectoryToWhitelist - * @covers PHP_CodeCoverage_Filter::getWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::addDirectoryToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist * @depends testAddingAFileToTheWhitelistWorks */ public function testAddingADirectoryToTheWhitelistWorks() @@ -111,13 +113,14 @@ public function testAddingADirectoryToTheWhitelistWorks() } /** - * @covers PHP_CodeCoverage_Filter::addFilesToWhitelist - * @covers PHP_CodeCoverage_Filter::getWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::addFilesToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist */ public function testAddingFilesToTheWhitelistWorks() { - $facade = new File_Iterator_Facade; - $files = $facade->getFilesAsArray( + $facade = new \File_Iterator_Facade; + + $files = $facade->getFilesAsArray( TEST_FILES_PATH, $suffixes = '.php' ); @@ -131,8 +134,8 @@ public function testAddingFilesToTheWhitelistWorks() } /** - * @covers PHP_CodeCoverage_Filter::removeDirectoryFromWhitelist - * @covers PHP_CodeCoverage_Filter::getWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::removeDirectoryFromWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist * @depends testAddingADirectoryToTheWhitelistWorks */ public function testRemovingADirectoryFromTheWhitelistWorks() @@ -144,7 +147,7 @@ public function testRemovingADirectoryFromTheWhitelistWorks() } /** - * @covers PHP_CodeCoverage_Filter::isFile + * @covers SebastianBergmann\CodeCoverage\Filter::isFile */ public function testIsFile() { @@ -158,7 +161,7 @@ public function testIsFile() } /** - * @covers PHP_CodeCoverage_Filter::isFiltered + * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered */ public function testWhitelistedFileIsNotFiltered() { @@ -167,7 +170,7 @@ public function testWhitelistedFileIsNotFiltered() } /** - * @covers PHP_CodeCoverage_Filter::isFiltered + * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered */ public function testNotWhitelistedFileIsFiltered() { @@ -176,8 +179,8 @@ public function testNotWhitelistedFileIsFiltered() } /** - * @covers PHP_CodeCoverage_Filter::isFiltered - * @covers PHP_CodeCoverage_Filter::isFile + * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered + * @covers SebastianBergmann\CodeCoverage\Filter::isFile */ public function testNonFilesAreFiltered() { diff --git a/tests/PHP/CodeCoverage/Report/HTMLTest.php b/tests/tests/HTMLTest.php similarity index 67% rename from tests/PHP/CodeCoverage/Report/HTMLTest.php rename to tests/tests/HTMLTest.php index cd9104e62..9523f87b1 100644 --- a/tests/PHP/CodeCoverage/Report/HTMLTest.php +++ b/tests/tests/HTMLTest.php @@ -1,6 +1,6 @@ * @@ -8,14 +8,12 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage\Report\Html; -/** - * Tests for the PHP_CodeCoverage_Report_HTML class. - * - * @since Class available since Release 3.1.0 - */ -class PHP_CodeCoverage_Report_HTMLTest extends PHP_CodeCoverage_TestCase +use SebastianBergmann\CodeCoverage\Report\Xml\Facade; +use SebastianBergmann\CodeCoverage\TestCase; + +class HTMLTest extends TestCase { private static $TEST_REPORT_PATH_SOURCE; @@ -30,52 +28,44 @@ protected function tearDown() { parent::tearDown(); - $tmpFilesIterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator(self::$TEST_TMP_PATH, RecursiveDirectoryIterator::SKIP_DOTS), - RecursiveIteratorIterator::CHILD_FIRST + $tmpFilesIterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator(self::$TEST_TMP_PATH, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST ); + foreach ($tmpFilesIterator as $path => $fileInfo) { - /* @var SplFileInfo $fileInfo */ + /* @var \SplFileInfo $fileInfo */ $pathname = $fileInfo->getPathname(); $fileInfo->isDir() ? rmdir($pathname) : unlink($pathname); } } - /** - * @covers PHP_CodeCoverage_Report_HTML - */ public function testForBankAccountTest() { $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; - $report = new PHP_CodeCoverage_Report_HTML; + $report = new Facade; $report->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); } - /** - * @covers PHP_CodeCoverage_Report_HTML - */ public function testForFileWithIgnoredLines() { $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; - $report = new PHP_CodeCoverage_Report_HTML; + $report = new Facade; $report->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); } - /** - * @covers PHP_CodeCoverage_Report_HTML - */ public function testForClassWithAnonymousFunction() { $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; - $report = new PHP_CodeCoverage_Report_HTML; + $report = new Facade; $report->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); @@ -85,23 +75,25 @@ public function testForClassWithAnonymousFunction() * @param string $expectedFilesPath * @param string $actualFilesPath */ - protected function assertFilesEquals($expectedFilesPath, $actualFilesPath) + private function assertFilesEquals($expectedFilesPath, $actualFilesPath) { - $expectedFilesIterator = new FilesystemIterator($expectedFilesPath); - $actualFilesIterator = new RegexIterator(new FilesystemIterator($actualFilesPath), '/.html/'); + $expectedFilesIterator = new \FilesystemIterator($expectedFilesPath); + $actualFilesIterator = new \RegexIterator(new \FilesystemIterator($actualFilesPath), '/.html/'); $this->assertEquals( iterator_count($expectedFilesIterator), iterator_count($actualFilesIterator), 'Generated files and expected files not match' ); + foreach ($expectedFilesIterator as $path => $fileInfo) { - /* @var SplFileInfo $fileInfo */ + /* @var \SplFileInfo $fileInfo */ $filename = $fileInfo->getFilename(); $actualFile = $actualFilesPath . DIRECTORY_SEPARATOR . $filename; $this->assertFileExists($actualFile); + $this->assertStringMatchesFormatFile( $fileInfo->getPathname(), str_replace(PHP_EOL, "\n", file_get_contents($actualFile)), diff --git a/tests/PHP/CodeCoverage/Report/TextTest.php b/tests/tests/TextTest.php similarity index 59% rename from tests/PHP/CodeCoverage/Report/TextTest.php rename to tests/tests/TextTest.php index 0081caaf9..04da00ab3 100644 --- a/tests/PHP/CodeCoverage/Report/TextTest.php +++ b/tests/tests/TextTest.php @@ -1,6 +1,6 @@ * @@ -8,21 +8,18 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\TestCase; /** - * Tests for the PHP_CodeCoverage_Report_Text class. - * - * @since Class available since Release 3.1.0 + * @covers SebastianBergmann\CodeCoverage\Report\Text */ -class PHP_CodeCoverage_Report_TextTest extends PHP_CodeCoverage_TestCase +class TextTest extends TestCase { - /** - * @covers PHP_CodeCoverage_Report_Text - */ public function testTextForBankAccountTest() { - $text = new PHP_CodeCoverage_Report_Text(50, 90, false, false); + $text = new Text(50, 90, false, false); $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'BankAccount-text.txt', @@ -30,12 +27,9 @@ public function testTextForBankAccountTest() ); } - /** - * @covers PHP_CodeCoverage_Report_Text - */ public function testTextForFileWithIgnoredLines() { - $text = new PHP_CodeCoverage_Report_Text(50, 90, false, false); + $text = new Text(50, 90, false, false); $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'ignored-lines-text.txt', @@ -43,12 +37,9 @@ public function testTextForFileWithIgnoredLines() ); } - /** - * @covers PHP_CodeCoverage_Report_Text - */ public function testTextForClassWithAnonymousFunction() { - $text = new PHP_CodeCoverage_Report_Text(50, 90, false, false); + $text = new Text(50, 90, false, false); $this->assertStringMatchesFormatFile( TEST_FILES_PATH . 'class-with-anonymous-function-text.txt', diff --git a/tests/tests/UtilTest.php b/tests/tests/UtilTest.php new file mode 100644 index 000000000..c29b693ee --- /dev/null +++ b/tests/tests/UtilTest.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\CodeCoverage; + +/** + * @covers SebastianBergmann\CodeCoverage\Util + */ +class UtilTest extends \PHPUnit_Framework_TestCase +{ + public function testPercent() + { + $this->assertEquals(100, Util::percent(100, 0)); + $this->assertEquals(100, Util::percent(100, 100)); + $this->assertEquals( + '100.00%', + Util::percent(100, 100, true) + ); + } +} diff --git a/tests/PHP/CodeCoverage/Report/XMLTest.php b/tests/tests/XMLTest.php similarity index 70% rename from tests/PHP/CodeCoverage/Report/XMLTest.php rename to tests/tests/XMLTest.php index f40210fa0..7ce8db334 100644 --- a/tests/PHP/CodeCoverage/Report/XMLTest.php +++ b/tests/tests/XMLTest.php @@ -1,6 +1,6 @@ * @@ -8,14 +8,11 @@ * file that was distributed with this source code. */ -require_once dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR . 'TestCase.php'; +namespace SebastianBergmann\CodeCoverage\Report\Xml; -/** - * Tests for the PHP_CodeCoverage_Report_XML class. - * - * @since Class available since Release 3.1.0 - */ -class PHP_CodeCoverage_Report_XMLTest extends PHP_CodeCoverage_TestCase +use SebastianBergmann\CodeCoverage\TestCase; + +class XMLTest extends TestCase { private static $TEST_REPORT_PATH_SOURCE; @@ -30,48 +27,40 @@ protected function tearDown() { parent::tearDown(); - $tmpFilesIterator = new FilesystemIterator(self::$TEST_TMP_PATH); + $tmpFilesIterator = new \FilesystemIterator(self::$TEST_TMP_PATH); + foreach ($tmpFilesIterator as $path => $fileInfo) { - /* @var SplFileInfo $fileInfo */ + /* @var \SplFileInfo $fileInfo */ unlink($fileInfo->getPathname()); } } - /** - * @covers PHP_CodeCoverage_Report_XML - */ public function testForBankAccountTest() { $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; - $xml = new PHP_CodeCoverage_Report_XML; + $xml = new Facade; $xml->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); } - /** - * @covers PHP_CodeCoverage_Report_XML - */ public function testForFileWithIgnoredLines() { $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; - $xml = new PHP_CodeCoverage_Report_XML; + $xml = new Facade; $xml->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); } - /** - * @covers PHP_CodeCoverage_Report_XML - */ public function testForClassWithAnonymousFunction() { $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; - $xml = new PHP_CodeCoverage_Report_XML; + $xml = new Facade; $xml->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); @@ -81,23 +70,25 @@ public function testForClassWithAnonymousFunction() * @param string $expectedFilesPath * @param string $actualFilesPath */ - protected function assertFilesEquals($expectedFilesPath, $actualFilesPath) + private function assertFilesEquals($expectedFilesPath, $actualFilesPath) { - $expectedFilesIterator = new FilesystemIterator($expectedFilesPath); - $actualFilesIterator = new FilesystemIterator($actualFilesPath); + $expectedFilesIterator = new \FilesystemIterator($expectedFilesPath); + $actualFilesIterator = new \FilesystemIterator($actualFilesPath); $this->assertEquals( iterator_count($expectedFilesIterator), iterator_count($actualFilesIterator), 'Generated files and expected files not match' ); + foreach ($expectedFilesIterator as $path => $fileInfo) { - /* @var SplFileInfo $fileInfo */ + /* @var \SplFileInfo $fileInfo */ $filename = $fileInfo->getFilename(); $actualFile = $actualFilesPath . DIRECTORY_SEPARATOR . $filename; $this->assertFileExists($actualFile); + $this->assertStringMatchesFormatFile( $fileInfo->getPathname(), file_get_contents($actualFile), From b167714d8b51ee29e6304c92587c06df8dff79a6 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:28:38 +0200 Subject: [PATCH 104/114] Leftover from 4712fc6b1328d62c5da00316e0c16d4f2147fed1 --- composer.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/composer.json b/composer.json index acc645e3b..0590c64fd 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,8 @@ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "irc": "irc://irc.freenode.net/phpunit" }, + "minimum-stability": "dev", + "prefer-stable": true, "require": { "php": "^5.6 || ^7.0", "phpunit/php-file-iterator": "~1.3", From ce54e784af71bd308b895a418b275d4af236b7a1 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:29:11 +0200 Subject: [PATCH 105/114] Update ChangeLog --- ChangeLog-4.0.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ChangeLog-4.0.md b/ChangeLog-4.0.md index 9b83ab28f..f2156cf5e 100644 --- a/ChangeLog-4.0.md +++ b/ChangeLog-4.0.md @@ -4,5 +4,9 @@ All notable changes of the PHP_CodeCoverage 4.0 release series are documented in ## [4.0.0] - 2016-MM-DD +### Changed + +* This component now uses namespaces + [4.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/3.3...4.0.0 From ea0679352bb9f10a7e363b361e22fff77eb8c12c Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:33:50 +0200 Subject: [PATCH 106/114] Fix --- src/Report/Html/Renderer/Dashboard.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index 15ba66765..7cde17559 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -10,6 +10,7 @@ namespace SebastianBergmann\CodeCoverage\Report\Html; +use SebastianBergmann\CodeCoverage\Node\AbstractNode; use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; /** @@ -290,7 +291,7 @@ protected function projectRisks(array $classes, $baseLink) return $result; } - protected function getActiveBreadcrumb(DirectoryNode $node) + protected function getActiveBreadcrumb(AbstractNode $node) { return sprintf( '
  • %s
  • ' . "\n" . From 8787403f83bf9a72c9d2415973854b8522c4eb8e Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:39:24 +0200 Subject: [PATCH 107/114] Fix --- src/Report/Html/Facade.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Report/Html/Facade.php b/src/Report/Html/Facade.php index acff5bda7..d1453ad41 100644 --- a/src/Report/Html/Facade.php +++ b/src/Report/Html/Facade.php @@ -50,15 +50,7 @@ public function __construct($lowUpperBound = 50, $highLowerBound = 90, $generato $this->generator = $generator; $this->highLowerBound = $highLowerBound; $this->lowUpperBound = $lowUpperBound; - - $this->templatePath = sprintf( - '%s%sHTML%sRenderer%sTemplate%s', - dirname(__FILE__), - DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR, - DIRECTORY_SEPARATOR - ); + $this->templatePath = __DIR__ . '/Renderer/Template/'; } /** From bbb025d01f41411efb982f32b1ed9365049a0bf0 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:49:46 +0200 Subject: [PATCH 108/114] Disable IRC notifications --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8bceea85b..7df7f49b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,4 @@ script: vendor/bin/phpunit --configuration ./build/travis-ci.xml notifications: email: false - irc: - channels: - - "irc.freenode.org#phpunit" - use_notice: true + From f53a7705500e9b5edb98aabb5b84ce31c0fda7d9 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:52:38 +0200 Subject: [PATCH 109/114] Leftover from 4712fc6b1328d62c5da00316e0c16d4f2147fed1 --- .travis.yml | 2 +- build/travis-ci.xml | 21 --------------------- 2 files changed, 1 insertion(+), 22 deletions(-) delete mode 100644 build/travis-ci.xml diff --git a/.travis.yml b/.travis.yml index 7df7f49b9..f194125a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ php: before_script: - COMPOSER_ROOT_VERSION=dev-master composer install --prefer-source -script: vendor/bin/phpunit --configuration ./build/travis-ci.xml +script: vendor/bin/phpunit --configuration build notifications: email: false diff --git a/build/travis-ci.xml b/build/travis-ci.xml deleted file mode 100644 index 15e879fa6..000000000 --- a/build/travis-ci.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - ../tests/PHP - - - - - - - - - - ../src - - - From 0c1c1beb42b4775a88d91bd779d425f8a71d2449 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 11:57:25 +0200 Subject: [PATCH 110/114] Clean up Travis CI build --- .travis.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f194125a0..be89e1948 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,11 +2,20 @@ language: php php: - 5.6 + - 7.0 + - nightly -before_script: - - COMPOSER_ROOT_VERSION=dev-master composer install --prefer-source +sudo: false -script: vendor/bin/phpunit --configuration build +before_install: + - composer self-update + +install: + - travis_retry composer install --no-interaction --prefer-source + +script: + + - vendor/bin/phpunit --configuration build notifications: email: false From 1d96f16b383d5ff381dfefbfa10edfd71cff90c3 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 17:36:14 +0200 Subject: [PATCH 111/114] Improve test names --- tests/tests/CodeCoverageTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/tests/CodeCoverageTest.php b/tests/tests/CodeCoverageTest.php index 926d073ab..84ab2b986 100644 --- a/tests/tests/CodeCoverageTest.php +++ b/tests/tests/CodeCoverageTest.php @@ -27,7 +27,7 @@ protected function setUp() $this->coverage = new CodeCoverage; } - public function testConstructor() + public function testCanBeConstructedWithoutGivenFilterObject() { $this->assertAttributeInstanceOf( Xdebug::class, @@ -42,7 +42,7 @@ public function testConstructor() ); } - public function testConstructor2() + public function testCanBeConstructedWithGivenFilterObject() { $filter = new Filter; $coverage = new CodeCoverage(null, $filter); @@ -59,7 +59,7 @@ public function testConstructor2() /** * @expectedException SebastianBergmann\CodeCoverage\Exception */ - public function testStartThrowsExceptionForInvalidArgument() + public function testCannotStartWithInvalidArgument() { $this->coverage->start(null, null); } @@ -67,7 +67,7 @@ public function testStartThrowsExceptionForInvalidArgument() /** * @expectedException SebastianBergmann\CodeCoverage\Exception */ - public function testStopThrowsExceptionForInvalidArgument() + public function testCannotStopWithInvalidFirstArgument() { $this->coverage->stop(null); } @@ -75,7 +75,7 @@ public function testStopThrowsExceptionForInvalidArgument() /** * @expectedException SebastianBergmann\CodeCoverage\Exception */ - public function testStopThrowsExceptionForInvalidArgument2() + public function testCannotStopWithInvalidSecondArgument() { $this->coverage->stop(true, null); } @@ -83,7 +83,7 @@ public function testStopThrowsExceptionForInvalidArgument2() /** * @expectedException SebastianBergmann\CodeCoverage\Exception */ - public function testAppendThrowsExceptionForInvalidArgument() + public function testCannotAppendWithInvalidArgument() { $this->coverage->append([], null); } From 87ccabf3ea52e8916eda8ed01af077eb54527547 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Sun, 10 Apr 2016 17:39:26 +0200 Subject: [PATCH 112/114] Add tests for PHPDBG --- tests/tests/CodeCoverageTest.php | 50 ++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/tests/tests/CodeCoverageTest.php b/tests/tests/CodeCoverageTest.php index 84ab2b986..ba25dec9a 100644 --- a/tests/tests/CodeCoverageTest.php +++ b/tests/tests/CodeCoverageTest.php @@ -10,6 +10,7 @@ namespace SebastianBergmann\CodeCoverage; +use SebastianBergmann\CodeCoverage\Driver\PHPDBG; use SebastianBergmann\CodeCoverage\Driver\Xdebug; /** @@ -27,8 +28,12 @@ protected function setUp() $this->coverage = new CodeCoverage; } - public function testCanBeConstructedWithoutGivenFilterObject() + public function testCanBeConstructedForXdebugWithoutGivenFilterObject() { + if (PHP_SAPI == 'phpdbg') { + $this->markTestSkipped('Requires PHP CLI and Xdebug'); + } + $this->assertAttributeInstanceOf( Xdebug::class, 'driver', @@ -42,8 +47,12 @@ public function testCanBeConstructedWithoutGivenFilterObject() ); } - public function testCanBeConstructedWithGivenFilterObject() + public function testCanBeConstructedForXdebugWithGivenFilterObject() { + if (PHP_SAPI == 'phpdbg') { + $this->markTestSkipped('Requires PHP CLI and Xdebug'); + } + $filter = new Filter; $coverage = new CodeCoverage(null, $filter); @@ -56,6 +65,43 @@ public function testCanBeConstructedWithGivenFilterObject() $this->assertSame($filter, $coverage->filter()); } + public function testCanBeConstructedForPhpdbgWithoutGivenFilterObject() + { + if (PHP_SAPI != 'phpdbg') { + $this->markTestSkipped('Requires PHPDBG'); + } + + $this->assertAttributeInstanceOf( + PHPDBG::class, + 'driver', + $this->coverage + ); + + $this->assertAttributeInstanceOf( + Filter::class, + 'filter', + $this->coverage + ); + } + + public function testCanBeConstructedForPhpdbgWithGivenFilterObject() + { + if (PHP_SAPI != 'phpdbg') { + $this->markTestSkipped('Requires PHPDBG'); + } + + $filter = new Filter; + $coverage = new CodeCoverage(null, $filter); + + $this->assertAttributeInstanceOf( + PHPDBG::class, + 'driver', + $coverage + ); + + $this->assertSame($filter, $coverage->filter()); + } + /** * @expectedException SebastianBergmann\CodeCoverage\Exception */ From 9b6abba63af0d45e03506d32693934e4b3abeee9 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 15 Apr 2016 06:43:47 +0100 Subject: [PATCH 113/114] Update tests --- tests/TestCase.php | 15 ++++++++++----- tests/tests/CodeCoverageTest.php | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index 28a1895e1..cd18a8245 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -83,7 +83,8 @@ protected function getCoverageForBankAccount() $data = $this->getXdebugDataForBankAccount(); require_once TEST_FILES_PATH . '/BankAccountTest.php'; - $stub = $this->getMock(Xdebug::class); + $stub = $this->createMock(Xdebug::class); + $stub->expects($this->any()) ->method('stop') ->will($this->onConsecutiveCalls( @@ -148,7 +149,8 @@ protected function getCoverageForBankAccountForFirstTwoTests() { $data = $this->getXdebugDataForBankAccount(); - $stub = $this->getMock(Xdebug::class); + $stub = $this->createMock(Xdebug::class); + $stub->expects($this->any()) ->method('stop') ->will($this->onConsecutiveCalls( @@ -187,7 +189,8 @@ protected function getCoverageForBankAccountForLastTwoTests() { $data = $this->getXdebugDataForBankAccount(); - $stub = $this->getMock(Xdebug::class); + $stub = $this->createMock(Xdebug::class); + $stub->expects($this->any()) ->method('stop') ->will($this->onConsecutiveCalls( @@ -279,7 +282,8 @@ protected function getCoverageForFileWithIgnoredLines() protected function setUpXdebugStubForFileWithIgnoredLines() { - $stub = $this->getMock(Xdebug::class); + $stub = $this->createMock(Xdebug::class); + $stub->expects($this->any()) ->method('stop') ->will($this->returnValue( @@ -314,7 +318,8 @@ protected function getCoverageForClassWithAnonymousFunction() protected function setUpXdebugStubForClassWithAnonymousFunction() { - $stub = $this->getMock(Xdebug::class); + $stub = $this->createMock(Xdebug::class); + $stub->expects($this->any()) ->method('stop') ->will($this->returnValue( diff --git a/tests/tests/CodeCoverageTest.php b/tests/tests/CodeCoverageTest.php index ba25dec9a..26438fe90 100644 --- a/tests/tests/CodeCoverageTest.php +++ b/tests/tests/CodeCoverageTest.php @@ -323,7 +323,7 @@ public function testMerge() public function testMerge2() { $coverage = new CodeCoverage( - $this->getMock(Xdebug::class), + $this->createMock(Xdebug::class), new Filter ); From 9e5dbd28bb830ef9f00d6c14855999e638291a13 Mon Sep 17 00:00:00 2001 From: Graham Campbell Date: Fri, 15 Apr 2016 16:27:20 +0100 Subject: [PATCH 114/114] Fixed broken html report tests --- tests/tests/HTMLTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tests/HTMLTest.php b/tests/tests/HTMLTest.php index 9523f87b1..56c5d0a76 100644 --- a/tests/tests/HTMLTest.php +++ b/tests/tests/HTMLTest.php @@ -10,7 +10,7 @@ namespace SebastianBergmann\CodeCoverage\Report\Html; -use SebastianBergmann\CodeCoverage\Report\Xml\Facade; +use SebastianBergmann\CodeCoverage\Report\Html\Facade; use SebastianBergmann\CodeCoverage\TestCase; class HTMLTest extends TestCase