drupal-civicrm/sites/all/modules/civicrm/Civi/CiUtil/PHPUnitScanner.php
2018-01-14 13:10:16 +00:00

98 lines
2.4 KiB
PHP

<?php
namespace Civi\CiUtil;
use Symfony\Component\Finder\Finder;
/**
* Search for PHPUnit test cases
*/
class PHPUnitScanner {
/**
* @param $path
* @return array <string> class names
*/
public static function _findTestClasses($path) {
// print_r(array(
// 'loading' => $path,
// get_included_files()
// ));
$origClasses = get_declared_classes();
require_once $path;
$newClasses = get_declared_classes();
return preg_grep('/Test$/', array_diff(
$newClasses,
$origClasses
));
}
/**
* @param $paths
* @return array (string $file => string $class)
* @throws \Exception
*/
public static function findTestClasses($paths) {
$testClasses = array();
$finder = new Finder();
foreach ($paths as $path) {
if (is_dir($path)) {
foreach ($finder->files()->in($paths)->name('*Test.php') as $file) {
$testClass = self::_findTestClasses((string) $file);
if (count($testClass) == 1) {
$testClasses[(string) $file] = array_shift($testClass);
}
elseif (count($testClass) > 1) {
throw new \Exception("Too many classes in $file");
}
else {
throw new \Exception("Too few classes in $file");
}
}
}
elseif (is_file($path)) {
$testClass = self::_findTestClasses($path);
if (count($testClass) == 1) {
$testClasses[$path] = array_shift($testClass);
}
elseif (count($testClass) > 1) {
throw new \Exception("Too many classes in $path");
}
else {
throw new \Exception("Too few classes in $path");
}
}
}
return $testClasses;
}
/**
* @param array $paths
*
* @return array
* each element is an array with keys:
* - file: string
* - class: string
* - method: string
*/
public static function findTestsByPath($paths) {
$r = array();
$testClasses = self::findTestClasses($paths);
foreach ($testClasses as $testFile => $testClass) {
$clazz = new \ReflectionClass($testClass);
foreach ($clazz->getMethods() as $method) {
if (preg_match('/^test/', $method->name)) {
$r[] = array(
'file' => $testFile,
'class' => $testClass,
'method' => $method->name,
);
}
}
}
return $r;
}
}