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 ($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);
if (count($executable)) {
$percentage = round(count($covered) / (count($executable) ?: 1), 4) * 100;
} else {
$percentage = 100;
}
$result[$class] = compact('class', 'executable', 'covered', 'uncovered', 'percentage');
}
$result = static::collectLines($result);
return $result;
}