From abacef0320ff92cd14de0e99c8cf9fa205837403 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Fri, 3 Oct 2014 15:09:12 -0400 Subject: [PATCH 1/8] added progress indicator helper --- .../Console/Helper/ProgressIndicator.php | 267 ++++++++++++++++++ .../Tests/Helper/ProgressIndicatorTest.php | 124 ++++++++ 2 files changed, 391 insertions(+) create mode 100644 src/Symfony/Component/Console/Helper/ProgressIndicator.php create mode 100644 src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php new file mode 100644 index 0000000000000..e2934c4dcb75e --- /dev/null +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -0,0 +1,267 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Helper; + +use Symfony\Component\Console\Output\OutputInterface; + +/** + * @author Kevin Bond + */ +class ProgressIndicator +{ + private $output; + private $startTime; + private $format; + private $message = null; + private $indicatorValues = array('-', '\\', '|', '/'); + private $indicatorCurrent = 0; + private $lastMessagesLength = 0; + + private static $formatters; + private static $formats; + + /** + * @param OutputInterface $output + */ + public function __construct(OutputInterface $output) + { + $this->output = $output; + $this->startTime = time(); + + $this->setFormat($this->determineBestFormat()); + } + + /** + * @param string $format + */ + public function setFormat($format) + { + $this->format = self::getFormatDefinition($format); + } + + /** + * @param string|null $message + */ + public function setMessage($message) + { + $this->message = $message; + + $this->display(); + } + + /** + * @return string|null + */ + public function getMessage() + { + return $this->message; + } + + /** + * @param array $values + */ + public function setIndicatorValues(array $values) + { + $values = array_values($values); + + if (empty($values)) { + throw new \InvalidArgumentException('Must have at least 1 value.'); + } + + $this->indicatorValues = $values; + } + + /** + * Gets the progress bar start time. + * + * @return int The progress bar start time + */ + public function getStartTime() + { + return $this->startTime; + } + + /** + * @return string + */ + public function getCurrentValue() + { + return $this->indicatorValues[$this->indicatorCurrent % count($this->indicatorValues)]; + } + + public function start($message) + { + $this->message = $message; + $this->startTime = time(); + $this->indicatorCurrent = 0; + + $this->display(); + } + + public function advance() + { + ++$this->indicatorCurrent; + + if ($this->output->isDecorated()) { + $this->display(); + } + } + + public function finish($message) + { + $this->message = $message; + $this->display(); + $this->output->writeln(''); + } + + /** + * Gets the format for a given name. + * + * @param string $name The format name + * + * @return string|null A format string + */ + public static function getFormatDefinition($name) + { + if (!self::$formats) { + self::$formats = self::initFormats(); + } + + return isset(self::$formats[$name]) ? self::$formats[$name] : null; + } + + /** + * Sets a placeholder formatter for a given name. + * + * This method also allow you to override an existing placeholder. + * + * @param string $name The placeholder name (including the delimiter char like %) + * @param callable $callable A PHP callable + */ + public static function setPlaceholderFormatterDefinition($name, $callable) + { + if (!self::$formatters) { + self::$formatters = self::initPlaceholderFormatters(); + } + + self::$formatters[$name] = $callable; + } + + /** + * Gets the placeholder formatter for a given name. + * + * @param string $name The placeholder name (including the delimiter char like %) + * + * @return callable|null A PHP callable + */ + public static function getPlaceholderFormatterDefinition($name) + { + if (!self::$formatters) { + self::$formatters = self::initPlaceholderFormatters(); + } + + return isset(self::$formatters[$name]) ? self::$formatters[$name] : null; + } + + private function display() + { + if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { + return; + } + + $self = $this; + + $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self) { + if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) { + return call_user_func($formatter, $self); + } + + return $matches[0]; + }, $this->format)); + } + + private function determineBestFormat() + { + switch ($this->output->getVerbosity()) { + // OutputInterface::VERBOSITY_QUIET: display is disabled anyway + case OutputInterface::VERBOSITY_VERBOSE: + return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi'; + case OutputInterface::VERBOSITY_VERY_VERBOSE: + case OutputInterface::VERBOSITY_DEBUG: + return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi'; + default: + return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi'; + } + } + + /** + * Overwrites a previous message to the output. + * + * @param string $message The message + */ + private function overwrite($message) + { + // append whitespace to match the line's length + if (null !== $this->lastMessagesLength) { + if ($this->lastMessagesLength > Helper::strlenWithoutDecoration($this->output->getFormatter(), $message)) { + $message = str_pad($message, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT); + } + } + + if ($this->output->isDecorated()) { + $this->output->write("\x0D"); + $this->output->write($message); + } else { + $this->output->writeln($message); + } + + $this->lastMessagesLength = 0; + + $len = Helper::strlenWithoutDecoration($this->output->getFormatter(), $message); + + if ($len > $this->lastMessagesLength) { + $this->lastMessagesLength = $len; + } + } + + private static function initPlaceholderFormatters() + { + return array( + 'indicator' => function (ProgressIndicator $indicator) { + return $indicator->getCurrentValue(); + }, + 'message' => function (ProgressIndicator $indicator) { + return $indicator->getMessage(); + }, + 'elapsed' => function (ProgressIndicator $indicator) { + return Helper::formatTime(time() - $indicator->getStartTime()); + }, + 'memory' => function () { + return Helper::formatMemory(memory_get_usage(true)); + }, + ); + } + + private static function initFormats() + { + return array( + 'normal' => ' %indicator% %message%', + 'normal_no_ansi' => ' %message%', + + 'verbose' => ' %indicator% %message% (%elapsed:6s%)', + 'verbose_no_ansi' => ' %message% (%elapsed:6s%)', + + 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)', + 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)', + ); + } +} diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php new file mode 100644 index 0000000000000..b196584502162 --- /dev/null +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php @@ -0,0 +1,124 @@ +getOutputStream()); + $bar->start('Starting...'); + $bar->advance(); + $bar->advance(); + $bar->advance(); + $bar->advance(); + $bar->advance(); + $bar->setMessage('Advancing...'); + $bar->advance(); + $bar->finish('Done...'); + + rewind($output->getStream()); + + $this->assertEquals( + $this->generateOutput(' - Starting...'). + $this->generateOutput(' \\ Starting...'). + $this->generateOutput(' | Starting...'). + $this->generateOutput(' / Starting...'). + $this->generateOutput(' - Starting...'). + $this->generateOutput(' \\ Starting...'). + $this->generateOutput(' \\ Advancing...'). + $this->generateOutput(' | Advancing...'). + $this->generateOutput(' | Done... '). + "\n", + stream_get_contents($output->getStream()) + ); + } + + public function testNonDecoratedOutput() + { + $bar = new ProgressIndicator($output = $this->getOutputStream(false)); + + $bar->start('Starting...'); + $bar->advance(); + $bar->advance(); + $bar->setMessage('Midway...'); + $bar->advance(); + $bar->advance(); + $bar->finish('Done...'); + + rewind($output->getStream()); + + $this->assertEquals( + ' Starting...'.PHP_EOL. + ' Midway... '.PHP_EOL. + ' Done... '.PHP_EOL.PHP_EOL, + stream_get_contents($output->getStream()) + ); + } + + public function testCustomIndicatorValues() + { + $bar = new ProgressIndicator($output = $this->getOutputStream()); + $bar->setIndicatorValues(array('a', 'b', 'c')); + + $bar->start('Starting...'); + $bar->advance(); + $bar->advance(); + $bar->advance(); + + rewind($output->getStream()); + + $this->assertEquals( + $this->generateOutput(' a Starting...'). + $this->generateOutput(' b Starting...'). + $this->generateOutput(' c Starting...'). + $this->generateOutput(' a Starting...'), + stream_get_contents($output->getStream()) + ); + } + + /** + * @dataProvider provideFormat + */ + public function testFormats($format) + { + $bar = new ProgressIndicator($output = $this->getOutputStream()); + $bar->setFormat($format); + $bar->start('Starting...'); + $bar->advance(); + + rewind($output->getStream()); + + $this->assertNotEmpty(stream_get_contents($output->getStream())); + } + + /** + * Provides each defined format. + * + * @return array + */ + public function provideFormat() + { + return array( + array('normal'), + array('verbose'), + array('very_verbose'), + array('debug'), + ); + } + + protected function getOutputStream($decorated = true, $verbosity = StreamOutput::VERBOSITY_NORMAL) + { + return new StreamOutput(fopen('php://memory', 'r+', false), $verbosity, $decorated); + } + + protected function generateOutput($expected) + { + $count = substr_count($expected, "\n"); + + return "\x0D".($count ? sprintf("\033[%dA", $count) : '').$expected; + } +} From 24800705b1b35c130fd1e5695facb2ce614d07ae Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Fri, 9 Oct 2015 13:06:19 -0400 Subject: [PATCH 2/8] add speed trap to prevent flashing indicator --- .../Console/Helper/ProgressIndicator.php | 31 +++++++++++++++++-- .../Tests/Helper/ProgressIndicatorTest.php | 9 ++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php index e2934c4dcb75e..83270e208808e 100644 --- a/src/Symfony/Component/Console/Helper/ProgressIndicator.php +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -24,6 +24,8 @@ class ProgressIndicator private $message = null; private $indicatorValues = array('-', '\\', '|', '/'); private $indicatorCurrent = 0; + private $indicatorChangeInterval = 100; + private $indicatorUpdateTime; private $lastMessagesLength = 0; private static $formatters; @@ -48,6 +50,14 @@ public function setFormat($format) $this->format = self::getFormatDefinition($format); } + /** + * @param int $milliseconds + */ + public function setIndicatorChangeInterval($milliseconds) + { + $this->indicatorChangeInterval = $milliseconds; + } + /** * @param string|null $message */ @@ -102,6 +112,7 @@ public function start($message) { $this->message = $message; $this->startTime = time(); + $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; $this->indicatorCurrent = 0; $this->display(); @@ -109,11 +120,20 @@ public function start($message) public function advance() { - ++$this->indicatorCurrent; + if (!$this->output->isDecorated()) { + return; + } - if ($this->output->isDecorated()) { - $this->display(); + $currentTime = $this->getCurrentTimeInMilliseconds(); + + if ($currentTime < $this->indicatorUpdateTime) { + return; } + + $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval; + ++$this->indicatorCurrent; + + $this->display(); } public function finish($message) @@ -233,6 +253,11 @@ private function overwrite($message) } } + private function getCurrentTimeInMilliseconds() + { + return round(microtime(true) * 1000); + } + private static function initPlaceholderFormatters() { return array( diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php index b196584502162..37e91c1b6fca3 100644 --- a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php @@ -11,11 +11,17 @@ public function testDefaultIndicator() { $bar = new ProgressIndicator($output = $this->getOutputStream()); $bar->start('Starting...'); + usleep(101000); $bar->advance(); + usleep(101000); $bar->advance(); + usleep(101000); $bar->advance(); + usleep(101000); $bar->advance(); + usleep(101000); $bar->advance(); + usleep(101000); $bar->setMessage('Advancing...'); $bar->advance(); $bar->finish('Done...'); @@ -65,8 +71,11 @@ public function testCustomIndicatorValues() $bar->setIndicatorValues(array('a', 'b', 'c')); $bar->start('Starting...'); + usleep(101000); $bar->advance(); + usleep(101000); $bar->advance(); + usleep(101000); $bar->advance(); rewind($output->getStream()); From f1144a344f8d2f5b5f9e693915782aaa6ffb8372 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 13 Oct 2015 08:37:36 -0400 Subject: [PATCH 3/8] cleanup comments and ProgressIndicator::setIndicatorValues error checking --- .../Console/Helper/ProgressIndicator.php | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php index 83270e208808e..e9f9ed258efc4 100644 --- a/src/Symfony/Component/Console/Helper/ProgressIndicator.php +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -31,9 +31,6 @@ class ProgressIndicator private static $formatters; private static $formats; - /** - * @param OutputInterface $output - */ public function __construct(OutputInterface $output) { $this->output = $output; @@ -43,6 +40,8 @@ public function __construct(OutputInterface $output) } /** + * Sets the progress indicator format. + * * @param string $format */ public function setFormat($format) @@ -51,6 +50,8 @@ public function setFormat($format) } /** + * Sets the indicator change interval in milliseconds. + * * @param int $milliseconds */ public function setIndicatorChangeInterval($milliseconds) @@ -59,6 +60,8 @@ public function setIndicatorChangeInterval($milliseconds) } /** + * Sets the current indicator message. + * * @param string|null $message */ public function setMessage($message) @@ -69,6 +72,8 @@ public function setMessage($message) } /** + * Gets the current indicator message. + * * @return string|null */ public function getMessage() @@ -77,14 +82,16 @@ public function getMessage() } /** + * Sets the animated indicator characters. + * * @param array $values */ public function setIndicatorValues(array $values) { $values = array_values($values); - if (empty($values)) { - throw new \InvalidArgumentException('Must have at least 1 value.'); + if (2 > count($values)) { + throw new \InvalidArgumentException('Must have at least 2 values.'); } $this->indicatorValues = $values; @@ -101,6 +108,8 @@ public function getStartTime() } /** + * Gets the current animated indicator character. + * * @return string */ public function getCurrentValue() @@ -108,6 +117,11 @@ public function getCurrentValue() return $this->indicatorValues[$this->indicatorCurrent % count($this->indicatorValues)]; } + /** + * Starts the indicator output. + * + * @param $message + */ public function start($message) { $this->message = $message; @@ -118,6 +132,9 @@ public function start($message) $this->display(); } + /** + * Advances the indicator. + */ public function advance() { if (!$this->output->isDecorated()) { @@ -136,6 +153,11 @@ public function advance() $this->display(); } + /** + * Finish the indicator with message. + * + * @param $message + */ public function finish($message) { $this->message = $message; From e9c18ab1763d33937acd7743fb68aafcb0cd0ffa Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 13 Oct 2015 10:55:12 -0400 Subject: [PATCH 4/8] make ProgressIndicator immutable --- .../Console/Helper/ProgressIndicator.php | 68 ++++++++----------- .../Tests/Helper/ProgressIndicatorTest.php | 6 +- 2 files changed, 29 insertions(+), 45 deletions(-) diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php index e9f9ed258efc4..133667cfdbe10 100644 --- a/src/Symfony/Component/Console/Helper/ProgressIndicator.php +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -21,42 +21,44 @@ class ProgressIndicator private $output; private $startTime; private $format; - private $message = null; - private $indicatorValues = array('-', '\\', '|', '/'); - private $indicatorCurrent = 0; - private $indicatorChangeInterval = 100; + private $message; + private $indicatorValues; + private $indicatorCurrent; + private $indicatorChangeInterval; private $indicatorUpdateTime; private $lastMessagesLength = 0; private static $formatters; private static $formats; - public function __construct(OutputInterface $output) + /** + * @param OutputInterface $output + * @param string|null $format Indicator format + * @param int $indicatorChangeInterval Change interval in milliseconds + * @param array|null $indicatorValues Animated indicator characters + */ + public function __construct(OutputInterface $output, $format = null, $indicatorChangeInterval = 100, $indicatorValues = null) { $this->output = $output; - $this->startTime = time(); - $this->setFormat($this->determineBestFormat()); - } + if (null === $format) { + $format = $this->determineBestFormat(); + } - /** - * Sets the progress indicator format. - * - * @param string $format - */ - public function setFormat($format) - { - $this->format = self::getFormatDefinition($format); - } + if (null === $indicatorValues) { + $indicatorValues = array('-', '\\', '|', '/'); + } - /** - * Sets the indicator change interval in milliseconds. - * - * @param int $milliseconds - */ - public function setIndicatorChangeInterval($milliseconds) - { - $this->indicatorChangeInterval = $milliseconds; + $indicatorValues = array_values($indicatorValues); + + if (2 > count($indicatorValues)) { + throw new \InvalidArgumentException('Must have at least 2 indicator value characters.'); + } + + $this->format = self::getFormatDefinition($format); + $this->indicatorChangeInterval = $indicatorChangeInterval; + $this->indicatorValues = $indicatorValues; + $this->startTime = time(); } /** @@ -81,22 +83,6 @@ public function getMessage() return $this->message; } - /** - * Sets the animated indicator characters. - * - * @param array $values - */ - public function setIndicatorValues(array $values) - { - $values = array_values($values); - - if (2 > count($values)) { - throw new \InvalidArgumentException('Must have at least 2 values.'); - } - - $this->indicatorValues = $values; - } - /** * Gets the progress bar start time. * diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php index 37e91c1b6fca3..bf3dc49abf4f6 100644 --- a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php @@ -67,8 +67,7 @@ public function testNonDecoratedOutput() public function testCustomIndicatorValues() { - $bar = new ProgressIndicator($output = $this->getOutputStream()); - $bar->setIndicatorValues(array('a', 'b', 'c')); + $bar = new ProgressIndicator($output = $this->getOutputStream(), null, 100, array('a', 'b', 'c')); $bar->start('Starting...'); usleep(101000); @@ -94,8 +93,7 @@ public function testCustomIndicatorValues() */ public function testFormats($format) { - $bar = new ProgressIndicator($output = $this->getOutputStream()); - $bar->setFormat($format); + $bar = new ProgressIndicator($output = $this->getOutputStream(), $format); $bar->start('Starting...'); $bar->advance(); From faab1d41588109411a52e19d62d8f202f0817256 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 13 Oct 2015 10:56:54 -0400 Subject: [PATCH 5/8] add @internal 5.3 compat flag for public setters --- src/Symfony/Component/Console/Helper/ProgressIndicator.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php index 133667cfdbe10..11b4b1f304c7c 100644 --- a/src/Symfony/Component/Console/Helper/ProgressIndicator.php +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -87,6 +87,8 @@ public function getMessage() * Gets the progress bar start time. * * @return int The progress bar start time + * + * @internal for PHP 5.3 compatibility */ public function getStartTime() { @@ -97,6 +99,8 @@ public function getStartTime() * Gets the current animated indicator character. * * @return string + * + * @internal for PHP 5.3 compatibility */ public function getCurrentValue() { From 01b8e1ae8315732614ae2a16f9f84c913ce16ac0 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 13 Oct 2015 11:10:28 -0400 Subject: [PATCH 6/8] ensure ProgressIndicator can be used multiple times with one instance --- .../Console/Helper/ProgressIndicator.php | 18 ++++++- .../Tests/Helper/ProgressIndicatorTest.php | 48 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php index 11b4b1f304c7c..1f8ab9ef0d6a5 100644 --- a/src/Symfony/Component/Console/Helper/ProgressIndicator.php +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -26,7 +26,8 @@ class ProgressIndicator private $indicatorCurrent; private $indicatorChangeInterval; private $indicatorUpdateTime; - private $lastMessagesLength = 0; + private $lastMessagesLength; + private $started = false; private static $formatters; private static $formats; @@ -114,7 +115,13 @@ public function getCurrentValue() */ public function start($message) { + if ($this->started) { + throw new \LogicException('Progress indicator already started.'); + } + $this->message = $message; + $this->started = true; + $this->lastMessagesLength = 0; $this->startTime = time(); $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; $this->indicatorCurrent = 0; @@ -127,6 +134,10 @@ public function start($message) */ public function advance() { + if (!$this->started) { + throw new \LogicException('Progress indicator has not yet been started.'); + } + if (!$this->output->isDecorated()) { return; } @@ -150,9 +161,14 @@ public function advance() */ public function finish($message) { + if (!$this->started) { + throw new \LogicException('Progress indicator has not yet been started.'); + } + $this->message = $message; $this->display(); $this->output->writeln(''); + $this->started = false; } /** diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php index bf3dc49abf4f6..d53e594ba9704 100644 --- a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php @@ -25,6 +25,10 @@ public function testDefaultIndicator() $bar->setMessage('Advancing...'); $bar->advance(); $bar->finish('Done...'); + $bar->start('Starting Again...'); + usleep(101000); + $bar->advance(); + $bar->finish('Done Again...'); rewind($output->getStream()); @@ -38,6 +42,10 @@ public function testDefaultIndicator() $this->generateOutput(' \\ Advancing...'). $this->generateOutput(' | Advancing...'). $this->generateOutput(' | Done... '). + "\n". + $this->generateOutput(' - Starting Again...'). + $this->generateOutput(' \\ Starting Again...'). + $this->generateOutput(' \\ Done Again... '). "\n", stream_get_contents($output->getStream()) ); @@ -88,6 +96,46 @@ public function testCustomIndicatorValues() ); } + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Must have at least 2 indicator value characters. + */ + public function testCannotSetInvalidIndicatorCharacters() + { + $bar = new ProgressIndicator($this->getOutputStream(), null, 100, array('1')); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Progress indicator already started. + */ + public function testCannotStartAlreadyStartedIndicator() + { + $bar = new ProgressIndicator($this->getOutputStream()); + $bar->start('Starting...'); + $bar->start('Starting Again.'); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Progress indicator has not yet been started. + */ + public function testCannotAdvanceUnstartedIndicator() + { + $bar = new ProgressIndicator($this->getOutputStream()); + $bar->advance(); + } + + /** + * @expectedException \LogicException + * @expectedExceptionMessage Progress indicator has not yet been started. + */ + public function testCannotFinishUnstartedIndicator() + { + $bar = new ProgressIndicator($this->getOutputStream()); + $bar->finish('Finished'); + } + /** * @dataProvider provideFormat */ From 7bcabb41cba5bbfe6ae643d273080a7b40ca4bf6 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 13 Oct 2015 11:35:33 -0400 Subject: [PATCH 7/8] mark ProgressIndicator::getMessage as internal --- src/Symfony/Component/Console/Helper/ProgressIndicator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Symfony/Component/Console/Helper/ProgressIndicator.php b/src/Symfony/Component/Console/Helper/ProgressIndicator.php index 1f8ab9ef0d6a5..8c8a49c44b910 100644 --- a/src/Symfony/Component/Console/Helper/ProgressIndicator.php +++ b/src/Symfony/Component/Console/Helper/ProgressIndicator.php @@ -78,6 +78,8 @@ public function setMessage($message) * Gets the current indicator message. * * @return string|null + * + * @internal for PHP 5.3 compatibility */ public function getMessage() { From 12bf736b488b72088b3429e872342aa456deef62 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Mon, 19 Oct 2015 10:50:47 -0400 Subject: [PATCH 8/8] fix test on windows --- .../Component/Console/Tests/Helper/ProgressIndicatorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php index d53e594ba9704..6b830811f6b4e 100644 --- a/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressIndicatorTest.php @@ -42,11 +42,11 @@ public function testDefaultIndicator() $this->generateOutput(' \\ Advancing...'). $this->generateOutput(' | Advancing...'). $this->generateOutput(' | Done... '). - "\n". + PHP_EOL. $this->generateOutput(' - Starting Again...'). $this->generateOutput(' \\ Starting Again...'). $this->generateOutput(' \\ Done Again... '). - "\n", + PHP_EOL, stream_get_contents($output->getStream()) ); }