mirror of
https://github.com/symfony/console.git
synced 2026-04-27 02:58:15 +02:00
112 lines
4.2 KiB
PHP
112 lines
4.2 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Console\Tests\Command;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Console\Application;
|
|
use Symfony\Component\Console\Command\TraceableCommand;
|
|
use Symfony\Component\Console\Tester\CommandTester;
|
|
use Symfony\Component\Console\Tests\Fixtures\InvokableTestCommand;
|
|
use Symfony\Component\Console\Tests\Fixtures\InvokableWithAskCommand;
|
|
use Symfony\Component\Console\Tests\Fixtures\LoopExampleCommand;
|
|
use Symfony\Component\Stopwatch\Stopwatch;
|
|
|
|
class TraceableCommandTest extends TestCase
|
|
{
|
|
private Application $application;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
$this->application = new Application();
|
|
$this->application->addCommand(new LoopExampleCommand());
|
|
$this->application->addCommand(new InvokableTestCommand());
|
|
}
|
|
|
|
public function testRunIsOverriddenWithoutProfile()
|
|
{
|
|
$command = $this->application->find('app:loop:example');
|
|
$commandTester = new CommandTester($command);
|
|
$commandTester->execute([]);
|
|
$commandTester->assertCommandIsSuccessful();
|
|
|
|
$output = $commandTester->getDisplay();
|
|
$this->assertLoopOutputCorrectness($output);
|
|
}
|
|
|
|
public function testRunIsNotOverriddenWithProfile()
|
|
{
|
|
// Simulate the bug environment by wrapping
|
|
// our command in TraceableCommand, which is what Symfony does
|
|
// when you use the --profile option.
|
|
$command = new LoopExampleCommand();
|
|
$traceableCommand = new TraceableCommand($command, new Stopwatch());
|
|
|
|
$this->application->addCommand($traceableCommand);
|
|
|
|
$commandTester = new CommandTester($traceableCommand);
|
|
$commandTester->execute([]);
|
|
$commandTester->assertCommandIsSuccessful();
|
|
|
|
$output = $commandTester->getDisplay();
|
|
$this->assertLoopOutputCorrectness($output);
|
|
}
|
|
|
|
public function testRunOnInvokableCommand()
|
|
{
|
|
$command = $this->application->find('invokable:test');
|
|
$traceableCommand = new TraceableCommand($command, new Stopwatch());
|
|
|
|
$commandTester = new CommandTester($traceableCommand);
|
|
$commandTester->execute([]);
|
|
$commandTester->assertCommandIsSuccessful();
|
|
}
|
|
|
|
public function testRunOnInvokableCommandWithAskAttribute()
|
|
{
|
|
$this->application->addCommand(new InvokableWithAskCommand());
|
|
$command = $this->application->find('invokable:ask');
|
|
$traceableCommand = new TraceableCommand($command, new Stopwatch());
|
|
|
|
$commandTester = new CommandTester($traceableCommand);
|
|
$commandTester->setInputs(['World']);
|
|
$commandTester->execute([], ['interactive' => true]);
|
|
$commandTester->assertCommandIsSuccessful();
|
|
|
|
self::assertStringContainsString('What is your name?', $commandTester->getDisplay());
|
|
self::assertStringContainsString('Hello World', $commandTester->getDisplay());
|
|
}
|
|
|
|
public function testArgumentsCaptureValueSetDuringInteract()
|
|
{
|
|
$this->application->addCommand(new InvokableWithAskCommand());
|
|
$command = $this->application->find('invokable:ask');
|
|
$traceableCommand = new TraceableCommand($command, new Stopwatch());
|
|
|
|
$commandTester = new CommandTester($traceableCommand);
|
|
$commandTester->setInputs(['Robin']);
|
|
$commandTester->execute([], ['interactive' => true]);
|
|
$commandTester->assertCommandIsSuccessful();
|
|
|
|
self::assertSame('Robin', $traceableCommand->arguments['name']);
|
|
self::assertTrue($traceableCommand->isInteractive);
|
|
self::assertSame(['name' => 'Robin'], $traceableCommand->interactiveInputs);
|
|
}
|
|
|
|
public function assertLoopOutputCorrectness(string $output)
|
|
{
|
|
$completeChar = '\\' !== \DIRECTORY_SEPARATOR ? '▓' : '=';
|
|
self::assertMatchesRegularExpression('~3/3\s+\['.$completeChar.'+]\s+100%~u', $output);
|
|
self::assertStringContainsString('Loop finished.', $output);
|
|
self::assertEquals(3, substr_count($output, 'Hello world'));
|
|
}
|
|
}
|