793 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			793 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  * This file is part of the Symfony package.
 | |
|  *
 | |
|  * (c) Fabien Potencier <fabien@symfony.com>
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| namespace Symfony\Component\Console\Tests\Helper;
 | |
| 
 | |
| use PHPUnit\Framework\TestCase;
 | |
| use Symfony\Component\Console\Helper\Helper;
 | |
| use Symfony\Component\Console\Helper\ProgressBar;
 | |
| use Symfony\Component\Console\Output\StreamOutput;
 | |
| 
 | |
| /**
 | |
|  * @group time-sensitive
 | |
|  */
 | |
| class ProgressBarTest extends TestCase
 | |
| {
 | |
|     public function testMultipleStart()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
|         $bar->start();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    1 [->--------------------------]').
 | |
|             $this->generateOutput('    0 [>---------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testAdvance()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    1 [->--------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testAdvanceWithStep()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance(5);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    5 [----->----------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testAdvanceMultipleTimes()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance(3);
 | |
|         $bar->advance(2);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    3 [--->------------------------]').
 | |
|             $this->generateOutput('    5 [----->----------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testAdvanceOverMax()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 10);
 | |
|         $bar->setProgress(9);
 | |
|         $bar->advance();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  9/10 [=========================>--]  90%'.
 | |
|             $this->generateOutput(' 10/10 [============================] 100%').
 | |
|             $this->generateOutput(' 11/11 [============================] 100%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testRegress()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
|         $bar->advance();
 | |
|         $bar->advance(-1);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    1 [->--------------------------]').
 | |
|             $this->generateOutput('    2 [-->-------------------------]').
 | |
|             $this->generateOutput('    1 [->--------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testRegressWithStep()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance(4);
 | |
|         $bar->advance(4);
 | |
|         $bar->advance(-2);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    4 [---->-----------------------]').
 | |
|             $this->generateOutput('    8 [-------->-------------------]').
 | |
|             $this->generateOutput('    6 [------>---------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testRegressMultipleTimes()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->advance(3);
 | |
|         $bar->advance(3);
 | |
|         $bar->advance(-1);
 | |
|         $bar->advance(-2);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    3 [--->------------------------]').
 | |
|             $this->generateOutput('    6 [------>---------------------]').
 | |
|             $this->generateOutput('    5 [----->----------------------]').
 | |
|             $this->generateOutput('    3 [--->------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testRegressBelowMin()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 10);
 | |
|         $bar->setProgress(1);
 | |
|         $bar->advance(-1);
 | |
|         $bar->advance(-1);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  1/10 [==>-------------------------]  10%'.
 | |
|             $this->generateOutput('  0/10 [>---------------------------]   0%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testFormat()
 | |
|     {
 | |
|         $expected =
 | |
|             '  0/10 [>---------------------------]   0%'.
 | |
|             $this->generateOutput(' 10/10 [============================] 100%').
 | |
|             $this->generateOutput(' 10/10 [============================] 100%')
 | |
|         ;
 | |
| 
 | |
|         // max in construct, no format
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 10);
 | |
|         $bar->start();
 | |
|         $bar->advance(10);
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals($expected, stream_get_contents($output->getStream()));
 | |
| 
 | |
|         // max in start, no format
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start(10);
 | |
|         $bar->advance(10);
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals($expected, stream_get_contents($output->getStream()));
 | |
| 
 | |
|         // max in construct, explicit format before
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 10);
 | |
|         $bar->setFormat('normal');
 | |
|         $bar->start();
 | |
|         $bar->advance(10);
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals($expected, stream_get_contents($output->getStream()));
 | |
| 
 | |
|         // max in start, explicit format before
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setFormat('normal');
 | |
|         $bar->start(10);
 | |
|         $bar->advance(10);
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals($expected, stream_get_contents($output->getStream()));
 | |
|     }
 | |
| 
 | |
|     public function testCustomizations()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 10);
 | |
|         $bar->setBarWidth(10);
 | |
|         $bar->setBarCharacter('_');
 | |
|         $bar->setEmptyBarCharacter(' ');
 | |
|         $bar->setProgressCharacter('/');
 | |
|         $bar->setFormat(' %current%/%max% [%bar%] %percent:3s%%');
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/10 [/         ]   0%'.
 | |
|             $this->generateOutput('  1/10 [_/        ]  10%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testDisplayWithoutStart()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 50);
 | |
|         $bar->display();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/50 [>---------------------------]   0%',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testDisplayWithQuietVerbosity()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(true, StreamOutput::VERBOSITY_QUIET), 50);
 | |
|         $bar->display();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testFinishWithoutStart()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 50);
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             ' 50/50 [============================] 100%',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testPercent()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 50);
 | |
|         $bar->start();
 | |
|         $bar->display();
 | |
|         $bar->advance();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/50 [>---------------------------]   0%'.
 | |
|             $this->generateOutput('  0/50 [>---------------------------]   0%').
 | |
|             $this->generateOutput('  1/50 [>---------------------------]   2%').
 | |
|             $this->generateOutput('  2/50 [=>--------------------------]   4%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testOverwriteWithShorterLine()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 50);
 | |
|         $bar->setFormat(' %current%/%max% [%bar%] %percent:3s%%');
 | |
|         $bar->start();
 | |
|         $bar->display();
 | |
|         $bar->advance();
 | |
| 
 | |
|         // set shorter format
 | |
|         $bar->setFormat(' %current%/%max% [%bar%]');
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/50 [>---------------------------]   0%'.
 | |
|             $this->generateOutput('  0/50 [>---------------------------]   0%').
 | |
|             $this->generateOutput('  1/50 [>---------------------------]   2%').
 | |
|             $this->generateOutput('  2/50 [=>--------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testStartWithMax()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setFormat('%current%/%max% [%bar%]');
 | |
|         $bar->start(50);
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             ' 0/50 [>---------------------------]'.
 | |
|             $this->generateOutput(' 1/50 [>---------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testSetCurrentProgress()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 50);
 | |
|         $bar->start();
 | |
|         $bar->display();
 | |
|         $bar->advance();
 | |
|         $bar->setProgress(15);
 | |
|         $bar->setProgress(25);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/50 [>---------------------------]   0%'.
 | |
|             $this->generateOutput('  0/50 [>---------------------------]   0%').
 | |
|             $this->generateOutput('  1/50 [>---------------------------]   2%').
 | |
|             $this->generateOutput(' 15/50 [========>-------------------]  30%').
 | |
|             $this->generateOutput(' 25/50 [==============>-------------]  50%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testSetCurrentBeforeStarting()
 | |
|     {
 | |
|         $bar = new ProgressBar($this->getOutputStream());
 | |
|         $bar->setProgress(15);
 | |
|         $this->assertNotNull($bar->getStartTime());
 | |
|     }
 | |
| 
 | |
|     public function testRedrawFrequency()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 6);
 | |
|         $bar->setRedrawFrequency(2);
 | |
|         $bar->start();
 | |
|         $bar->setProgress(1);
 | |
|         $bar->advance(2);
 | |
|         $bar->advance(2);
 | |
|         $bar->advance(1);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             ' 0/6 [>---------------------------]   0%'.
 | |
|             $this->generateOutput(' 3/6 [==============>-------------]  50%').
 | |
|             $this->generateOutput(' 5/6 [=======================>----]  83%').
 | |
|             $this->generateOutput(' 6/6 [============================] 100%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testRedrawFrequencyIsAtLeastOneIfZeroGiven()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setRedrawFrequency(0);
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    1 [->--------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testRedrawFrequencyIsAtLeastOneIfSmallerOneGiven()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setRedrawFrequency(0.9);
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    1 [->--------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testMultiByteSupport()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->start();
 | |
|         $bar->setBarCharacter('■');
 | |
|         $bar->advance(3);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.
 | |
|             $this->generateOutput('    3 [■■■>------------------------]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testClear()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 50);
 | |
|         $bar->start();
 | |
|         $bar->setProgress(25);
 | |
|         $bar->clear();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/50 [>---------------------------]   0%'.
 | |
|             $this->generateOutput(' 25/50 [==============>-------------]  50%').
 | |
|             $this->generateOutput(''),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testPercentNotHundredBeforeComplete()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 200);
 | |
|         $bar->start();
 | |
|         $bar->display();
 | |
|         $bar->advance(199);
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '   0/200 [>---------------------------]   0%'.
 | |
|             $this->generateOutput('   0/200 [>---------------------------]   0%').
 | |
|             $this->generateOutput(' 199/200 [===========================>]  99%').
 | |
|             $this->generateOutput(' 200/200 [============================] 100%'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testNonDecoratedOutput()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(false), 200);
 | |
|         $bar->start();
 | |
| 
 | |
|         for ($i = 0; $i < 200; ++$i) {
 | |
|             $bar->advance();
 | |
|         }
 | |
| 
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '   0/200 [>---------------------------]   0%'.PHP_EOL.
 | |
|             '  20/200 [==>-------------------------]  10%'.PHP_EOL.
 | |
|             '  40/200 [=====>----------------------]  20%'.PHP_EOL.
 | |
|             '  60/200 [========>-------------------]  30%'.PHP_EOL.
 | |
|             '  80/200 [===========>----------------]  40%'.PHP_EOL.
 | |
|             ' 100/200 [==============>-------------]  50%'.PHP_EOL.
 | |
|             ' 120/200 [================>-----------]  60%'.PHP_EOL.
 | |
|             ' 140/200 [===================>--------]  70%'.PHP_EOL.
 | |
|             ' 160/200 [======================>-----]  80%'.PHP_EOL.
 | |
|             ' 180/200 [=========================>--]  90%'.PHP_EOL.
 | |
|             ' 200/200 [============================] 100%',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testNonDecoratedOutputWithClear()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(false), 50);
 | |
|         $bar->start();
 | |
|         $bar->setProgress(25);
 | |
|         $bar->clear();
 | |
|         $bar->setProgress(50);
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/50 [>---------------------------]   0%'.PHP_EOL.
 | |
|             ' 25/50 [==============>-------------]  50%'.PHP_EOL.
 | |
|             ' 50/50 [============================] 100%',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testNonDecoratedOutputWithoutMax()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(false));
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]'.PHP_EOL.
 | |
|             '    1 [->--------------------------]',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testParallelBars()
 | |
|     {
 | |
|         $output = $this->getOutputStream();
 | |
|         $bar1 = new ProgressBar($output, 2);
 | |
|         $bar2 = new ProgressBar($output, 3);
 | |
|         $bar2->setProgressCharacter('#');
 | |
|         $bar3 = new ProgressBar($output);
 | |
| 
 | |
|         $bar1->start();
 | |
|         $output->write("\n");
 | |
|         $bar2->start();
 | |
|         $output->write("\n");
 | |
|         $bar3->start();
 | |
| 
 | |
|         for ($i = 1; $i <= 3; ++$i) {
 | |
|             // up two lines
 | |
|             $output->write("\033[2A");
 | |
|             if ($i <= 2) {
 | |
|                 $bar1->advance();
 | |
|             }
 | |
|             $output->write("\n");
 | |
|             $bar2->advance();
 | |
|             $output->write("\n");
 | |
|             $bar3->advance();
 | |
|         }
 | |
|         $output->write("\033[2A");
 | |
|         $output->write("\n");
 | |
|         $output->write("\n");
 | |
|         $bar3->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             ' 0/2 [>---------------------------]   0%'."\n".
 | |
|             ' 0/3 [#---------------------------]   0%'."\n".
 | |
|             rtrim('    0 [>---------------------------]').
 | |
| 
 | |
|             "\033[2A".
 | |
|             $this->generateOutput(' 1/2 [==============>-------------]  50%')."\n".
 | |
|             $this->generateOutput(' 1/3 [=========#------------------]  33%')."\n".
 | |
|             rtrim($this->generateOutput('    1 [->--------------------------]')).
 | |
| 
 | |
|             "\033[2A".
 | |
|             $this->generateOutput(' 2/2 [============================] 100%')."\n".
 | |
|             $this->generateOutput(' 2/3 [==================#---------]  66%')."\n".
 | |
|             rtrim($this->generateOutput('    2 [-->-------------------------]')).
 | |
| 
 | |
|             "\033[2A".
 | |
|             "\n".
 | |
|             $this->generateOutput(' 3/3 [============================] 100%')."\n".
 | |
|             rtrim($this->generateOutput('    3 [--->------------------------]')).
 | |
| 
 | |
|             "\033[2A".
 | |
|             "\n".
 | |
|             "\n".
 | |
|             rtrim($this->generateOutput('    3 [============================]')),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testWithoutMax()
 | |
|     {
 | |
|         $output = $this->getOutputStream();
 | |
| 
 | |
|         $bar = new ProgressBar($output);
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
|         $bar->advance();
 | |
|         $bar->advance();
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             rtrim('    0 [>---------------------------]').
 | |
|             rtrim($this->generateOutput('    1 [->--------------------------]')).
 | |
|             rtrim($this->generateOutput('    2 [-->-------------------------]')).
 | |
|             rtrim($this->generateOutput('    3 [--->------------------------]')).
 | |
|             rtrim($this->generateOutput('    3 [============================]')),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testWithSmallScreen()
 | |
|     {
 | |
|         $output = $this->getOutputStream();
 | |
| 
 | |
|         $bar = new ProgressBar($output);
 | |
|         putenv('COLUMNS=12');
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
|         putenv('COLUMNS=120');
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---]'.
 | |
|             $this->generateOutput('    1 [->--]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testAddingPlaceholderFormatter()
 | |
|     {
 | |
|         ProgressBar::setPlaceholderFormatterDefinition('remaining_steps', function (ProgressBar $bar) {
 | |
|             return $bar->getMaxSteps() - $bar->getProgress();
 | |
|         });
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 3);
 | |
|         $bar->setFormat(' %remaining_steps% [%bar%]');
 | |
| 
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             ' 3 [>---------------------------]'.
 | |
|             $this->generateOutput(' 2 [=========>------------------]').
 | |
|             $this->generateOutput(' 0 [============================]'),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testMultilineFormat()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 3);
 | |
|         $bar->setFormat("%bar%\nfoobar");
 | |
| 
 | |
|         $bar->start();
 | |
|         $bar->advance();
 | |
|         $bar->clear();
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             ">---------------------------\nfoobar".
 | |
|             $this->generateOutput("=========>------------------\nfoobar").
 | |
|             "\x0D\x1B[2K\x1B[1A\x1B[2K".
 | |
|             $this->generateOutput("============================\nfoobar"),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     public function testAnsiColorsAndEmojis()
 | |
|     {
 | |
|         putenv('COLUMNS=156');
 | |
| 
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 15);
 | |
|         ProgressBar::setPlaceholderFormatterDefinition('memory', function (ProgressBar $bar) {
 | |
|             static $i = 0;
 | |
|             $mem = 100000 * $i;
 | |
|             $colors = $i++ ? '41;37' : '44;37';
 | |
| 
 | |
|             return "\033[".$colors.'m '.Helper::formatMemory($mem)." \033[0m";
 | |
|         });
 | |
|         $bar->setFormat(" \033[44;37m %title:-37s% \033[0m\n %current%/%max% %bar% %percent:3s%%\n 🏁  %remaining:-10s% %memory:37s%");
 | |
|         $bar->setBarCharacter($done = "\033[32m●\033[0m");
 | |
|         $bar->setEmptyBarCharacter($empty = "\033[31m●\033[0m");
 | |
|         $bar->setProgressCharacter($progress = "\033[32m➤ \033[0m");
 | |
| 
 | |
|         $bar->setMessage('Starting the demo... fingers crossed', 'title');
 | |
|         $bar->start();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             " \033[44;37m Starting the demo... fingers crossed  \033[0m\n".
 | |
|             '  0/15 '.$progress.str_repeat($empty, 26)."   0%\n".
 | |
|             " \xf0\x9f\x8f\x81  < 1 sec                        \033[44;37m 0 B \033[0m",
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|         ftruncate($output->getStream(), 0);
 | |
|         rewind($output->getStream());
 | |
| 
 | |
|         $bar->setMessage('Looks good to me...', 'title');
 | |
|         $bar->advance(4);
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             $this->generateOutput(
 | |
|                 " \033[44;37m Looks good to me...                   \033[0m\n".
 | |
|                 '  4/15 '.str_repeat($done, 7).$progress.str_repeat($empty, 19)."  26%\n".
 | |
|                 " \xf0\x9f\x8f\x81  < 1 sec                     \033[41;37m 97 KiB \033[0m"
 | |
|             ),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|         ftruncate($output->getStream(), 0);
 | |
|         rewind($output->getStream());
 | |
| 
 | |
|         $bar->setMessage('Thanks, bye', 'title');
 | |
|         $bar->finish();
 | |
| 
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             $this->generateOutput(
 | |
|                 " \033[44;37m Thanks, bye                           \033[0m\n".
 | |
|                 ' 15/15 '.str_repeat($done, 28)." 100%\n".
 | |
|                 " \xf0\x9f\x8f\x81  < 1 sec                    \033[41;37m 195 KiB \033[0m"
 | |
|             ),
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|         putenv('COLUMNS=120');
 | |
|     }
 | |
| 
 | |
|     public function testSetFormat()
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setFormat('normal');
 | |
|         $bar->start();
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '    0 [>---------------------------]',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
| 
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream(), 10);
 | |
|         $bar->setFormat('normal');
 | |
|         $bar->start();
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(
 | |
|             '  0/10 [>---------------------------]   0%',
 | |
|             stream_get_contents($output->getStream())
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @dataProvider provideFormat
 | |
|      */
 | |
|     public function testFormatsWithoutMax($format)
 | |
|     {
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setFormat($format);
 | |
|         $bar->start();
 | |
| 
 | |
|         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\x1B[2K".($count ? str_repeat("\x1B[1A\x1B[2K", $count) : '').$expected;
 | |
|     }
 | |
| 
 | |
|     public function testBarWidthWithMultilineFormat()
 | |
|     {
 | |
|         putenv('COLUMNS=10');
 | |
| 
 | |
|         $bar = new ProgressBar($output = $this->getOutputStream());
 | |
|         $bar->setFormat("%bar%\n0123456789");
 | |
| 
 | |
|         // before starting
 | |
|         $bar->setBarWidth(5);
 | |
|         $this->assertEquals(5, $bar->getBarWidth());
 | |
| 
 | |
|         // after starting
 | |
|         $bar->start();
 | |
|         rewind($output->getStream());
 | |
|         $this->assertEquals(5, $bar->getBarWidth(), stream_get_contents($output->getStream()));
 | |
|         putenv('COLUMNS=120');
 | |
|     }
 | |
| }
 |