diff --git a/src/Testing/CodeHacking/CodeHacker.php b/src/Testing/CodeHacking/CodeHacker.php index 967c5cdd8a9..9c3696416e6 100644 --- a/src/Testing/CodeHacking/CodeHacker.php +++ b/src/Testing/CodeHacking/CodeHacker.php @@ -31,9 +31,10 @@ use \ReflectionException; * * For using with PHPUnit, see CodeHackerTestHook. */ -class CodeHacker { +final class CodeHacker { - const PROTOCOL = 'file'; + const PROTOCOL = 'file'; + const HACK_CALLBACK_ARGUMENT_COUNT = 2; /** * Value of "context" parameter to be passed to the native PHP filesystem related functions. @@ -132,11 +133,11 @@ class CodeHacker { */ public static function add_hack( $hack, $persistent = false ) { if ( ! is_callable( $hack ) && ! is_object( $hack ) ) { - throw new \Exception( "Hacks must be either functions, or objects having a 'process(\$text, \$path)' method." ); + throw new \Exception( "CodeHacker::addhack: Hacks must be either functions, or objects having a 'process(\$text, \$path)' method." ); } if ( ! self::is_valid_hack_callback( $hack ) && ! self::is_valid_hack_object( $hack ) ) { - throw new \Exception( "CodeHacker::addhack: hacks must be either a function with a 'hack(\$code,\$path)' signature, or an object containing a public method 'hack' with that signature. " ); + throw new \Exception( "CodeHacker::addhack: Hacks must be either a function with a 'hack(\$code,\$path)' signature, or an object containing a public method 'hack' with that signature. " ); } if ( $persistent ) { @@ -154,7 +155,7 @@ class CodeHacker { * @throws ReflectionException Error when instantiating ReflectionFunction. */ private static function is_valid_hack_callback( $callback ) { - return is_callable( $callback ) && 2 === ( new ReflectionFunction( $callback ) )->getNumberOfRequiredParameters(); + return is_callable( $callback ) && HACK_CALLBACK_ARGUMENT_COUNT === ( new ReflectionFunction( $callback ) )->getNumberOfRequiredParameters(); } /** @@ -162,7 +163,7 @@ class CodeHacker { * * @param mixed $callback Argument to check. * - * @return boolt rue if the argument is a valid hack object, false otherwise. + * @return bool rue if the argument is a valid hack object, false otherwise. */ private static function is_valid_hack_object( $callback ) { if ( ! is_object( $callback ) ) { diff --git a/src/Testing/CodeHacking/CodeHackerTestHook.php b/src/Testing/CodeHacking/CodeHackerTestHook.php index 0d96a2515ba..f5c84696064 100644 --- a/src/Testing/CodeHacking/CodeHackerTestHook.php +++ b/src/Testing/CodeHacking/CodeHackerTestHook.php @@ -5,8 +5,6 @@ * @package WooCommerce/Testing */ -// phpcs:disable Squiz.Commenting.FunctionComment.Missing, PHPCompatibility.FunctionDeclarations - namespace Automattic\WooCommerce\Testing\CodeHacking; use PHPUnit\Runner\BeforeTestHook; @@ -64,12 +62,27 @@ use Exception; */ final class CodeHackerTestHook implements BeforeTestHook, AfterTestHook { + // phpcs:disable PHPCompatibility.FunctionDeclarations.NewReturnTypeDeclarations.voidFound + + /** + * Runs after each test. + * + * @param string $test "TestClass::TestMethod". + * @param float $time The time it took the test to run, in seconds. + */ public function executeAfterTest( string $test, float $time ): void { if ( ! CodeHacker::has_persistent_hacks() ) { CodeHacker::disable(); } } + /** + * Runs before each test. + * + * @param string $test "TestClass::TestMethod". + * + * @throws \ReflectionException Thrown by execute_before_methods. + */ public function executeBeforeTest( string $test ): void { /** * Possible formats of $test: @@ -79,7 +92,7 @@ final class CodeHackerTestHook implements BeforeTestHook, AfterTestHook { */ $parts = explode( '::', $test ); if ( count( $parts ) < 2 ) { - return; + return; // "Warning" was supplied as argument } $class_name = $parts[0]; $method_name = explode( ' ', $parts[1] )[0]; @@ -95,6 +108,8 @@ final class CodeHackerTestHook implements BeforeTestHook, AfterTestHook { } } + // phpcs:enable PHPCompatibility.FunctionDeclarations.NewReturnTypeDeclarations.voidFound + /** * Apply hacks defined in @hack annotations. * @@ -164,4 +179,3 @@ final class CodeHackerTestHook implements BeforeTestHook, AfterTestHook { } } -// phpcs:enable Squiz.Commenting.FunctionComment.Missing, PHPCompatibility.FunctionDeclarations diff --git a/src/Testing/CodeHacking/Hacks/CodeHack.php b/src/Testing/CodeHacking/Hacks/CodeHack.php index 47e11f2a058..392845ace15 100644 --- a/src/Testing/CodeHacking/Hacks/CodeHack.php +++ b/src/Testing/CodeHacking/Hacks/CodeHack.php @@ -29,10 +29,14 @@ abstract class CodeHack { * * @param string $code PHP code to tokenize. * @return array Tokenized code. + * @throws \Exception PHP version is less than 7.0. */ protected function tokenize( $code ) { - //phpcs:ignore PHPCompatibility.FunctionUse.NewFunctionParameters, PHPCompatibility.Constants.NewConstants - return PHP_VERSION_ID >= 70000 ? token_get_all( $code, TOKEN_PARSE ) : token_get_all( $code ); + if ( PHP_VERSION_ID < 70000 ) { + throw new \Exception( 'The code hacker can be used in PHP 7.0+ only.' ); + } + + return token_get_all( $code, TOKEN_PARSE ); } /**