Gets the executable lines of a class, by examining the start and end lines of each method.
public static executable ( mixed $class, array $options = [] ) : array | ||
$class | mixed | Class name as a string or object instance. |
$options | array | Set of options: - `'self'` _boolean_: If `true` (default), only returns lines of methods defined in `$class`, excluding methods from inherited classes. - `'methods'` _array_: An arbitrary list of methods to search, as a string (single method name) or array of method names. - `'filter'` _boolean_: If `true`, filters out lines containing only whitespace or braces. Note: for some reason, the Zend engine does not report `switch` and `try` statements as executable lines, as well as parts of multi-line assignment statements, so they are filtered out as well. |
Результат | array | Returns an array of the executable line numbers of the class. |
/** * Analyzes code coverage results collected from XDebug, and performs coverage density analysis. * * @param object $report The report instance running this filter and aggregating results * @param array $classes A list of classes to analyze coverage on. By default, gets all * defined subclasses of lithium\test\Unit which are currently in memory. * @return array|void Returns an array indexed by file and line, showing the number of * instances each line was called. */ public static function analyze($report, array $classes = array()) { $data = static::collect($report->results['filters'][__CLASS__]); $classes = $classes ?: array_filter(get_declared_classes(), function ($class) use($data) { $unit = 'lithium\\test\\Unit'; return !is_subclass_of($class, $unit) || array_key_exists($class, $data); }); $classes = array_values(array_intersect((array) $classes, array_keys($data))); $densities = $result = array(); foreach ($classes as $class) { $classMap = array($class => Libraries::path($class)); $densities += static::_density($data[$class], $classMap); } $executableLines = array(); if (!empty($classes)) { $executableLines = array_combine($classes, array_map(function ($cls) { return Inspector::executable($cls, array('public' => false)); }, $classes)); } foreach ($densities as $class => $density) { $executable = $executableLines[$class]; $covered = array_intersect(array_keys($density), $executable); $uncovered = array_diff($executable, $covered); $percentage = round(count($covered) / (count($executable) ?: 1), 4) * 100; $result[$class] = compact('class', 'executable', 'covered', 'uncovered', 'percentage'); } $result = static::collectLines($result); return $result; }
/** * Gets the executable line numbers of this file based on a manual entry of line ranges. Will * need to be updated manually if this method changes. * * @return void */ public function testExecutableLines() { do { // These lines should be ignored } while (false); $result = Inspector::executable($this, array('methods' => __FUNCTION__)); $expected = array(__LINE__ - 1, __LINE__, __LINE__ + 1); $this->assertEqual($expected, $result); }
public function testExecutableLinesOnEmptyClass() { $result = Inspector::executable(new MockEmptyClass()); $this->assertEqual(array(), $result); }