isDir() && in_array( $file->getFilename(), [ 'php', 'src' ], true ) ) { return true; } // Allow top-level files ending in "-command.php" if ( $file->isFile() && false !== strpos( $file->getFilename(), '-command.php' ) ) { return true; } return false; } ); $files = []; foreach ( $filtered_items as $item ) { if ( $item->isDir() ) { foreach ( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $item->getPathname(), RecursiveDirectoryIterator::SKIP_DOTS ) ) as $file ) { if ( $file->isFile() && $file->getExtension() === 'php' ) { $files[] = $file->getPathname(); } } } else { $files[] = $item->getPathname(); } } $filter = new Filter(); if ( method_exists( $filter, 'includeFiles' ) ) { $filter->includeFiles( $files ); } else { $filter->addFilesToWhitelist( $files ); } $coverage = new CodeCoverage( // Selector class was only added in v9.1 of the php-code-coverage library. class_exists( Selector::class ) ? ( new Selector() )->forLineCoverage( $filter ) : ( new Xdebug() ), $filter ); $coverage->start( $name ); register_shutdown_function( static function () use ( $coverage, $feature, $scenario, $step_line, $name, $project_dir ) { $coverage->stop(); $feature_suffix = preg_replace( '/[^a-z0-9]+/', '-', strtolower( $feature ) ); $scenario_suffix = preg_replace( '/[^a-z0-9]+/', '-', strtolower( $scenario ) ); $db_type = strtolower( getenv( 'WP_CLI_TEST_DBTYPE' ) ); $destination = "$project_dir/build/logs/$feature_suffix-$scenario_suffix-$step_line-$db_type.cov"; $dir = dirname( $destination ); if ( ! file_exists( $dir ) ) { mkdir( $dir, 0777, true /*recursive*/ ); } ( new PHPReport() )->process( $coverage, $destination ); } );