@@ -367,6 +367,32 @@ function phpunitClassHasTestsPhp(functionName: string): string {
367367}`
368368}
369369
370+ function phpunitClassesOwnedByTestFilesPhp ( functionName : string ) : string {
371+ return `function ${ functionName } (array $class_names): array {
372+ $classes = array();
373+ $owners = array();
374+ foreach ($class_names as $class_name) {
375+ try {
376+ $class = new ReflectionClass($class_name);
377+ $file = $class->getFileName();
378+ if ($file === false) {
379+ continue;
380+ }
381+ $classes[$class_name] = array($class, $file);
382+ if ($class->getShortName() === pathinfo($file, PATHINFO_FILENAME)) {
383+ $owners[$file] = $class_name;
384+ }
385+ } catch (Throwable $e) {
386+ continue;
387+ }
388+ }
389+ return array_values(array_filter(array_keys($classes), static function($class_name) use ($classes, $owners) {
390+ $file = $classes[$class_name][1];
391+ return !isset($owners[$file]) || $owners[$file] === $class_name;
392+ }));
393+ }`
394+ }
395+
370396export function phpunitRunCode ( options : PhpunitRunCodeOptions ) : string {
371397 return `error_reporting(E_ALL);
372398ini_set('display_errors', '1');
@@ -1332,7 +1358,8 @@ try {
13321358}
13331359$after_classes = get_declared_classes();
13341360${ phpunitClassHasTestsPhp ( "pg_phpunit_class_has_tests" ) }
1335- foreach (array_diff($after_classes, $before_classes) as $class_name) {
1361+ ${ phpunitClassesOwnedByTestFilesPhp ( "pg_phpunit_classes_owned_by_test_files" ) }
1362+ foreach (pg_phpunit_classes_owned_by_test_files(array_diff($after_classes, $before_classes)) as $class_name) {
13361363 try {
13371364 $ref = new ReflectionClass($class_name);
13381365 if (!$ref->isAbstract() && $ref->isSubclassOf('PHPUnit\\Framework\\TestCase') && pg_phpunit_class_has_tests($ref)) {
@@ -1656,7 +1683,8 @@ try {
16561683}
16571684$after_classes = get_declared_classes();
16581685${ phpunitClassHasTestsPhp ( "core_pg_phpunit_class_has_tests" ) }
1659- foreach (array_diff($after_classes, $before_classes) as $class_name) {
1686+ ${ phpunitClassesOwnedByTestFilesPhp ( "core_pg_phpunit_classes_owned_by_test_files" ) }
1687+ foreach (core_pg_phpunit_classes_owned_by_test_files(array_diff($after_classes, $before_classes)) as $class_name) {
16601688 try {
16611689 $ref = new ReflectionClass($class_name);
16621690 if (!$ref->isAbstract() && $ref->isSubclassOf('PHPUnit\\Framework\\TestCase') && core_pg_phpunit_class_has_tests($ref)) {
0 commit comments