Skip to content

Commit 7c2b47f

Browse files
committed
Skip concrete PHPUnit helper classes
1 parent cdd5eb9 commit 7c2b47f

3 files changed

Lines changed: 37 additions & 4 deletions

File tree

packages/runtime-playground/src/phpunit-command-handlers.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,20 @@ function ${functionName}(array $argv) {
350350
}`
351351
}
352352

353+
function phpunitClassHasTestsPhp(functionName: string): string {
354+
return `function ${functionName}(ReflectionClass $class): bool {
355+
if ($class->hasMethod('suite') && $class->getMethod('suite')->isStatic()) {
356+
return true;
357+
}
358+
foreach ((new PHPUnit\\Util\\Reflection())->publicMethodsInTestClass($class) as $method) {
359+
if (PHPUnit\\Util\\Test::isTestMethod($method)) {
360+
return true;
361+
}
362+
}
363+
return false;
364+
}`
365+
}
366+
353367
export function phpunitRunCode(options: PhpunitRunCodeOptions): string {
354368
return `error_reporting(E_ALL);
355369
ini_set('display_errors', '1');
@@ -1314,10 +1328,11 @@ try {
13141328
exit(1);
13151329
}
13161330
$after_classes = get_declared_classes();
1331+
${phpunitClassHasTestsPhp("pg_phpunit_class_has_tests")}
13171332
foreach (array_diff($after_classes, $before_classes) as $class_name) {
13181333
try {
13191334
$ref = new ReflectionClass($class_name);
1320-
if (!$ref->isAbstract() && $ref->isSubclassOf('PHPUnit\\Framework\\TestCase')) {
1335+
if (!$ref->isAbstract() && $ref->isSubclassOf('PHPUnit\\Framework\\TestCase') && pg_phpunit_class_has_tests($ref)) {
13211336
$suite->addTestSuite($ref);
13221337
}
13231338
} catch (Throwable $e) {
@@ -1637,10 +1652,11 @@ try {
16371652
exit(1);
16381653
}
16391654
$after_classes = get_declared_classes();
1655+
${phpunitClassHasTestsPhp("core_pg_phpunit_class_has_tests")}
16401656
foreach (array_diff($after_classes, $before_classes) as $class_name) {
16411657
try {
16421658
$ref = new ReflectionClass($class_name);
1643-
if (!$ref->isAbstract() && $ref->isSubclassOf('PHPUnit\\Framework\\TestCase')) {
1659+
if (!$ref->isAbstract() && $ref->isSubclassOf('PHPUnit\\Framework\\TestCase') && core_pg_phpunit_class_has_tests($ref)) {
16441660
$suite->addTestSuite($ref);
16451661
}
16461662
} catch (Throwable $e) {

tests/phpunit-project-autoload.test.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,11 @@ function assertDiscoveredTestExecutes(source: string, stagePrefix: "pg" | "core_
325325
: `public function __construct($name) { $this->name = $name; }`
326326

327327
writeFileSync(testFile, `<?php
328+
class ConcreteHelper extends PHPUnit\\Framework\\TestCase {
329+
public function helperMethod(): void {}
330+
}
328331
class DiscoveredTest extends PHPUnit\\Framework\\TestCase {
332+
public function testDiscovered(): void {}
329333
public function run(): void {
330334
file_put_contents(getenv('EXECUTION_MARKER'), 'executed');
331335
}
@@ -339,11 +343,24 @@ final class TestSuite {
339343
private $name;
340344
private $tests = array();
341345
${testSuiteFactory}
342-
public function addTestSuite(\\ReflectionClass $class): void { $this->tests[] = $class->newInstance(); }
346+
public function addTestSuite(\\ReflectionClass $class): void {
347+
if ($class->getName() === 'ConcreteHelper') { throw new \\RuntimeException('concrete helper was scheduled as a test'); }
348+
$this->tests[] = $class->newInstance();
349+
}
343350
public function tests(): array { return $this->tests; }
344351
public function count(): int { return count($this->tests); }
345352
}
346353
}
354+
namespace PHPUnit\\Util {
355+
final class Reflection {
356+
public function publicMethodsInTestClass(\\ReflectionClass $class): array { return $class->getMethods(\\ReflectionMethod::IS_PUBLIC); }
357+
}
358+
final class Test {
359+
public static function isTestMethod(\\ReflectionMethod $method): bool {
360+
return strpos($method->getName(), 'test') === 0 || strpos((string) $method->getDocComment(), '@test') !== false;
361+
}
362+
}
363+
}
347364
namespace PHPUnit\\TextUI {
348365
final class TestResult {
349366
private $count;

tests/playground-phpunit-readonly-cache.integration.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ async function writeFixture(): Promise<void> {
6464
await writeFile(join(plugin, "readonly-phpunit-fixture.php"), "<?php\n/**\n * Plugin Name: Readonly PHPUnit Fixture\n */\n")
6565
await writeFile(join(plugin, "phpunit.xml.dist"), "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit><testsuites><testsuite name=\"readonly-cache\"><directory>tests</directory></testsuite></testsuites></phpunit>\n")
6666
await writeFile(join(plugin, "source-sentinel.bin"), sentinel)
67-
await writeFile(join(plugin, "tests", "ReadonlyCacheTest.php"), "<?php\nclass ReadonlyCacheTest extends WP_UnitTestCase { public function test_multisite_runtime_is_active(): void { $this->assertTrue(is_multisite()); } public function test_sentinel_is_available(): void { $this->assertGreaterThan(0, filesize(dirname(__DIR__) . \'/source-sentinel.bin\')); } public function test_dependency_activation_runs_after_install(): void { $this->assertGreaterThanOrEqual(1, get_option(\'wp_codebox_dependency_activation_users\')); } public function test_dependency_plugins_loaded_runs_once(): void { $this->assertSame(1, (int) get_option(\'wp_codebox_dependency_plugins_loaded_count\')); } public function test_wp_cli_namespaced_stdout_is_available(): void { $this->assertTrue(eval(\'namespace cli; return is_resource(STDOUT);\')); } }\n")
67+
await writeFile(join(plugin, "tests", "ReadonlyCacheTest.php"), "<?php\nclass ConcreteTestHelper extends WP_UnitTestCase { public function fixture(): string { return \'fixture\'; } }\nclass ReadonlyCacheTest extends WP_UnitTestCase { public function test_multisite_runtime_is_active(): void { $this->assertTrue(is_multisite()); } public function test_sentinel_is_available(): void { $this->assertGreaterThan(0, filesize(dirname(__DIR__) . \'/source-sentinel.bin\')); } public function test_dependency_activation_runs_after_install(): void { $this->assertGreaterThanOrEqual(1, get_option(\'wp_codebox_dependency_activation_users\')); } public function test_dependency_plugins_loaded_runs_once(): void { $this->assertSame(1, (int) get_option(\'wp_codebox_dependency_plugins_loaded_count\')); } public function test_wp_cli_namespaced_stdout_is_available(): void { $this->assertTrue(eval(\'namespace cli; return is_resource(STDOUT);\')); } }\n")
6868
await writeFile(join(dependency, "activation-dependency.php"), "<?php\n/**\n * Plugin Name: Activation Dependency\n */\nadd_action('plugins_loaded', static function (): void { update_option('wp_codebox_dependency_plugins_loaded_count', (int) get_option('wp_codebox_dependency_plugins_loaded_count', 0) + 1); });\nregister_activation_hook(__FILE__, static function (): void { update_option('wp_codebox_dependency_activation_users', count(get_users(array('number' => 1)))); });\n")
6969
}
7070

0 commit comments

Comments
 (0)