123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <?php
- namespace Symfony\Component\Console\Tests\Helper;
- use PHPUnit\Framework\TestCase;
- use Symfony\Component\Console\Helper\ProgressIndicator;
- use Symfony\Component\Console\Output\StreamOutput;
- /**
- * @group time-sensitive
- */
- class ProgressIndicatorTest extends TestCase
- {
- 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...');
- $bar->start('Starting Again...');
- usleep(101000);
- $bar->advance();
- $bar->finish('Done Again...');
- 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...').
- PHP_EOL.
- $this->generateOutput(' - Starting Again...').
- $this->generateOutput(' \\ Starting Again...').
- $this->generateOutput(' \\ Done Again...').
- PHP_EOL,
- 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(), null, 100, ['a', 'b', 'c']);
- $bar->start('Starting...');
- usleep(101000);
- $bar->advance();
- usleep(101000);
- $bar->advance();
- usleep(101000);
- $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())
- );
- }
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Must have at least 2 indicator value characters.
- */
- public function testCannotSetInvalidIndicatorCharacters()
- {
- $bar = new ProgressIndicator($this->getOutputStream(), null, 100, ['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
- */
- public function testFormats($format)
- {
- $bar = new ProgressIndicator($output = $this->getOutputStream(), $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 [
- ['normal'],
- ['verbose'],
- ['very_verbose'],
- ['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\x1B[2K".($count ? sprintf("\033[%dA", $count) : '').$expected;
- }
- }
|