diff --git a/Tester/NetteTestHelpers.php b/Tester/NetteTestHelpers.php index 470e1f1c..4c48eb5b 100644 --- a/Tester/NetteTestHelpers.php +++ b/Tester/NetteTestHelpers.php @@ -55,6 +55,12 @@ public static function startup() header('Content-Type: text/plain; charset=utf-8'); } + if (extension_loaded('xdebug')) { + xdebug_disable(); + xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); + register_shutdown_function(array(__CLASS__, 'prepareSaveCoverage')); + } + set_exception_handler(array(__CLASS__, 'exceptionHandler')); } @@ -227,6 +233,42 @@ public static function exceptionHandler(Exception $exception) + /** + * Coverage saving helper. + * @return void + */ + public static function prepareSaveCoverage() + { + register_shutdown_function(array(__CLASS__, 'saveCoverage')); + } + + + + /** + * Saves information about code coverage. + * @return void + */ + public static function saveCoverage() + { + $file = dirname(__FILE__) . '/coverage.tmp'; + $coverage = @unserialize(file_get_contents($file)); + $root = realpath(dirname(__FILE__) . '/../../Nette') . DIRECTORY_SEPARATOR; + + foreach (xdebug_get_code_coverage() as $filename => $lines) { + if (strncmp($root, $filename, strlen($root))) continue; + + foreach ($lines as $num => $val) { + if (empty($coverage[$filename][$num]) || $val > 0) { + $coverage[$filename][$num] = $val; // -1 => untested; -2 => dead code + } + } + } + + file_put_contents($file, serialize($coverage)); + } + + + /** * Skips this test. * @return void diff --git a/Tester/RunTests.php b/Tester/RunTests.php index bda8bf16..810be08a 100644 --- a/Tester/RunTests.php +++ b/Tester/RunTests.php @@ -28,6 +28,8 @@ * Execute tests */ try { + @unlink(dirname(__FILE__) . '/coverage.tmp'); // intentionally @ + $manager = new NetteTestRunner; $manager->parseArguments(); $res = $manager->run(); diff --git a/Tester/initialize.php b/Tester/initialize.php index 43d247b8..40bb36e6 100644 --- a/Tester/initialize.php +++ b/Tester/initialize.php @@ -11,14 +11,16 @@ require dirname(__FILE__) . '/NetteTestHelpers.php'; -require dirname(__FILE__) . '/../../Nette/loader.php'; - NetteTestHelpers::startup(); +require dirname(__FILE__) . '/../../Nette/loader.php'; + + + /** * Dumps information about a variable in readable format. * @param mixed variable to dump