From b030c24263b3a9b951287bd23e3dff4295dda5a5 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 6 Nov 2015 19:48:00 +0100 Subject: [PATCH] [Console] ProgressBar - adjust to the window width (static) --- src/Symfony/Component/Console/Application.php | 103 ++---------- .../Component/Console/Helper/ProgressBar.php | 77 ++++++--- .../Terminal/TerminalDimensionsProvider.php | 152 ++++++++++++++++++ .../Console/Tests/Helper/ProgressBarTest.php | 80 +++++---- .../TerminalDimensionsProviderTest.php | 38 +++++ 5 files changed, 307 insertions(+), 143 deletions(-) create mode 100644 src/Symfony/Component/Console/Terminal/TerminalDimensionsProvider.php create mode 100644 src/Symfony/Component/Console/Tests/Terminal/TerminalDimensionsProviderTest.php diff --git a/src/Symfony/Component/Console/Application.php b/src/Symfony/Component/Console/Application.php index 9bbdb96233..8f9ff366b3 100644 --- a/src/Symfony/Component/Console/Application.php +++ b/src/Symfony/Component/Console/Application.php @@ -36,6 +36,7 @@ use Symfony\Component\Console\Event\ConsoleExceptionEvent; use Symfony\Component\Console\Event\ConsoleTerminateEvent; use Symfony\Component\Console\Exception\CommandNotFoundException; use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Terminal\TerminalDimensionsProvider; use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** @@ -65,20 +66,24 @@ class Application private $definition; private $helperSet; private $dispatcher; - private $terminalDimensions; private $defaultCommand; private $singleCommand; /** - * Constructor. - * - * @param string $name The name of the application - * @param string $version The version of the application + * @var TerminalDimensionsProvider */ - public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') + private $terminalDimensionsProvider; + + /** + * @param string $name The name of the application + * @param string $version The version of the application + * @param TerminalDimensionsProvider $terminalDimensionsProvider + */ + public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN', TerminalDimensionsProvider $terminalDimensionsProvider = null) { $this->name = $name; $this->version = $version; + $this->terminalDimensionsProvider = $terminalDimensionsProvider ?: new TerminalDimensionsProvider(); $this->defaultCommand = 'list'; $this->helperSet = $this->getDefaultHelperSet(); $this->definition = $this->getDefaultInputDefinition(); @@ -692,9 +697,7 @@ class Application */ protected function getTerminalWidth() { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[0]; + return $this->terminalDimensionsProvider->getTerminalWidth(); } /** @@ -704,9 +707,7 @@ class Application */ protected function getTerminalHeight() { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[1]; + return $this->terminalDimensionsProvider->getTerminalWidth(); } /** @@ -716,33 +717,7 @@ class Application */ public function getTerminalDimensions() { - if ($this->terminalDimensions) { - return $this->terminalDimensions; - } - - if ('\\' === DIRECTORY_SEPARATOR) { - // extract [w, H] from "wxh (WxH)" - if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { - return array((int) $matches[1], (int) $matches[2]); - } - // extract [w, h] from "wxh" - if (preg_match('/^(\d+)x(\d+)$/', $this->getConsoleMode(), $matches)) { - return array((int) $matches[1], (int) $matches[2]); - } - } - - if ($sttyString = $this->getSttyColumns()) { - // extract [w, h] from "rows h; columns w;" - if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { - return array((int) $matches[2], (int) $matches[1]); - } - // extract [w, h] from "; h rows; w columns" - if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { - return array((int) $matches[2], (int) $matches[1]); - } - } - - return array(null, null); + return $this->terminalDimensionsProvider->getTerminalDimensions(); } /** @@ -757,7 +732,7 @@ class Application */ public function setTerminalDimensions($width, $height) { - $this->terminalDimensions = array($width, $height); + $this->terminalDimensionsProvider->setTerminalDimensions($width, $height); return $this; } @@ -927,54 +902,6 @@ class Application )); } - /** - * Runs and parses stty -a if it's available, suppressing any error output. - * - * @return string - */ - private function getSttyColumns() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')); - $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } - } - - /** - * Runs and parses mode CON if it's available, suppressing any error output. - * - * @return string x or null if it could not be parsed - */ - private function getConsoleMode() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')); - $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - return $matches[2].'x'.$matches[1]; - } - } - } - /** * Returns abbreviated suggestions in string format. * diff --git a/src/Symfony/Component/Console/Helper/ProgressBar.php b/src/Symfony/Component/Console/Helper/ProgressBar.php index 3c067145e0..e6c9ad03e4 100644 --- a/src/Symfony/Component/Console/Helper/ProgressBar.php +++ b/src/Symfony/Component/Console/Helper/ProgressBar.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Console\Helper; use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Terminal\TerminalDimensionsProvider; /** * The ProgressBar provides helpers to display progress output. @@ -49,12 +50,16 @@ class ProgressBar private static $formats; /** - * Constructor. - * - * @param OutputInterface $output An OutputInterface instance - * @param int $max Maximum steps (0 if unknown) + * @var TerminalDimensionsProvider */ - public function __construct(OutputInterface $output, $max = 0) + private $terminalDimensionsProvider; + + /** + * @param OutputInterface $output An OutputInterface instance + * @param int $max Maximum steps (0 if unknown) + * @param TerminalDimensionsProvider $terminalDimensionsProvider + */ + public function __construct(OutputInterface $output, $max = 0, TerminalDimensionsProvider $terminalDimensionsProvider = null) { if ($output instanceof ConsoleOutputInterface) { $output = $output->getErrorOutput(); @@ -62,6 +67,7 @@ class ProgressBar $this->output = $output; $this->setMaxSteps($max); + $this->terminalDimensionsProvider = $terminalDimensionsProvider ?: new TerminalDimensionsProvider(); if (!$this->output->isDecorated()) { // disable overwrite when output does not support ANSI codes. @@ -217,7 +223,7 @@ class ProgressBar */ public function setBarWidth($size) { - $this->barWidth = (int) $size; + $this->barWidth = max(1, (int) $size); } /** @@ -412,21 +418,9 @@ class ProgressBar $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); } - $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) { - if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { - $text = call_user_func($formatter, $this, $this->output); - } elseif (isset($this->messages[$matches[1]])) { - $text = $this->messages[$matches[1]]; - } else { - return $matches[0]; - } - - if (isset($matches[2])) { - $text = sprintf('%'.$matches[2], $text); - } - - return $text; - }, $this->format)); + $line = $this->buildLine(); + $line = $this->adjustLineWidthToTerminalWidth($line); + $this->overwrite($line); } /** @@ -592,4 +586,45 @@ class ProgressBar 'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%', ); } + + /** + * @return string + */ + private function buildLine() + { + return preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) { + if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { + $text = call_user_func($formatter, $this, $this->output); + } elseif (isset($this->messages[$matches[1]])) { + $text = $this->messages[$matches[1]]; + } else { + return $matches[0]; + } + + if (isset($matches[2])) { + $text = sprintf('%'.$matches[2], $text); + } + + return $text; + }, $this->format); + } + + /** + * @param string $line + * + * @return bool + */ + private function adjustLineWidthToTerminalWidth($line) + { + $lineLength = Helper::strlenWithoutDecoration($this->output->getFormatter(), $line); + $terminalWidth = $this->terminalDimensionsProvider->getTerminalWidth(); + if ($lineLength > $terminalWidth) { + $newBarWidth = $this->barWidth - $lineLength + $terminalWidth; + $this->setBarWidth($newBarWidth); + + return $this->buildLine(); + } + + return $line; + } } diff --git a/src/Symfony/Component/Console/Terminal/TerminalDimensionsProvider.php b/src/Symfony/Component/Console/Terminal/TerminalDimensionsProvider.php new file mode 100644 index 0000000000..06d478a2ae --- /dev/null +++ b/src/Symfony/Component/Console/Terminal/TerminalDimensionsProvider.php @@ -0,0 +1,152 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Terminal; + +class TerminalDimensionsProvider +{ + /** + * @var int[] + */ + private $terminalDimensions = array(); + + /** + * Tries to figure out the terminal dimensions based on the current environment. + * + * @return int[] Array containing width and height + */ + public function getTerminalDimensions() + { + if ($this->terminalDimensions) { + return $this->terminalDimensions; + } + + if ($this->isWindowsEnvironment()) { + // extract [w, H] from "wxh (WxH)" + if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { + return array((int) $matches[1], (int) $matches[2]); + } + // extract [w, h] from "wxh" + if (preg_match('/^(\d+)x(\d+)$/', $this->getConsoleMode(), $matches)) { + return array((int) $matches[1], (int) $matches[2]); + } + } + + if ($sttyString = $this->getSttyColumns()) { + // extract [w, h] from "rows h; columns w;" + if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { + return array((int) $matches[2], (int) $matches[1]); + } + // extract [w, h] from "; h rows; w columns" + if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { + return array((int) $matches[2], (int) $matches[1]); + } + } + + return array(null, null); + } + + /** + * Tries to figure out the terminal width in which this application runs. + * + * @return int|null + */ + public function getTerminalWidth() + { + return $this->getTerminalDimensions()[0]; + } + + /** + * Tries to figure out the terminal height in which this application runs. + * + * @return int|null + */ + public function getTerminalHeight() + { + return $this->getTerminalDimensions()[1]; + } + + /** + * Sets terminal dimensions. + * + * Can be useful to force terminal dimensions for functional tests. + * + * @param int $width + * @param int $height + */ + public function setTerminalDimensions($width, $height) + { + $this->terminalDimensions = array($width, $height); + } + + /** + * Runs and parses mode CON if it's available, suppressing any error output. + * + * @return string x or null if it could not be parsed + */ + private function getConsoleMode() + { + if (!function_exists('proc_open')) { + return; + } + + $descriptorspec = array( + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w'), + ); + $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); + if (is_resource($process)) { + $info = stream_get_contents($pipes[1]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($process); + + if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { + return $matches[2].'x'.$matches[1]; + } + } + } + + /** + * Runs and parses stty -a if it's available, suppressing any error output. + * + * @return string + */ + private function getSttyColumns() + { + if (!function_exists('proc_open')) { + return; + } + + $descriptorspec = array( + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w'), + ); + + $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); + if (is_resource($process)) { + $info = stream_get_contents($pipes[1]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($process); + + return $info; + } + } + + /** + * @return bool + */ + private function isWindowsEnvironment() + { + return '\\' === DIRECTORY_SEPARATOR; + } +} diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php index 261908b542..4488b001b2 100644 --- a/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php @@ -14,6 +14,7 @@ namespace Symfony\Component\Console\Tests\Helper; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Helper; use Symfony\Component\Console\Output\StreamOutput; +use Symfony\Component\Console\Terminal\TerminalDimensionsProvider; /** * @group time-sensitive @@ -22,7 +23,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase { public function testMultipleStart() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(); $bar->start(); @@ -38,7 +39,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testAdvance() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(); @@ -52,7 +53,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testAdvanceWithStep() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(5); @@ -66,7 +67,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testAdvanceMultipleTimes() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(3); $bar->advance(2); @@ -82,7 +83,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testAdvanceOverMax() { - $bar = new ProgressBar($output = $this->getOutputStream(), 10); + $bar = new ProgressBar($output = $this->getOutputStream(), 10, $this->createTerminalDimensionsProvider()); $bar->setProgress(9); $bar->advance(); $bar->advance(); @@ -105,7 +106,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase ; // max in construct, no format - $bar = new ProgressBar($output = $this->getOutputStream(), 10); + $bar = new ProgressBar($output = $this->getOutputStream(), 10, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(10); $bar->finish(); @@ -114,7 +115,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, stream_get_contents($output->getStream())); // max in start, no format - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->start(10); $bar->advance(10); $bar->finish(); @@ -123,7 +124,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, stream_get_contents($output->getStream())); // max in construct, explicit format before - $bar = new ProgressBar($output = $this->getOutputStream(), 10); + $bar = new ProgressBar($output = $this->getOutputStream(), 10, $this->createTerminalDimensionsProvider()); $bar->setFormat('normal'); $bar->start(); $bar->advance(10); @@ -133,7 +134,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expected, stream_get_contents($output->getStream())); // max in start, explicit format before - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->setFormat('normal'); $bar->start(10); $bar->advance(10); @@ -145,7 +146,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testCustomizations() { - $bar = new ProgressBar($output = $this->getOutputStream(), 10); + $bar = new ProgressBar($output = $this->getOutputStream(), 10, $this->createTerminalDimensionsProvider()); $bar->setBarWidth(10); $bar->setBarCharacter('_'); $bar->setEmptyBarCharacter(' '); @@ -164,7 +165,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testDisplayWithoutStart() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->display(); rewind($output->getStream()); @@ -176,7 +177,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testDisplayWithQuietVerbosity() { - $bar = new ProgressBar($output = $this->getOutputStream(true, StreamOutput::VERBOSITY_QUIET), 50); + $bar = new ProgressBar($output = $this->getOutputStream(true, StreamOutput::VERBOSITY_QUIET), 50, $this->createTerminalDimensionsProvider()); $bar->display(); rewind($output->getStream()); @@ -188,7 +189,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testFinishWithoutStart() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->finish(); rewind($output->getStream()); @@ -200,7 +201,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testPercent() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->display(); $bar->advance(); @@ -218,7 +219,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testOverwriteWithShorterLine() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->setFormat(' %current%/%max% [%bar%] %percent:3s%%'); $bar->start(); $bar->display(); @@ -240,7 +241,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testStartWithMax() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->setFormat('%current%/%max% [%bar%]'); $bar->start(50); $bar->advance(); @@ -255,7 +256,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testSetCurrentProgress() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->display(); $bar->advance(); @@ -288,7 +289,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase */ public function testRegressProgress() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->setProgress(15); $bar->setProgress(10); @@ -329,7 +330,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testMultiByteSupport() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->setBarCharacter('■'); $bar->advance(3); @@ -344,7 +345,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testClear() { - $bar = new ProgressBar($output = $this->getOutputStream(), 50); + $bar = new ProgressBar($output = $this->getOutputStream(), 50, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->setProgress(25); $bar->clear(); @@ -360,7 +361,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testPercentNotHundredBeforeComplete() { - $bar = new ProgressBar($output = $this->getOutputStream(), 200); + $bar = new ProgressBar($output = $this->getOutputStream(), 200, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->display(); $bar->advance(199); @@ -378,7 +379,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testNonDecoratedOutput() { - $bar = new ProgressBar($output = $this->getOutputStream(false), 200); + $bar = new ProgressBar($output = $this->getOutputStream(false), 200, $this->createTerminalDimensionsProvider()); $bar->start(); for ($i = 0; $i < 200; ++$i) { @@ -406,7 +407,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testNonDecoratedOutputWithClear() { - $bar = new ProgressBar($output = $this->getOutputStream(false), 50); + $bar = new ProgressBar($output = $this->getOutputStream(false), 50, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->setProgress(25); $bar->clear(); @@ -424,7 +425,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testNonDecoratedOutputWithoutMax() { - $bar = new ProgressBar($output = $this->getOutputStream(false)); + $bar = new ProgressBar($output = $this->getOutputStream(false), 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(); @@ -439,10 +440,10 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testParallelBars() { $output = $this->getOutputStream(); - $bar1 = new ProgressBar($output, 2); - $bar2 = new ProgressBar($output, 3); + $bar1 = new ProgressBar($output, 2, $this->createTerminalDimensionsProvider()); + $bar2 = new ProgressBar($output, 3, $this->createTerminalDimensionsProvider()); $bar2->setProgressCharacter('#'); - $bar3 = new ProgressBar($output); + $bar3 = new ProgressBar($output, 0, $this->createTerminalDimensionsProvider()); $bar1->start(); $output->write("\n"); @@ -499,7 +500,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase { $output = $this->getOutputStream(); - $bar = new ProgressBar($output); + $bar = new ProgressBar($output, 0, $this->createTerminalDimensionsProvider()); $bar->start(); $bar->advance(); $bar->advance(); @@ -522,7 +523,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase ProgressBar::setPlaceholderFormatterDefinition('remaining_steps', function (ProgressBar $bar) { return $bar->getMaxSteps() - $bar->getProgress(); }); - $bar = new ProgressBar($output = $this->getOutputStream(), 3); + $bar = new ProgressBar($output = $this->getOutputStream(), 3, $this->createTerminalDimensionsProvider()); $bar->setFormat(' %remaining_steps% [%bar%]'); $bar->start(); @@ -540,7 +541,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testMultilineFormat() { - $bar = new ProgressBar($output = $this->getOutputStream(), 3); + $bar = new ProgressBar($output = $this->getOutputStream(), 3, $this->createTerminalDimensionsProvider()); $bar->setFormat("%bar%\nfoobar"); $bar->start(); @@ -560,7 +561,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testAnsiColorsAndEmojis() { - $bar = new ProgressBar($output = $this->getOutputStream(), 15); + $bar = new ProgressBar($output = $this->getOutputStream(), 15, $this->createTerminalDimensionsProvider()); ProgressBar::setPlaceholderFormatterDefinition('memory', function (ProgressBar $bar) { static $i = 0; $mem = 100000 * $i; @@ -603,7 +604,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase public function testSetFormat() { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->setFormat('normal'); $bar->start(); rewind($output->getStream()); @@ -612,7 +613,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase stream_get_contents($output->getStream()) ); - $bar = new ProgressBar($output = $this->getOutputStream(), 10); + $bar = new ProgressBar($output = $this->getOutputStream(), 10, $this->createTerminalDimensionsProvider()); $bar->setFormat('normal'); $bar->start(); rewind($output->getStream()); @@ -627,7 +628,7 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase */ public function testFormatsWithoutMax($format) { - $bar = new ProgressBar($output = $this->getOutputStream()); + $bar = new ProgressBar($output = $this->getOutputStream(), 0, $this->createTerminalDimensionsProvider()); $bar->setFormat($format); $bar->start(); @@ -661,4 +662,15 @@ class ProgressBarTest extends \PHPUnit_Framework_TestCase return "\x0D\x1B[2K".($count ? str_repeat("\x1B[1A\x1B[2K", $count) : '').$expected; } + + /** + * @return TerminalDimensionsProvider + */ + private function createTerminalDimensionsProvider() + { + $terminalDimensionsProvider = new TerminalDimensionsProvider(); + $terminalDimensionsProvider->setTerminalDimensions(800, 5); + + return $terminalDimensionsProvider; + } } diff --git a/src/Symfony/Component/Console/Tests/Terminal/TerminalDimensionsProviderTest.php b/src/Symfony/Component/Console/Tests/Terminal/TerminalDimensionsProviderTest.php new file mode 100644 index 0000000000..0dbd656bfa --- /dev/null +++ b/src/Symfony/Component/Console/Tests/Terminal/TerminalDimensionsProviderTest.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Tests\Terminal; + +use PHPUnit_Framework_TestCase; +use Symfony\Component\Console\Terminal\TerminalDimensionsProvider; +use Symfony\Component\Console\Terminal\TerminalDimensionsProviderInterface; + +class TerminalDimensionsProviderTest extends PHPUnit_Framework_TestCase +{ + /** + * @var TerminalDimensionsProviderInterface + */ + private $terminalDimensionsProvider; + + protected function setUp() + { + $this->terminalDimensionsProvider = new TerminalDimensionsProvider(); + } + + public function testGetTerminalDimensions() + { + $dimensions = $this->terminalDimensionsProvider->getTerminalDimensions(); + $this->assertCount(2, $dimensions); + + $this->terminalDimensionsProvider->setTerminalDimensions(100, 50); + $this->assertSame(array(100, 50), $this->terminalDimensionsProvider->getTerminalDimensions()); + } +}