public function process($files) { if (!is_array($files)) { $files = array($files); } $tmp_file = lime_test::get_temp_directory() . DIRECTORY_SEPARATOR . 'test.php'; foreach ($files as $file) { $tmp = <<<EOF <?php xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); include('{$file}'); echo '<PHP_SER>'.serialize(xdebug_get_code_coverage()).'</PHP_SER>'; EOF; file_put_contents($tmp_file, $tmp); ob_start(); passthru(sprintf('%s "%s" 2>&1', $this->harness->php_cli, $tmp_file), $return); $retval = ob_get_clean(); if (0 != $return) { // something may have gone wrong, we should warn the user so they know // it's a bug in their code and not symfony's $this->harness->output->echoln(sprintf('Warning: %s returned status %d, results may be inaccurate', $file, $return), 'ERROR'); } if (false === ($cov = unserialize(substr($retval, strpos($retval, '<PHP_SER>') + 9, strpos($retval, '</PHP_SER>') - 9)))) { if (0 == $return) { // failed to serialize, but PHP said it should of worked. // something is seriously wrong, so abort with exception throw new Exception(sprintf('Unable to unserialize coverage for file "%s"', $file)); } else { // failed to serialize, but PHP warned us that this might have happened. // so we should ignore and move on continue; // continue foreach loop through $this->harness->files } } foreach ($cov as $file => $lines) { if (!isset($this->coverage[$file])) { $this->coverage[$file] = $lines; continue; } foreach ($lines as $line => $flag) { if ($flag == 1) { $this->coverage[$file][$line] = 1; } } } } if (file_exists($tmp_file)) { unlink($tmp_file); } }
public function run() { if (!function_exists('xdebug_start_code_coverage')) { throw new Exception('You must install and enable xdebug before using lime coverage.'); } if (!ini_get('xdebug.extended_info')) { throw new Exception('You must set xdebug.extended_info to 1 in your php.ini to use lime coverage.'); } if (!count($this->harness->files)) { throw new Exception('You must register some test files before running coverage!'); } if (!count($this->files)) { throw new Exception('You must register some files to cover!'); } $coverage = array(); $tmp_file = lime_test::get_temp_directory() . DIRECTORY_SEPARATOR . 'test.php'; foreach ($this->harness->files as $file) { $tmp = <<<EOF <?php xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); include('{$file}'); echo '<PHP_SER>'.serialize(xdebug_get_code_coverage()).'</PHP_SER>'; EOF; file_put_contents($tmp_file, $tmp); ob_start(); passthru(sprintf('%s "%s" 2>&1', $this->harness->php_cli, $tmp_file), $return); $retval = ob_get_clean(); if (0 != $return) { // something may have gone wrong, we should warn the user so they know // it's a bug in their code and not symfony's $this->harness->output->echoln(sprintf('Warning: %s returned status %d, results may be inaccurate', $file, $return), 'ERROR'); } if (false === ($cov = unserialize(substr($retval, strpos($retval, '<PHP_SER>') + 9, strpos($retval, '</PHP_SER>') - 9)))) { if (0 == $return) { // failed to serialize, but PHP said it should of worked. // something is seriously wrong, so abort with exception throw new Exception(sprintf('Unable to unserialize coverage for file "%s"', $file)); } else { // failed to serialize, but PHP warned us that this might have happened. // so we should ignore and move on continue; // continue foreach loop through $this->harness->files } } foreach ($cov as $file => $lines) { if (!in_array($file, $this->files)) { continue; } if (!isset($coverage[$file])) { $coverage[$file] = $lines; continue; } foreach ($lines as $line => $flag) { if ($flag == 1) { $coverage[$file][$line] = 1; } } } } unlink($tmp_file); ksort($coverage); $total_php_lines = 0; $total_covered_lines = 0; foreach ($this->files as $file) { $is_covered = isset($coverage[$file]); $cov = isset($coverage[$file]) ? $coverage[$file] : array(); $covered_lines = array(); $missing_lines = array(); foreach ($cov as $line => $flag) { switch ($flag) { case 1: $covered_lines[] = $line; break; case -1: $missing_lines[] = $line; break; } } $total_lines = count($covered_lines) + count($missing_lines); $output = $this->harness->output; $percent = $total_lines ? count($covered_lines) * 100 / $total_lines : 0; $total_php_lines += $total_lines; $total_covered_lines += count($covered_lines); $relative_file = $this->get_relative_file($file); $output->echoln(sprintf("%-70s %3.0f%%", substr($relative_file, -min(70, strlen($relative_file))), $percent), $percent == 100 ? 'INFO' : ($percent > 90 ? 'PARAMETER' : ($percent < 20 ? 'ERROR' : ''))); if ($this->verbose && $is_covered && $percent != 100) { $output->comment(sprintf("missing: %s", $this->format_range($missing_lines))); } } $output->echoln(sprintf("TOTAL COVERAGE: %3.0f%%", $total_php_lines ? $total_covered_lines * 100 / $total_php_lines : 0)); }
function run() { if (!function_exists('xdebug_start_code_coverage')) { throw new Exception('You must install and enable xdebug before using lime coverage.'); } if (!ini_get('xdebug.extended_info')) { throw new Exception('You must set xdebug.extended_info to 1 in your php.ini to use lime coverage.'); } if (!count($this->harness->files)) { throw new Exception('You must register some test files before running coverage!'); } if (!count($this->files)) { throw new Exception('You must register some files to cover!'); } $coverage = array(); $tmp_file = lime_test::get_temp_directory() . DIRECTORY_SEPARATOR . 'test.php'; foreach ($this->harness->files as $file) { $tmp = <<<EOF <?php xdebug_start_code_coverage(); ob_start(); include('{$file}'); ob_end_clean(); echo '<PHP_SER>'.serialize(xdebug_get_code_coverage()).'</PHP_SER>'; EOF; file_put_contents($tmp_file, $tmp); ob_start(); passthru(sprintf('%s -d html_errors=off -d open_basedir= -q "%s" 2>&1', $this->harness->php_cli, $tmp_file), $return); $retval = ob_get_clean(); if (0 == $return) { if (false === ($cov = unserialize(substr($retval, strpos($retval, '<PHP_SER>') + 9, strpos($retval, '</PHP_SER>') - 9)))) { throw new Exception(sprintf('Unable to unserialize coverage for file "%s"', $file)); } foreach ($cov as $file => $lines) { if (!isset($coverage[$file])) { $coverage[$file] = array(); } foreach ($lines as $line => $count) { if (!isset($coverage[$file][$line])) { $coverage[$file][$line] = 0; } $coverage[$file][$line] = $coverage[$file][$line] + $count; } } } } unlink($tmp_file); ksort($coverage); $total_php_lines = 0; $total_covered_lines = 0; foreach ($this->files as $file) { $cov = isset($coverage[$file]) ? $coverage[$file] : array(); list($cov, $php_lines) = $this->compute(file_get_contents($file), $cov); $output = $this->harness->output; $percent = count($php_lines) ? count($cov) * 100 / count($php_lines) : 100; $total_php_lines += count($php_lines); $total_covered_lines += count($cov); $relative_file = $this->get_relative_file($file); $output->echoln(sprintf("%-70s %3.0f%%", substr($relative_file, -min(70, strlen($relative_file))), $percent), $percent == 100 ? 'INFO' : ($percent > 90 ? 'PARAMETER' : ($percent < 20 ? 'ERROR' : ''))); if ($this->verbose && $percent != 100) { $output->comment(sprintf("missing: %s", $this->format_range(array_keys(array_diff_key($php_lines, $cov))))); } } $output->echoln(sprintf("TOTAL COVERAGE: %3.0f%%", $total_covered_lines * 100 / $total_php_lines)); }
<?php /* * This file is part of the sfLucenePlugin package * (c) 2007 - 2008 Carl Vondrick <*****@*****.**> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * @package sfLucenePlugin * @subpackage Test * @author Carl Vondrick * @version SVN: $Id: sfLuceneProjectConfigHandlerTest.php 7116 2008-01-20 22:43:28Z Carl.Vondrick $ */ require dirname(__FILE__) . '/../../bootstrap/unit.php'; $t = new limeade_test(2, limeade_output::get()); $limeade = new limeade_sf($t); $app = $limeade->bootstrap(); $luceneade = new limeade_lucene($limeade); $luceneade->configure()->clear_sandbox()->load_models(); $config = new sfLuceneProjectConfigHandler(); $response = $config->execute(array($luceneade->data_dir . '/configTest/project.yml')); file_put_contents(lime_test::get_temp_directory() . '/search.yml.php', $response); require lime_test::get_temp_directory() . '/search.yml.php'; unlink(lime_test::get_temp_directory() . '/search.yml.php'); $t->ok(isset($config), '->execute() creates a $config variable'); $t->is_deeply($config, array('testLucene' => array('models' => array('FakeModel' => array('fields' => array('id' => array('type' => 'text', 'boost' => 1, 'transform' => NULL), 'title' => array('type' => 'text', 'boost' => 1, 'transform' => NULL), 'description' => array('type' => 'text', 'boost' => 3, 'transform' => NULL)), 'title' => 'title', 'description' => 'description', 'categories' => array(0 => 'Forum'), 'route' => 'forum/showForum?id=%id%', 'validator' => 'isIndexable', 'rebuild_limit' => 5, 'peer' => 'FakeForumPeer', 'partial' => 'forumResult', 'indexer' => NULL)), 'index' => array('encoding' => 'UTF-8', 'cultures' => array(0 => 'en', 1 => 'fr'), 'stop_words' => array(0 => 'and', 1 => 'the'), 'short_words' => 2, 'analyzer' => 'utf8num', 'case_sensitive' => false, 'mb_string' => true, 'param' => array()), 'interface' => array('categories' => true, 'advanced' => true), 'factories' => array('indexers' => array(), 'results' => array())), 'barLucene' => array('models' => array('FakeModel' => array('fields' => array(), 'partial' => NULL, 'route' => NULL, 'indexer' => NULL, 'title' => NULL, 'description' => NULL, 'peer' => 'FakeModelPeer', 'rebuild_limit' => 250, 'validator' => NULL, 'categories' => array())), 'index' => array('encoding' => 'utf-8', 'cultures' => array(0 => NULL), 'stop_words' => array(0 => 'a', 1 => 'an', 2 => 'at', 3 => ' the', 4 => 'and', 5 => 'or', 6 => 'is', 7 => 'am', 8 => 'are', 9 => 'of'), 'short_words' => 2, 'analyzer' => 'textnum', 'case_sensitive' => false, 'mb_string' => false, 'param' => array()), 'factories' => array('indexers' => array(), 'results' => array())), 'fooLucene' => array('models' => array(), 'index' => array('encoding' => 'utf-8', 'cultures' => array(0 => NULL), 'stop_words' => array(0 => 'a', 1 => 'an', 2 => 'at', 3 => ' the', 4 => 'and', 5 => 'or', 6 => 'is', 7 => 'am', 8 => 'are', 9 => 'of'), 'short_words' => 2, 'analyzer' => 'textnum', 'case_sensitive' => false, 'mb_string' => false, 'param' => array()), 'factories' => array('indexers' => array(), 'results' => array()))), '->execute() writes the correct configuration from the YAML file');