4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Console\Tests\Helper;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\Console\Helper\ProgressHelper;
16 use Symfony\Component\Console\Output\StreamOutput;
20 * @group time-sensitive
22 class LegacyProgressHelperTest extends TestCase
24 public function testAdvance()
26 $progress = new ProgressHelper();
27 $progress->start($output = $this->getOutputStream());
30 rewind($output->getStream());
31 $this->assertEquals($this->generateOutput(' 1 [->--------------------------]'), stream_get_contents($output->getStream()));
34 public function testAdvanceWithStep()
36 $progress = new ProgressHelper();
37 $progress->start($output = $this->getOutputStream());
38 $progress->advance(5);
40 rewind($output->getStream());
41 $this->assertEquals($this->generateOutput(' 5 [----->----------------------]'), stream_get_contents($output->getStream()));
44 public function testAdvanceMultipleTimes()
46 $progress = new ProgressHelper();
47 $progress->start($output = $this->getOutputStream());
48 $progress->advance(3);
49 $progress->advance(2);
51 rewind($output->getStream());
52 $this->assertEquals($this->generateOutput(' 3 [--->------------------------]').$this->generateOutput(' 5 [----->----------------------]'), stream_get_contents($output->getStream()));
55 public function testCustomizations()
57 $progress = new ProgressHelper();
58 $progress->setBarWidth(10);
59 $progress->setBarCharacter('_');
60 $progress->setEmptyBarCharacter(' ');
61 $progress->setProgressCharacter('/');
62 $progress->setFormat(' %current%/%max% [%bar%] %percent%%');
63 $progress->start($output = $this->getOutputStream(), 10);
66 rewind($output->getStream());
67 $this->assertEquals($this->generateOutput(' 1/10 [_/ ] 10%'), stream_get_contents($output->getStream()));
70 public function testPercent()
72 $progress = new ProgressHelper();
73 $progress->start($output = $this->getOutputStream(), 50);
78 rewind($output->getStream());
79 $this->assertEquals($this->generateOutput(' 0/50 [>---------------------------] 0%').$this->generateOutput(' 1/50 [>---------------------------] 2%').$this->generateOutput(' 2/50 [=>--------------------------] 4%'), stream_get_contents($output->getStream()));
82 public function testOverwriteWithShorterLine()
84 $progress = new ProgressHelper();
85 $progress->setFormat(' %current%/%max% [%bar%] %percent%%');
86 $progress->start($output = $this->getOutputStream(), 50);
91 $progress->setFormat(' %current%/%max% [%bar%]');
94 rewind($output->getStream());
96 $this->generateOutput(' 0/50 [>---------------------------] 0%').
97 $this->generateOutput(' 1/50 [>---------------------------] 2%').
98 $this->generateOutput(' 2/50 [=>--------------------------] '),
99 stream_get_contents($output->getStream())
103 public function testSetCurrentProgress()
105 $progress = new ProgressHelper();
106 $progress->start($output = $this->getOutputStream(), 50);
107 $progress->display();
108 $progress->advance();
109 $progress->setCurrent(15);
110 $progress->setCurrent(25);
112 rewind($output->getStream());
114 $this->generateOutput(' 0/50 [>---------------------------] 0%').
115 $this->generateOutput(' 1/50 [>---------------------------] 2%').
116 $this->generateOutput(' 15/50 [========>-------------------] 30%').
117 $this->generateOutput(' 25/50 [==============>-------------] 50%'),
118 stream_get_contents($output->getStream())
123 * @expectedException \LogicException
124 * @expectedExceptionMessage You must start the progress bar
126 public function testSetCurrentBeforeStarting()
128 $progress = new ProgressHelper();
129 $progress->setCurrent(15);
133 * @expectedException \LogicException
134 * @expectedExceptionMessage You can't regress the progress bar
136 public function testRegressProgress()
138 $progress = new ProgressHelper();
139 $progress->start($output = $this->getOutputStream(), 50);
140 $progress->setCurrent(15);
141 $progress->setCurrent(10);
144 public function testRedrawFrequency()
146 $progress = $this->getMockBuilder('Symfony\Component\Console\Helper\ProgressHelper')->setMethods(array('display'))->getMock();
147 $progress->expects($this->exactly(4))
150 $progress->setRedrawFrequency(2);
152 $progress->start($output = $this->getOutputStream(), 6);
153 $progress->setCurrent(1);
154 $progress->advance(2);
155 $progress->advance(2);
156 $progress->advance(1);
159 public function testMultiByteSupport()
161 $progress = new ProgressHelper();
162 $progress->start($output = $this->getOutputStream());
163 $progress->setBarCharacter('■');
164 $progress->advance(3);
166 rewind($output->getStream());
167 $this->assertEquals($this->generateOutput(' 3 [■■■>------------------------]'), stream_get_contents($output->getStream()));
170 public function testClear()
172 $progress = new ProgressHelper();
173 $progress->start($output = $this->getOutputStream(), 50);
174 $progress->setCurrent(25);
177 rewind($output->getStream());
179 $this->generateOutput(' 25/50 [==============>-------------] 50%').$this->generateOutput(''),
180 stream_get_contents($output->getStream())
184 public function testPercentNotHundredBeforeComplete()
186 $progress = new ProgressHelper();
187 $progress->start($output = $this->getOutputStream(), 200);
188 $progress->display();
189 $progress->advance(199);
190 $progress->advance();
192 rewind($output->getStream());
193 $this->assertEquals($this->generateOutput(' 0/200 [>---------------------------] 0%').$this->generateOutput(' 199/200 [===========================>] 99%').$this->generateOutput(' 200/200 [============================] 100%'), stream_get_contents($output->getStream()));
196 public function testNonDecoratedOutput()
198 $progress = new ProgressHelper();
199 $progress->start($output = $this->getOutputStream(false));
200 $progress->advance();
202 rewind($output->getStream());
203 $this->assertEquals('', stream_get_contents($output->getStream()));
206 protected function getOutputStream($decorated = true)
208 return new StreamOutput(fopen('php://memory', 'r+', false), StreamOutput::VERBOSITY_NORMAL, $decorated);
211 protected $lastMessagesLength;
213 protected function generateOutput($expected)
215 $expectedout = $expected;
217 if ($this->lastMessagesLength !== null) {
218 $expectedout = str_pad($expected, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT);
221 $this->lastMessagesLength = strlen($expectedout);
223 return "\x0D".$expectedout;