Yaffs site version 1.1
[yaffs-website] / vendor / symfony / console / Tests / Helper / ProgressBarTest.php
diff --git a/vendor/symfony/console/Tests/Helper/ProgressBarTest.php b/vendor/symfony/console/Tests/Helper/ProgressBarTest.php
new file mode 100644 (file)
index 0000000..401033c
--- /dev/null
@@ -0,0 +1,662 @@
+<?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 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());
+    }
+
+    /**
+     * @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->getMockBuilder('Symfony\Component\Console\Helper\ProgressBar')->setMethods(array('display'))->setConstructorArgs(array($this->getOutputStream(), 6))->getMock();
+        $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 testRedrawFrequencyIsAtLeastOneIfZeroGiven()
+    {
+        $bar = $this->getMockBuilder('Symfony\Component\Console\Helper\ProgressBar')->setMethods(array('display'))->setConstructorArgs(array($this->getOutputStream()))->getMock();
+
+        $bar->expects($this->exactly(2))->method('display');
+        $bar->setRedrawFrequency(0);
+        $bar->start();
+        $bar->advance();
+    }
+
+    public function testRedrawFrequencyIsAtLeastOneIfSmallerOneGiven()
+    {
+        $bar = $this->getMockBuilder('Symfony\Component\Console\Helper\ProgressBar')->setMethods(array('display'))->setConstructorArgs(array($this->getOutputStream()))->getMock();
+
+        $bar->expects($this->exactly(2))->method('display');
+        $bar->setRedrawFrequency(0.9);
+        $bar->start();
+        $bar->advance();
+    }
+
+    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 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()
+    {
+        $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();
+        $bar->setMessage('Looks good to me...', 'title');
+        $bar->advance(4);
+        $bar->setMessage('Thanks, bye', 'title');
+        $bar->finish();
+
+        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"
+            .
+            $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"
+            ).
+            $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())
+        );
+    }
+
+    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;
+    }
+}