2016-07-07 09:44:38 -07:00
< ? php
namespace Drupal\Tests\TestSuites ;
2018-11-23 12:29:20 +00:00
2016-07-07 09:44:38 -07:00
use Drupal\simpletest\TestDiscovery ;
2018-11-23 12:29:20 +00:00
use PHPUnit\Framework\TestSuite ;
2016-07-07 09:44:38 -07:00
/**
* Base class for Drupal test suites .
*/
2018-11-23 12:29:20 +00:00
abstract class TestSuiteBase extends TestSuite {
2016-07-07 09:44:38 -07:00
/**
* Finds extensions in a Drupal installation .
*
* An extension is defined as a directory with an *. info . yml file in it .
*
* @ param string $root
* Path to the root of the Drupal installation .
*
* @ return string []
* Associative array of extension paths , with extension name as keys .
*/
protected function findExtensionDirectories ( $root ) {
$extension_roots = \drupal_phpunit_contrib_extension_directory_roots ( $root );
$extension_directories = array_map ( 'drupal_phpunit_find_extension_directories' , $extension_roots );
2017-04-13 15:53:35 +01:00
return array_reduce ( $extension_directories , 'array_merge' , []);
2016-07-07 09:44:38 -07:00
}
/**
* Find and add tests to the suite for core and any extensions .
*
* @ param string $root
* Path to the root of the Drupal installation .
* @ param string $suite_namespace
* SubNamespace used to separate test suite . Examples : Unit , Functional .
*/
protected function addTestsBySuiteNamespace ( $root , $suite_namespace ) {
// Core's tests are in the namespace Drupal\${suite_namespace}Tests\ and are
// always inside of core/tests/Drupal/${suite_namespace}Tests. The exception
// to this is Unit tests for historical reasons.
if ( $suite_namespace == 'Unit' ) {
2018-11-23 12:29:20 +00:00
$tests = TestDiscovery :: scanDirectory ( " Drupal \\ Tests \\ " , " $root /core/tests/Drupal/Tests " );
$tests = array_flip ( array_filter ( array_flip ( $tests ), function ( $test_class ) {
// The Listeners directory does not contain tests. Use the class name
// to be compatible with all operating systems.
return ! preg_match ( '/^Drupal\\\\Tests\\\\Listeners\\\\/' , $test_class );
}));
$this -> addTestFiles ( $tests );
2016-07-07 09:44:38 -07:00
}
else {
$this -> addTestFiles ( TestDiscovery :: scanDirectory ( " Drupal \\ ${ suite_namespace } Tests \\ " , " $root /core/tests/Drupal/ ${ suite_namespace } Tests " ));
}
// Extensions' tests will always be in the namespace
// Drupal\Tests\$extension_name\$suite_namespace\ and be in the
// $extension_path/tests/src/$suite_namespace directory. Not all extensions
// will have all kinds of tests.
foreach ( $this -> findExtensionDirectories ( $root ) as $extension_name => $dir ) {
$test_path = " $dir /tests/src/ $suite_namespace " ;
if ( is_dir ( $test_path )) {
$this -> addTestFiles ( TestDiscovery :: scanDirectory ( " Drupal \\ Tests \\ $extension_name\\ $suite_namespace\\ " , $test_path ));
}
}
}
}