diff --git a/composer.json b/composer.json index d8536b5..b27b80f 100644 --- a/composer.json +++ b/composer.json @@ -30,19 +30,19 @@ "php": "~8.1.0 || ~8.2.0 || ~8.3.0", "composer-runtime-api": "^2.0.0", "psr/container": "^1.0 || ^2.0", - "symfony/console": "^5.3.7 || ^6.0", - "symfony/event-dispatcher": "^5.0 || ^6.0", + "symfony/console": "^6.0 || ^7.0", + "symfony/event-dispatcher": "^6.0 || ^7.0", "symfony/polyfill-php80": "^1.17", "webmozart/assert": "^1.10" }, "require-dev": { "laminas/laminas-coding-standard": "~2.5.0", - "laminas/laminas-mvc": "^3.6.1", + "laminas/laminas-mvc": "^3.7.0", "laminas/laminas-servicemanager": "^3.22.1", "mikey179/vfsstream": "2.0.x-dev", - "phpunit/phpunit": "^10.4.2", + "phpunit/phpunit": "^10.5.5", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.15" + "vimeo/psalm": "^5.18" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 5fbe88b..8f3c7bc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bfb8475cf8949c863fb6ed2d03be6d3c", + "content-hash": "a1ac4dec81cc442e12809dce00695b4c", "packages": [ { "name": "psr/container", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e710797..d0e03d7 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -3,19 +3,23 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="./vendor/autoload.php" - colors="true"> - - - - ./test/ - - - - - ./src - - - ./src/autoload.php - - + colors="true" + displayDetailsOnSkippedTests="true" + displayDetailsOnIncompleteTests="true" + displayDetailsOnTestsThatTriggerDeprecations="true" + displayDetailsOnTestsThatTriggerErrors="true" + displayDetailsOnTestsThatTriggerNotices="true" + displayDetailsOnTestsThatTriggerWarnings="true" +> + + + + ./test/ + + + + + ./src + + diff --git a/src/Input/AbstractParamAwareInput.php b/src/Input/AbstractParamAwareInput.php index 61cef22..88f69e7 100644 --- a/src/Input/AbstractParamAwareInput.php +++ b/src/Input/AbstractParamAwareInput.php @@ -306,4 +306,12 @@ static function (mixed $value) use ($originalValidator) { return $originalValidator; } + + /** + * Returns a stringified representation of the args passed to the command. + */ + public function __toString(): string + { + return $this->input->__toString(); + } } diff --git a/src/Input/ParamAwareInput.php b/src/Input/ParamAwareInput.php index a3c5fae..1d9341f 100644 --- a/src/Input/ParamAwareInput.php +++ b/src/Input/ParamAwareInput.php @@ -29,17 +29,13 @@ public function hasParameterOption($values, bool $onlyParams = false): bool /** * @param string|array $values * @param string|bool|int|float|array|null $default - * @return mixed */ - public function getParameterOption($values, $default = false, bool $onlyParams = false) + public function getParameterOption($values, $default = false, bool $onlyParams = false): mixed { return $this->input->getParameterOption($values, $default, $onlyParams); } - /** - * @return mixed - */ - public function getArgument(string $name) + public function getArgument(string $name): mixed { return $this->input->getArgument($name); } @@ -52,10 +48,7 @@ public function setArgument(string $name, $value): void $this->input->setArgument($name, $value); } - /** - * @return mixed - */ - public function getOption(string $name) + public function getOption(string $name): mixed { return $this->input->getOption($name); } diff --git a/test/Command/ParamAwareCommandTest.php b/test/Command/ParamAwareCommandTest.php index cdd0e28..f7d924e 100644 --- a/test/Command/ParamAwareCommandTest.php +++ b/test/Command/ParamAwareCommandTest.php @@ -6,7 +6,6 @@ use Laminas\Cli\Input\BoolParam; use Laminas\Cli\Input\ParamAwareInputInterface; -use LaminasTest\Cli\TestAsset\ParamAwareCommandStub74; use LaminasTest\Cli\TestAsset\ParamAwareCommandStub80; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -15,13 +14,9 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use function version_compare; - -use const PHP_VERSION; - class ParamAwareCommandTest extends TestCase { - private ParamAwareCommandStub74|ParamAwareCommandStub80 $command; + private ParamAwareCommandStub80 $command; /** @psalm-var QuestionHelper&MockObject */ private QuestionHelper|MockObject $questionHelper; @@ -40,10 +35,7 @@ public function setUp(): void ) ->willReturn($this->questionHelper); - $stubClass = version_compare(PHP_VERSION, '8.0.0', '>=') - ? ParamAwareCommandStub80::class - : ParamAwareCommandStub74::class; - $this->command = new $stubClass($helperSet); + $this->command = new ParamAwareCommandStub80($helperSet); } public function testAddParamProxiesToAddOption(): void diff --git a/test/Input/ParamAwareInputTest.php b/test/Input/ParamAwareInputTest.php index 7d81a40..0bc111a 100644 --- a/test/Input/ParamAwareInputTest.php +++ b/test/Input/ParamAwareInputTest.php @@ -15,8 +15,10 @@ use Laminas\Cli\Input\StringParam; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use ReflectionMethod; use Symfony\Component\Console\Formatter\NullOutputFormatter; use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputDefinition; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\StreamableInputInterface; @@ -147,11 +149,15 @@ public function testProxiesToDecoratedInput( array $arguments, mixed $expectedOutput ): void { - $this->decoratedInput - ->expects($this->atLeastOnce()) + $invokation = $this->decoratedInput + ->expects(self::atLeastOnce()) ->method($method) - ->with(...$arguments) - ->willReturn($expectedOutput); + ->with(...$arguments); + + $reflectionMethod = new ReflectionMethod(InputInterface::class, $method); + if ((string) $reflectionMethod->getReturnType() !== 'void') { + $invokation->willReturn($expectedOutput); + } $input = new $this->class( $this->decoratedInput, @@ -160,7 +166,7 @@ public function testProxiesToDecoratedInput( $this->params ); - $this->assertSame($expectedOutput, $input->$method(...$arguments)); + self::assertSame($expectedOutput, $input->$method(...$arguments)); } public function testProxiesToDecoratedInputWithInputDefinition(): void @@ -171,10 +177,9 @@ public function testProxiesToDecoratedInputWithInputDefinition(): void $expectedOutput = null; $this->decoratedInput - ->expects($this->atLeastOnce()) + ->expects(self::atLeastOnce()) ->method($method) - ->with(...$arguments) - ->willReturn($expectedOutput); + ->with(...$arguments); $input = new $this->class( $this->decoratedInput, @@ -214,8 +219,7 @@ public function testCanSetStreamOnDecoratedStreamableInput(): void $decoratedInput ->expects($this->atLeastOnce()) ->method('setStream') - ->with($this->identicalTo(STDIN)) - ->willReturn(null); + ->with($this->identicalTo(STDIN)); $input = new $this->class( $decoratedInput, @@ -633,4 +637,24 @@ public function testGetParamAllowsEmptyValuesForParamsWithValidationIfParamIsNot $this->assertNull($input->getParam('non-required')); } + + public function testThatCastingToAStringProxiesToTheUnderlyingInputImplementation(): void + { + /** + * Mocking a concrete class here because `__toString` is not part of the InputInterface contract + */ + $decoratedInput = $this->createMock(ArrayInput::class); + $decoratedInput->expects(self::atLeastOnce()) + ->method('__toString') + ->willReturn('something'); + + $input = new $this->class( + $decoratedInput, + $this->output, + $this->helper, + $this->params, + ); + + self::assertSame('something', $input->__toString()); + } } diff --git a/test/TestAsset/ParamAwareCommandStub74.php b/test/TestAsset/ParamAwareCommandStub74.php deleted file mode 100644 index a048fcf..0000000 --- a/test/TestAsset/ParamAwareCommandStub74.php +++ /dev/null @@ -1,23 +0,0 @@ -doAddOption($name, $shortcut, $mode, $description, $default); - } -} diff --git a/test/TestAsset/ParamAwareCommandStub80.php b/test/TestAsset/ParamAwareCommandStub80.php index ac639c2..a967951 100644 --- a/test/TestAsset/ParamAwareCommandStub80.php +++ b/test/TestAsset/ParamAwareCommandStub80.php @@ -4,19 +4,17 @@ namespace LaminasTest\Cli\TestAsset; +use Closure; + class ParamAwareCommandStub80 extends AbstractParamAwareCommandStub { - /** - * @param string|array|null $shortcut - * @param null|mixed $default Defaults to null. - * @return $this - */ public function addOption( string $name, - $shortcut = null, - ?int $mode = null, + string|array|null $shortcut = null, + int|null $mode = null, string $description = '', - $default = null + mixed $default = null, + array|Closure $suggestedValues = [] ): static { return $this->doAddOption($name, $shortcut, $mode, $description, $default); }