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\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');
|
||
|
}
|
||
|
}
|