1
0
Fork 0
composer/tests/Composer/Test/CompletionFunctionalTest.php

113 lines
3.6 KiB
PHP
Raw Normal View History

2022-08-17 12:20:07 +00:00
<?php declare(strict_types=1);
2021-11-30 00:03:23 +00:00
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Test;
use Composer\Console\Application;
use Symfony\Component\Console\Tester\CommandCompletionTester;
/**
* Validate autocompletion for all commands.
*
* @author Jérôme Tamarelle <jerome@tamarelle.net>
*/
class CompletionFunctionalTest extends TestCase
{
2022-04-15 13:11:01 +00:00
/**
* @return iterable<array<string|string[]|null>>
*/
2021-11-30 00:03:23 +00:00
public function getCommandSuggestions(): iterable
{
2022-05-13 07:52:02 +00:00
$randomVendor = 'a/';
2021-11-30 00:03:23 +00:00
$installedPackages = ['composer/semver', 'psr/log'];
$preferInstall = ['dist', 'source', 'auto'];
2022-05-13 07:52:02 +00:00
yield ['archive ', [$randomVendor]];
2021-11-30 00:03:23 +00:00
yield ['archive symfony/http-', ['symfony/http-kernel', 'symfony/http-foundation']];
yield ['archive --format ', ['tar', 'zip']];
2022-05-13 07:52:02 +00:00
yield ['create-project ', [$randomVendor]];
2021-11-30 00:03:23 +00:00
yield ['create-project symfony/skeleton --prefer-install ', $preferInstall];
yield ['depends ', $installedPackages];
yield ['why ', $installedPackages];
2022-05-13 07:52:02 +00:00
yield ['exec ', ['composer', 'jsonlint', 'phpstan', 'phpstan.phar', 'simple-phpunit', 'validate-json']];
2021-11-30 00:03:23 +00:00
yield ['browse ', $installedPackages];
yield ['home -H ', $installedPackages];
2022-05-13 07:52:02 +00:00
yield ['init --require ', [$randomVendor]];
yield ['init --require-dev foo/bar --require-dev ', [$randomVendor]];
2021-11-30 00:03:23 +00:00
yield ['install --prefer-install ', $preferInstall];
yield ['install ', null];
2021-11-30 00:03:23 +00:00
yield ['outdated ', $installedPackages];
2022-05-13 07:52:02 +00:00
yield ['prohibits ', [$randomVendor]];
2021-11-30 00:03:23 +00:00
yield ['why-not symfony/http-ker', ['symfony/http-kernel']];
yield ['reinstall --prefer-install ', $preferInstall];
yield ['reinstall ', $installedPackages];
yield ['remove ', $installedPackages];
yield ['require --prefer-install ', $preferInstall];
2022-05-13 07:52:02 +00:00
yield ['require ', [$randomVendor]];
2021-11-30 00:03:23 +00:00
yield ['require --dev symfony/http-', ['symfony/http-kernel', 'symfony/http-foundation']];
yield ['run-script ', ['compile', 'test', 'phpstan']];
yield ['run-script test ', null];
yield ['search --format ', ['text', 'json']];
yield ['show --format ', ['text', 'json']];
yield ['info ', $installedPackages];
yield ['suggests ', $installedPackages];
yield ['update --prefer-install ', $preferInstall];
yield ['update ', $installedPackages];
}
/**
* @dataProvider getCommandSuggestions
*
* @param string $input The command that is typed
* @param string[]|null $expectedSuggestions Sample expected suggestions. Null if nothing is expected.
*/
public function testComplete(string $input, ?array $expectedSuggestions): void
{
$input = explode(' ', $input);
$commandName = array_shift($input);
$command = $this->getApplication()->get($commandName);
$tester = new CommandCompletionTester($command);
$suggestions = $tester->complete($input);
if (null === $expectedSuggestions) {
$this->assertEmpty($suggestions);
return;
}
$diff = array_diff($expectedSuggestions, $suggestions);
$this->assertEmpty($diff, sprintf('Suggestions must contain "%s". Got "%s".', implode('", "', $diff), implode('", "', $suggestions)));
}
private function getApplication(): Application
{
return new Application();
}
}