sonarrradarrplexorganizrnginxdashboardlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximux
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							792 lines
						
					
					
						
							26 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							792 lines
						
					
					
						
							26 KiB
						
					
					
				| <?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\ProgressBar; | |
| use Symfony\Component\Console\Helper\Helper; | |
| 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'); | |
|     } | |
| }
 | |
| 
 |