Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f4c5518

Browse files
committed
[Console] fix clear of section with question
1 parent 4cf9855 commit f4c5518

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

src/Symfony/Component/Console/Output/ConsoleSectionOutput.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ public function addContent(string $input, bool $newline = true): int
115115
// re-add the line break (that has been removed in the above `explode()` for
116116
// - every line that is not the last line
117117
// - if $newline is required, also add it to the last line
118-
if ($i < $count || $newline) {
118+
// - if it's not new line, but input ending with `\PHP_EOL`
119+
if ($i < $count || $newline || str_ends_with($input, \PHP_EOL)) {
119120
$lineContent .= \PHP_EOL;
120121
}
121122

@@ -149,6 +150,15 @@ public function addContent(string $input, bool $newline = true): int
149150
return $linesAdded;
150151
}
151152

153+
/**
154+
* @internal
155+
*/
156+
public function addNewLineOfInputSubmit()
157+
{
158+
$this->content[] = \PHP_EOL;
159+
++$this->lines;
160+
}
161+
152162
protected function doWrite(string $message, bool $newline)
153163
{
154164
if (!$this->isDecorated()) {

src/Symfony/Component/Console/Style/SymfonyStyle.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Symfony\Component\Console\Helper\TableSeparator;
2424
use Symfony\Component\Console\Input\InputInterface;
2525
use Symfony\Component\Console\Output\ConsoleOutputInterface;
26+
use Symfony\Component\Console\Output\ConsoleSectionOutput;
2627
use Symfony\Component\Console\Output\OutputInterface;
2728
use Symfony\Component\Console\Output\TrimmedBufferOutput;
2829
use Symfony\Component\Console\Question\ChoiceQuestion;
@@ -298,6 +299,11 @@ public function askQuestion(Question $question): mixed
298299
$answer = $this->questionHelper->ask($this->input, $this, $question);
299300

300301
if ($this->input->isInteractive()) {
302+
if ($this->output instanceof ConsoleSectionOutput) {
303+
// add the new line of the `return` to submit the input to ConsoleSectionOutput, because ConsoleSectionOutput is holding all it's lines.
304+
// this is relevant when a `ConsoleSectionOutput::clear` is called.
305+
$this->output->addNewLineOfInputSubmit();
306+
}
301307
$this->newLine();
302308
$this->bufferedOutput->write("\n");
303309
}

src/Symfony/Component/Console/Tests/Style/SymfonyStyleTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
use Symfony\Component\Console\Exception\RuntimeException;
1717
use Symfony\Component\Console\Formatter\OutputFormatter;
1818
use Symfony\Component\Console\Input\ArrayInput;
19+
use Symfony\Component\Console\Input\Input;
1920
use Symfony\Component\Console\Input\InputInterface;
2021
use Symfony\Component\Console\Output\ConsoleOutputInterface;
2122
use Symfony\Component\Console\Output\ConsoleSectionOutput;
2223
use Symfony\Component\Console\Output\NullOutput;
2324
use Symfony\Component\Console\Output\OutputInterface;
25+
use Symfony\Component\Console\Output\StreamOutput;
2426
use Symfony\Component\Console\Style\SymfonyStyle;
2527
use Symfony\Component\Console\Tester\CommandTester;
2628

@@ -181,4 +183,44 @@ public function testMemoryConsumption()
181183

182184
$this->assertSame(0, memory_get_usage() - $start);
183185
}
186+
187+
public function testAskAndClearExpectFullSectionCleared()
188+
{
189+
$answer = 'Answer';
190+
$inputStream = fopen('php://memory', 'r+');
191+
fwrite($inputStream, $answer.\PHP_EOL);
192+
rewind($inputStream);
193+
$input = $this->createMock(Input::class);
194+
$sections = [];
195+
$output = new ConsoleSectionOutput(fopen('php://memory', 'r+', false), $sections, StreamOutput::VERBOSITY_NORMAL, true, new OutputFormatter());
196+
$input
197+
->method('isInteractive')
198+
->willReturn(true);
199+
$input
200+
->method('getStream')
201+
->willReturn($inputStream);
202+
203+
$style = new SymfonyStyle($input, $output);
204+
205+
$style->writeln('start');
206+
$style->write('foo');
207+
$style->writeln(' and bar');
208+
$givenAnswer = $style->ask('Dummy question?');
209+
$style->write('foo2'.\PHP_EOL);
210+
$output->write('bar2');
211+
$output->clear();
212+
213+
rewind($output->getStream());
214+
$this->assertEquals($answer, $givenAnswer);
215+
$this->assertEquals(
216+
'start'.\PHP_EOL. // write start
217+
'foo'.\PHP_EOL. // write foo
218+
"\x1b[1A\x1b[0Jfoo and bar".\PHP_EOL. // complete line
219+
\PHP_EOL.\PHP_EOL." \033[32mDummy question?\033[39m:".\PHP_EOL.' > '.\PHP_EOL.\PHP_EOL.\PHP_EOL. // question
220+
'foo2'.\PHP_EOL.\PHP_EOL. // write foo2
221+
'bar2'.\PHP_EOL. // write bar
222+
"\033[12A\033[0J", // clear 12 lines (11 output lines and one from the answer input return)
223+
stream_get_contents($output->getStream())
224+
);
225+
}
184226
}

0 commit comments

Comments
 (0)