From 53dcdc5e01b72a2da01b2eaf1372236502043415 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Fri, 2 Apr 2021 13:49:43 +0300 Subject: [PATCH] Action generator: Don't generate nullable types for PHP 7.0 --- src/Codeception/Lib/Generator/Actions.php | 16 +++++----- tests/cli/BuildCest.php | 39 ++++++++++++++++++++++- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/Codeception/Lib/Generator/Actions.php b/src/Codeception/Lib/Generator/Actions.php index 95fa96e5c2..dfc65ae670 100644 --- a/src/Codeception/Lib/Generator/Actions.php +++ b/src/Codeception/Lib/Generator/Actions.php @@ -233,25 +233,25 @@ private function createReturnTypeHint(\ReflectionMethod $refMethod) } /** - * @param \ReflectionType $returnType + * @param \ReflectionType $type * @return string */ - private function stringifyType(\ReflectionType $returnType) + private function stringifyType(\ReflectionType $type) { - if ($returnType instanceof \ReflectionUnionType) { - $types = $returnType->getTypes(); + if ($type instanceof \ReflectionUnionType) { + $types = $type->getTypes(); return implode('|', $types); } if (PHP_VERSION_ID < 70100) { - $returnTypeString = (string)$returnType; + $returnTypeString = (string)$type; } else { - $returnTypeString = $returnType->getName(); + $returnTypeString = $type->getName(); } return sprintf( '%s%s%s', - $returnType->allowsNull() ? '?' : '', - $returnType->isBuiltin() ? '' : '\\', + (PHP_VERSION_ID >= 70100 && $type->allowsNull()) ? '?' : '', + $type->isBuiltin() ? '' : '\\', $returnTypeString ); } diff --git a/tests/cli/BuildCest.php b/tests/cli/BuildCest.php index ec946be6d2..9e29141179 100644 --- a/tests/cli/BuildCest.php +++ b/tests/cli/BuildCest.php @@ -94,4 +94,41 @@ public function noReturnForVoidType(CliGuy $I, Scenario $scenario) $I->seeFileFound('CliGuyActions.php', 'tests/support/_generated'); $I->seeInThisFile('public function seeDirFound($dir): void'); } -} \ No newline at end of file + + public function generateNullableParametersOnPHP70(CliGuy $I, Scenario $scenario) + { + if (PHP_VERSION_ID < 70000 || PHP_VERSION_ID >= 70100) { + $scenario->skip('For PHP 7.0 only'); + } + + $cliHelperContents = file_get_contents(codecept_root_dir('tests/support/CliHelper.php')); + $cliHelperContents = str_replace('public function seeDirFound($dir)', 'public function seeDirFound(\Directory $dir = null)', $cliHelperContents); + file_put_contents(codecept_root_dir('tests/support/CliHelper.php'), $cliHelperContents); + + $I->runShellCommand('php codecept build'); + $I->seeInShellOutput('generated successfully'); + $I->seeInSupportDir('CliGuy.php'); + $I->seeInThisFile('class CliGuy extends \Codeception\Actor'); + $I->seeInThisFile('use _generated\CliGuyActions'); + $I->seeFileFound('CliGuyActions.php', 'tests/support/_generated'); + $I->seeInThisFile('public function seeDirFound(\Directory $dir = NULL)'); + } + + public function generateNullableParametersOnPHP71AndLater(CliGuy $I, Scenario $scenario) + { + if (PHP_VERSION_ID < 70100) { + $scenario->skip('Does not work in PHP < 7.1'); + } + $cliHelperContents = file_get_contents(codecept_root_dir('tests/support/CliHelper.php')); + $cliHelperContents = str_replace('public function seeDirFound($dir)', 'public function seeDirFound(\Directory $dir = null): ?bool', $cliHelperContents); + file_put_contents(codecept_root_dir('tests/support/CliHelper.php'), $cliHelperContents); + + $I->runShellCommand('php codecept build'); + $I->seeInShellOutput('generated successfully'); + $I->seeInSupportDir('CliGuy.php'); + $I->seeInThisFile('class CliGuy extends \Codeception\Actor'); + $I->seeInThisFile('use _generated\CliGuyActions'); + $I->seeFileFound('CliGuyActions.php', 'tests/support/_generated'); + $I->seeInThisFile('public function seeDirFound(?\Directory $dir = NULL): ?bool'); + } +}