15 use PHPMD\TextUI\Command;
39 self::$pathToSource =
BP;
40 self::$reportDir = self::$pathToSource .
'/dev/tests/static/report';
41 if (!
is_dir(self::$reportDir)) {
42 mkdir(self::$reportDir);
51 private static function getBaseFilesFolder()
61 private static function getChangedFilesBaseDir()
77 $changedFilesBaseDir =
'',
78 $baseFilesFolder =
'',
79 $whitelistFile =
'/_files/whitelist/common.txt' 81 $changedFiles = self::getChangedFilesList($changedFilesBaseDir);
86 $globPatternsFolder = (
'' !== $baseFilesFolder) ? $baseFilesFolder : self::getBaseFilesFolder();
88 $directoriesToCheck =
Files::init()->readLists($globPatternsFolder . $whitelistFile);
89 }
catch (\Exception $e) {
93 $targetFiles = self::filterFiles(
$changedFiles, $fileTypes, $directoriesToCheck);
112 private static function getChangedFilesList($changedFilesBaseDir)
114 return self::getFilesFromListFile(
115 $changedFilesBaseDir,
133 private static function getAddedFilesList($changedFilesBaseDir)
135 return self::getFilesFromListFile(
136 $changedFilesBaseDir,
137 'changed_files*.added.*',
154 private static function getFilesFromListFile($listsBaseDir, $listFilePattern, $noListCallback)
156 $filesDefinedInList = [];
158 $globFilesListPattern = ($listsBaseDir ?: self::getChangedFilesBaseDir())
159 .
'/_files/' . $listFilePattern;
160 $listFiles = glob($globFilesListPattern);
161 if (count($listFiles)) {
162 foreach ($listFiles as $listFile) {
163 $filesDefinedInList = array_merge(
165 file($listFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)
175 $file =
BP .
'/' . $file;
179 $filesDefinedInList = array_values(array_unique($filesDefinedInList));
181 return $filesDefinedInList;
199 private static function filterFiles(array
$files, array $allowedFileTypes, array $allowedDirectories)
201 if (empty($allowedFileTypes)) {
202 $fileHasAllowedType =
function () {
206 $fileHasAllowedType =
function ($file) use ($allowedFileTypes) {
207 return in_array(pathinfo($file, PATHINFO_EXTENSION), $allowedFileTypes);
211 if (empty($allowedDirectories)) {
212 $fileIsInAllowedDirectory =
function () {
216 $allowedDirectories = array_map(
'realpath', $allowedDirectories);
217 usort($allowedDirectories,
function ($dir1, $dir2) {
218 return strlen($dir1) - strlen($dir2);
220 $fileIsInAllowedDirectory =
function ($file) use ($allowedDirectories) {
221 foreach ($allowedDirectories as $directory) {
222 if (strpos($file, $directory) === 0) {
230 $filtered = array_filter(
232 function ($file) use ($fileHasAllowedType, $fileIsInAllowedDirectory) {
233 $file = realpath($file);
234 if (
false === $file) {
237 return $fileHasAllowedType($file) && $fileIsInAllowedDirectory($file);
249 private function getFullWhitelist()
253 }
catch (\Exception $e) {
264 $isFullScan = defined(
'TESTCODESTYLE_IS_FULL_SCAN') && TESTCODESTYLE_IS_FULL_SCAN ===
'1';
265 $reportFile = self::$reportDir .
'/phpcs_report.txt';
266 if (!file_exists($reportFile)) {
270 $result = $codeSniffer->run($isFullScan ? $this->getFullWhitelist() : self::getWhitelist([
'php',
'phtml']));
275 "PHP Code Sniffer detected {$result} violation(s): " . PHP_EOL . $report
284 $reportFile = self::$reportDir .
'/phpmd_report.txt';
287 if (!$codeMessDetector->canRun()) {
288 $this->markTestSkipped(
'PHP Mess Detector is not available.');
291 $result = $codeMessDetector->run(self::getWhitelist([
'php']));
294 if (file_exists($reportFile)) {
299 Command::EXIT_SUCCESS,
301 "PHP Code Mess has found error(s):" . PHP_EOL .
$output 305 if (file_exists($reportFile)) {
315 $reportFile = self::$reportDir .
'/phpcpd_report.xml';
318 if (!$copyPasteDetector->canRun()) {
319 $this->markTestSkipped(
'PHP Copy/Paste Detector is not available.');
323 foreach (glob(
__DIR__ .
'/_files/phpcpd/blacklist/*.txt') as $list) {
324 $blackList = array_merge($blackList, file($list, FILE_IGNORE_NEW_LINES));
327 $copyPasteDetector->setBlackList($blackList);
332 if (file_exists($reportFile)) {
338 "PHP Copy/Paste Detector has found error(s):" . PHP_EOL .
$output 351 self::getBaseFilesFolder() .
'/_files/blacklist/strict_type.txt' 353 }
catch (\Exception $e) {
358 $toBeTestedFiles = array_diff(
363 $filesMissingStrictTyping = [];
364 foreach ($toBeTestedFiles as
$fileName) {
366 if (strstr($file,
'strict_types=1') ===
false) {
373 count($filesMissingStrictTyping),
374 "Following files are missing strict type declaration:" 376 . implode(PHP_EOL, $filesMissingStrictTyping)
exec($command, array &$output=null, &$return_var=null)
call_user_func($callable, $param)
defined('TESTS_BP')||define('TESTS_BP' __DIR__
static setUpBeforeClass()
static getWhitelist( $fileTypes=['php'], $changedFilesBaseDir='', $baseFilesFolder='', $whitelistFile='/_files/whitelist/common.txt')
mkdir($pathname, $mode=0777, $recursive=false, $context=null)
foreach($appDirs as $dir) $files