TestFileParser.php 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. namespace Drupal\Core\Test\RunTests;
  3. use Drupal\simpletest\TestBase;
  4. use PHPUnit\Framework\TestCase;
  5. /**
  6. * Parses class names from PHP files without loading them.
  7. *
  8. * @internal
  9. */
  10. class TestFileParser {
  11. /**
  12. * Gets the classes from a PHP file.
  13. *
  14. * @param string $file
  15. * The path to the file to parse.
  16. *
  17. * @return string[]
  18. * Array of fully qualified class names within the PHP file.
  19. */
  20. public function getTestListFromFile($file) {
  21. $test_list = $this->parseContents(file_get_contents($file));
  22. return array_filter($test_list, function ($class) {
  23. return (is_subclass_of($class, TestCase::class) || is_subclass_of($class, TestBase::class));
  24. });
  25. }
  26. /**
  27. * Parse class names out of PHP file contents.
  28. *
  29. * @param string $contents
  30. * The contents of a PHP file.
  31. *
  32. * @return string[]
  33. * Array of fully qualified class names within the PHP file contents.
  34. */
  35. protected function parseContents($contents) {
  36. // Extract a potential namespace.
  37. $namespace = FALSE;
  38. if (preg_match('@^\s*namespace ([^ ;]+)@m', $contents, $matches)) {
  39. $namespace = $matches[1];
  40. }
  41. $test_list = [];
  42. // Extract all class names. Abstract classes are excluded on purpose.
  43. preg_match_all('@^\s*(?!abstract\s+)(?:final\s+|\s*)class ([^ ]+)@m', $contents, $matches);
  44. if (!$namespace) {
  45. $test_list = $matches[1];
  46. }
  47. else {
  48. foreach ($matches[1] as $class_name) {
  49. $namespace_class = $namespace . '\\' . $class_name;
  50. $test_list[] = $namespace_class;
  51. }
  52. }
  53. return $test_list;
  54. }
  55. }