4 * This file is part of the Behat.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Behat\Output\Node\Printer\Pretty;
13 use Behat\Behat\Output\Node\Printer\Helper\ResultToStringConverter;
14 use Behat\Behat\Output\Node\Printer\SetupPrinter;
15 use Behat\Testwork\Call\CallResult;
16 use Behat\Testwork\Exception\ExceptionPresenter;
17 use Behat\Testwork\Hook\Tester\Setup\HookedSetup;
18 use Behat\Testwork\Hook\Tester\Setup\HookedTeardown;
19 use Behat\Testwork\Output\Formatter;
20 use Behat\Testwork\Output\Printer\OutputPrinter;
21 use Behat\Testwork\Tester\Result\TestResult;
22 use Behat\Testwork\Tester\Setup\Setup;
23 use Behat\Testwork\Tester\Setup\Teardown;
26 * Prints hooks in a pretty fashion.
28 * @author Konstantin Kudryashov <ever.zet@gmail.com>
30 final class PrettySetupPrinter implements SetupPrinter
33 * @var ResultToStringConverter
35 private $resultConverter;
37 * @var ExceptionPresenter
39 private $exceptionPresenter;
47 private $newlineBefore;
51 private $newlineAfter;
54 * Initializes printer.
56 * @param ResultToStringConverter $resultConverter
57 * @param ExceptionPresenter $exceptionPresenter
58 * @param integer $indentation
59 * @param Boolean $newlineBefore
60 * @param Boolean $newlineAfter
62 public function __construct(
63 ResultToStringConverter $resultConverter,
64 ExceptionPresenter $exceptionPresenter,
66 $newlineBefore = false,
69 $this->resultConverter = $resultConverter;
70 $this->exceptionPresenter = $exceptionPresenter;
71 $this->indentText = str_repeat(' ', intval($indentation));
72 $this->newlineBefore = $newlineBefore;
73 $this->newlineAfter = $newlineAfter;
79 public function printSetup(Formatter $formatter, Setup $setup)
81 if (!$setup instanceof HookedSetup) {
85 foreach ($setup->getHookCallResults() as $callResult) {
86 $this->printSetupHookCallResult($formatter->getOutputPrinter(), $callResult);
93 public function printTeardown(Formatter $formatter, Teardown $teardown)
95 if (!$teardown instanceof HookedTeardown) {
99 foreach ($teardown->getHookCallResults() as $callResult) {
100 $this->printTeardownHookCallResult($formatter->getOutputPrinter(), $callResult);
105 * Prints setup hook call result.
107 * @param OutputPrinter $printer
108 * @param CallResult $callResult
110 private function printSetupHookCallResult(OutputPrinter $printer, CallResult $callResult)
112 if (!$callResult->hasStdOut() && !$callResult->hasException()) {
116 $resultCode = $callResult->hasException() ? TestResult::FAILED : TestResult::PASSED;
117 $style = $this->resultConverter->convertResultCodeToString($resultCode);
118 $hook = $callResult->getCall()->getCallee();
119 $path = $hook->getPath();
122 sprintf('%s┌─ {+%s}@%s{-%s} {+comment}# %s{-comment}', $this->indentText, $style, $hook, $style, $path)
125 $printer->writeln(sprintf('%s│', $this->indentText));
127 $this->printHookCallStdOut($printer, $callResult, $this->indentText);
128 $this->printHookCallException($printer, $callResult, $this->indentText);
130 if ($this->newlineBefore) {
136 * Prints teardown hook call result.
138 * @param OutputPrinter $printer
139 * @param CallResult $callResult
141 private function printTeardownHookCallResult(OutputPrinter $printer, CallResult $callResult)
143 if (!$callResult->hasStdOut() && !$callResult->hasException()) {
147 $resultCode = $callResult->hasException() ? TestResult::FAILED : TestResult::PASSED;
148 $style = $this->resultConverter->convertResultCodeToString($resultCode);
149 $hook = $callResult->getCall()->getCallee();
150 $path = $hook->getPath();
152 $printer->writeln(sprintf('%s│', $this->indentText));
154 $this->printHookCallStdOut($printer, $callResult, $this->indentText);
155 $this->printHookCallException($printer, $callResult, $this->indentText);
158 sprintf('%s└─ {+%s}@%s{-%s} {+comment}# %s{-comment}', $this->indentText, $style, $hook, $style, $path)
161 if ($this->newlineAfter) {
167 * Prints hook call output (if has some).
169 * @param OutputPrinter $printer
170 * @param CallResult $callResult
171 * @param string $indentText
173 private function printHookCallStdOut(OutputPrinter $printer, CallResult $callResult, $indentText)
175 if (!$callResult->hasStdOut()) {
179 $pad = function ($line) use ($indentText) {
181 '%s│ {+stdout}%s{-stdout}', $indentText, $line
185 $printer->writeln(implode("\n", array_map($pad, explode("\n", $callResult->getStdOut()))));
186 $printer->writeln(sprintf('%s│', $indentText));
190 * Prints hook call exception (if has some).
192 * @param OutputPrinter $printer
193 * @param CallResult $callResult
194 * @param string $indentText
196 private function printHookCallException(OutputPrinter $printer, CallResult $callResult, $indentText)
198 if (!$callResult->hasException()) {
202 $pad = function ($l) use ($indentText) {
204 '%s╳ {+exception}%s{-exception}', $indentText, $l
208 $exception = $this->exceptionPresenter->presentException($callResult->getException());
209 $printer->writeln(implode("\n", array_map($pad, explode("\n", $exception))));
210 $printer->writeln(sprintf('%s│', $indentText));