Skip to content

Commit

Permalink
Reset question validator attempts only for actual stdin
Browse files Browse the repository at this point in the history
  • Loading branch information
ostrolucky committed Jun 8, 2020
1 parent 4d6a02a commit 8f9f1a9
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
8 changes: 5 additions & 3 deletions src/Symfony/Component/Console/Helper/QuestionHelper.php
Expand Up @@ -509,14 +509,16 @@ private function getShell()

private function isTty(): bool
{
$inputStream = !$this->inputStream && \defined('STDIN') ? STDIN : $this->inputStream;
if (!\defined('STDIN')) {
return true;
}

if (\function_exists('stream_isatty')) {
return stream_isatty($inputStream);
return stream_isatty(STDIN);
}

if (\function_exists('posix_isatty')) {
return posix_isatty($inputStream);
return posix_isatty(STDIN);
}

return true;
Expand Down
34 changes: 34 additions & 0 deletions src/Symfony/Component/Console/Tests/Helper/QuestionHelperTest.php
Expand Up @@ -11,6 +11,7 @@

namespace Symfony\Component\Console\Tests\Helper;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Exception\InvalidArgumentException;
use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Helper\FormatterHelper;
Expand All @@ -21,6 +22,7 @@
use Symfony\Component\Console\Question\ConfirmationQuestion;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Terminal;
use Symfony\Component\Console\Tester\ApplicationTester;

/**
* @group tty
Expand Down Expand Up @@ -844,6 +846,38 @@ public function testTraversableMultiselectAutocomplete()
$this->assertEquals(['AcmeDemoBundle', 'AsseticBundle'], $dialog->ask($this->createStreamableInputInterfaceMock($inputStream), $this->createOutputInterface(), $question));
}

public function testQuestionValidatorRepeatsThePrompt()
{
$tries = 0;
$application = new Application();
$application->setAutoExit(false);
$application->register('question')
->setCode(function ($input, $output) use (&$tries) {
$question = new Question('This is a promptable question');
$question->setValidator(function ($value) use (&$tries) {
$tries++;
if (!$value) {
throw new \Exception();
}

return $value;
});

(new QuestionHelper())->ask($input, $output, $question);

return 0;
})
;

$tester = new ApplicationTester($application);
$tester->setInputs(['', 'not-empty']);

$statusCode = $tester->run(['command' => 'question'], ['interactive' => true]);

$this->assertSame(2, $tries);
$this->assertSame($statusCode, 0);
}

protected function getInputStream($input)
{
$stream = fopen('php://memory', 'r+', false);
Expand Down

0 comments on commit 8f9f1a9

Please sign in to comment.