* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Behat\Output\Node\Printer\Pretty; use Behat\Behat\Output\Node\Printer\Helper\ResultToStringConverter; use Behat\Behat\Output\Node\Printer\SetupPrinter; use Behat\Testwork\Call\CallResult; use Behat\Testwork\Exception\ExceptionPresenter; use Behat\Testwork\Hook\Tester\Setup\HookedSetup; use Behat\Testwork\Hook\Tester\Setup\HookedTeardown; use Behat\Testwork\Output\Formatter; use Behat\Testwork\Output\Printer\OutputPrinter; use Behat\Testwork\Tester\Result\TestResult; use Behat\Testwork\Tester\Setup\Setup; use Behat\Testwork\Tester\Setup\Teardown; /** * Prints hooks in a pretty fashion. * * @author Konstantin Kudryashov */ final class PrettySetupPrinter implements SetupPrinter { /** * @var ResultToStringConverter */ private $resultConverter; /** * @var ExceptionPresenter */ private $exceptionPresenter; /** * @var string */ private $indentText; /** * @var bool */ private $newlineBefore; /** * @var bool */ private $newlineAfter; /** * Initializes printer. * * @param ResultToStringConverter $resultConverter * @param ExceptionPresenter $exceptionPresenter * @param integer $indentation * @param bool $newlineBefore * @param bool $newlineAfter */ public function __construct( ResultToStringConverter $resultConverter, ExceptionPresenter $exceptionPresenter, $indentation = 0, $newlineBefore = false, $newlineAfter = false ) { $this->resultConverter = $resultConverter; $this->exceptionPresenter = $exceptionPresenter; $this->indentText = str_repeat(' ', intval($indentation)); $this->newlineBefore = $newlineBefore; $this->newlineAfter = $newlineAfter; } /** * {@inheritdoc} */ public function printSetup(Formatter $formatter, Setup $setup) { if (!$setup instanceof HookedSetup) { return; } foreach ($setup->getHookCallResults() as $callResult) { $this->printSetupHookCallResult($formatter->getOutputPrinter(), $callResult); } } /** * {@inheritdoc} */ public function printTeardown(Formatter $formatter, Teardown $teardown) { if (!$teardown instanceof HookedTeardown) { return; } foreach ($teardown->getHookCallResults() as $callResult) { $this->printTeardownHookCallResult($formatter->getOutputPrinter(), $callResult); } } /** * Prints setup hook call result. * * @param OutputPrinter $printer * @param CallResult $callResult */ private function printSetupHookCallResult(OutputPrinter $printer, CallResult $callResult) { if (!$callResult->hasStdOut() && !$callResult->hasException()) { return; } $resultCode = $callResult->hasException() ? TestResult::FAILED : TestResult::PASSED; $style = $this->resultConverter->convertResultCodeToString($resultCode); $hook = $callResult->getCall()->getCallee(); $path = $hook->getPath(); $printer->writeln( sprintf('%s┌─ {+%s}@%s{-%s} {+comment}# %s{-comment}', $this->indentText, $style, $hook, $style, $path) ); $printer->writeln(sprintf('%s│', $this->indentText)); $this->printHookCallStdOut($printer, $callResult, $this->indentText); $this->printHookCallException($printer, $callResult, $this->indentText); if ($this->newlineBefore) { $printer->writeln(); } } /** * Prints teardown hook call result. * * @param OutputPrinter $printer * @param CallResult $callResult */ private function printTeardownHookCallResult(OutputPrinter $printer, CallResult $callResult) { if (!$callResult->hasStdOut() && !$callResult->hasException()) { return; } $resultCode = $callResult->hasException() ? TestResult::FAILED : TestResult::PASSED; $style = $this->resultConverter->convertResultCodeToString($resultCode); $hook = $callResult->getCall()->getCallee(); $path = $hook->getPath(); $printer->writeln(sprintf('%s│', $this->indentText)); $this->printHookCallStdOut($printer, $callResult, $this->indentText); $this->printHookCallException($printer, $callResult, $this->indentText); $printer->writeln( sprintf('%s└─ {+%s}@%s{-%s} {+comment}# %s{-comment}', $this->indentText, $style, $hook, $style, $path) ); if ($this->newlineAfter) { $printer->writeln(); } } /** * Prints hook call output (if has some). * * @param OutputPrinter $printer * @param CallResult $callResult * @param string $indentText */ private function printHookCallStdOut(OutputPrinter $printer, CallResult $callResult, $indentText) { if (!$callResult->hasStdOut()) { return; } $pad = function ($line) use ($indentText) { return sprintf( '%s│ {+stdout}%s{-stdout}', $indentText, $line ); }; $printer->writeln(implode("\n", array_map($pad, explode("\n", $callResult->getStdOut())))); $printer->writeln(sprintf('%s│', $indentText)); } /** * Prints hook call exception (if has some). * * @param OutputPrinter $printer * @param CallResult $callResult * @param string $indentText */ private function printHookCallException(OutputPrinter $printer, CallResult $callResult, $indentText) { if (!$callResult->hasException()) { return; } $pad = function ($l) use ($indentText) { return sprintf( '%s╳ {+exception}%s{-exception}', $indentText, $l ); }; $exception = $this->exceptionPresenter->presentException($callResult->getException()); $printer->writeln(implode("\n", array_map($pad, explode("\n", $exception)))); $printer->writeln(sprintf('%s│', $indentText)); } }