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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy