Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/symfony/console/Tests/Helper/ProgressBarTest.php
Строк: 435
<?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 SymfonyComponentConsoleTestsHelper;

use 
SymfonyComponentConsoleHelperProgressBar;
use 
SymfonyComponentConsoleHelperHelper;
use 
SymfonyComponentConsoleOutputStreamOutput;

class 
ProgressBarTest extends PHPUnit_Framework_TestCase
{
    public function 
testMultipleStart()
    {
        
$bar = new ProgressBar($output $this->getOutputStream());
        
$bar->start();
        
$bar->advance();
        
$bar->start();

        
rewind($output->getStream());
        
$this->assertEquals(
            
$this->generateOutput('    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(
            
$this->generateOutput('    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(
            
$this->generateOutput('    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(
            
$this->generateOutput('    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(
            
$this->generateOutput('  9/10 [=========================>--]  90%').
            
$this->generateOutput(' 10/10 [============================] 100%').
            
$this->generateOutput(' 11/11 [============================] 100%'),
            
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(
            
$this->generateOutput('  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(
            
$this->generateOutput('  0/50 [>---------------------------]   0%'),
            
stream_get_contents($output->getStream())
        );
    }

    public function 
testDisplayWithQuietVerbosity()
    {
        
$bar = new ProgressBar($output $this->getOutputStream(trueStreamOutput::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(
            
$this->generateOutput(' 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(
            
$this->generateOutput('  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(
            
$this->generateOutput('  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(
            
$this->generateOutput(' 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(
            
$this->generateOutput('  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());
    }

    
/**
     * @expectedException        LogicException
     * @expectedExceptionMessage You can't regress the progress bar
     */
    
public function testRegressProgress()
    {
        
$bar = new ProgressBar($output $this->getOutputStream(), 50);
        
$bar->start();
        
$bar->setProgress(15);
        
$bar->setProgress(10);
    }

    public function 
testRedrawFrequency()
    {
        
$bar $this->getMock('SymfonyComponentConsoleHelperProgressBar', array('display'), array($output $this->getOutputStream(), 6));
        
$bar->expects($this->exactly(4))->method('display');

        
$bar->setRedrawFrequency(2);
        
$bar->start();
        
$bar->setProgress(1);
        
$bar->advance(2);
        
$bar->advance(2);
        
$bar->advance(1);
    }

    public function 
testMultiByteSupport()
    {
        if (!
function_exists('mb_strlen') || (false === $encoding mb_detect_encoding('■'))) {
            
$this->markTestSkipped('The mbstring extension is needed for multi-byte support');
        }

        
$bar = new ProgressBar($output $this->getOutputStream());
        
$bar->start();
        
$bar->setBarCharacter('■');
        
$bar->advance(3);

        
rewind($output->getStream());
        
$this->assertEquals(
            
$this->generateOutput('    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(
            
$this->generateOutput('  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(
            
$this->generateOutput('   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($output2);
        
$bar2 = new ProgressBar($output3);
        
$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("33[2A");
            if (
$i <= 2) {
                
$bar1->advance();
            }
            
$output->write("n");
            
$bar2->advance();
            
$output->write("n");
            
$bar3->advance();
        }
        
$output->write("33[2A");
        
$output->write("n");
        
$output->write("n");
        
$bar3->finish();

        
rewind($output->getStream());
        
$this->assertEquals(
            
$this->generateOutput(' 0/2 [>---------------------------]   0%')."n".
            
$this->generateOutput(' 0/3 [#---------------------------]   0%')."n".
            
rtrim($this->generateOutput('    0 [>---------------------------]')).

            
"33[2A".
            
$this->generateOutput(' 1/2 [==============>-------------]  50%')."n".
            
$this->generateOutput(' 1/3 [=========#------------------]  33%')."n".
            
rtrim($this->generateOutput('    1 [->--------------------------]')).

            
"33[2A".
            
$this->generateOutput(' 2/2 [============================] 100%')."n".
            
$this->generateOutput(' 2/3 [==================#---------]  66%')."n".
            
rtrim($this->generateOutput('    2 [-->-------------------------]')).

            
"33[2A".
            
"n".
            
$this->generateOutput(' 3/3 [============================] 100%')."n".
            
rtrim($this->generateOutput('    3 [--->------------------------]')).

            
"33[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($this->generateOutput('    0 [>---------------------------]')).
            
rtrim($this->generateOutput('    1 [->--------------------------]')).
            
rtrim($this->generateOutput('    2 [-->-------------------------]')).
            
rtrim($this->generateOutput('    3 [--->------------------------]')).
            
rtrim($this->generateOutput('    3 [============================]')),
            
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(
            
$this->generateOutput(' 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(
            
$this->generateOutput(">---------------------------nfoobar").
            
$this->generateOutput("=========>------------------nfoobar                      ").
            
$this->generateOutput("                            n                            ").
            
$this->generateOutput("============================nfoobar                      "),
            
stream_get_contents($output->getStream())
        );
    }

    public function 
testAnsiColorsAndEmojis()
    {
        
$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 
"33[".$colors.'m '.Helper::formatMemory($mem)." 33[0m";
        });
        
$bar->setFormat(" 33[44;37m %title:-37s% 33[0mn %current%/%max% %bar% %percent:3s%%n 🏁  %remaining:-10s% %memory:37s%");
        
$bar->setBarCharacter($done "33[32m●33[0m");
        
$bar->setEmptyBarCharacter($empty "33[31m●33[0m");
        
$bar->setProgressCharacter($progress "33[32m➤ 33[0m");

        
$bar->setMessage('Starting the demo... fingers crossed''title');
        
$bar->start();
        
$bar->setMessage('Looks good to me...''title');
        
$bar->advance(4);
        
$bar->setMessage('Thanks, bye''title');
        
$bar->finish();

        
rewind($output->getStream());
        
$this->assertEquals(
            
$this->generateOutput(
                
" 33[44;37m Starting the demo... fingers crossed  33[0mn".
                
'  0/15 '.$progress.str_repeat($empty26)."   0%n".
                
" xf0x9fx8fx81  1 sec                          33[44;37m 0 B 33[0m"
            
).
            
$this->generateOutput(
                
" 33[44;37m Looks good to me...                   33[0mn".
                
'  4/15 '.str_repeat($done7).$progress.str_repeat($empty19)."  26%n".
                
" xf0x9fx8fx81  1 sec                       33[41;37m 97 KiB 33[0m"
            
).
            
$this->generateOutput(
                
" 33[44;37m Thanks, bye                           33[0mn".
                
' 15/15 '.str_repeat($done28)." 100%n".
                
" xf0x9fx8fx81  1 sec                      33[41;37m 195 KiB 33[0m"
            
),
            
stream_get_contents($output->getStream())
        );
    }

    public function 
testSetFormat()
    {
        
$bar = new ProgressBar($output $this->getOutputStream());
        
$bar->setFormat('normal');
        
$bar->start();
        
rewind($output->getStream());
        
$this->assertEquals(
            
$this->generateOutput('    0 [>---------------------------]'),
            
stream_get_contents($output->getStream())
        );

        
$bar = new ProgressBar($output $this->getOutputStream(), 10);
        
$bar->setFormat('normal');
        
$bar->start();
        
rewind($output->getStream());
        
$this->assertEquals(
            
$this->generateOutput('  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".($count sprintf("33[%dA"$count) : '').$expected;
    }
}
Онлайн: 0
Реклама