* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Behat\Output\Node\EventListener\JUnit; use Behat\Behat\EventDispatcher\Event\BeforeOutlineTested; use Behat\Behat\Output\Node\Printer\SuitePrinter; use Behat\Gherkin\Node\ExampleNode; use Behat\Gherkin\Node\OutlineNode; use Behat\Testwork\EventDispatcher\Event\AfterSuiteTested; use Behat\Testwork\EventDispatcher\Event\BeforeSuiteTested; use Behat\Testwork\Output\Formatter; use Behat\Testwork\Output\Node\EventListener\EventListener; use Symfony\Component\EventDispatcher\Event; /** * Listens for Outline events store the current one * * @author James Watson */ final class JUnitOutlineStoreListener implements EventListener { /** * @var SuitePrinter */ private $suitePrinter; /** * @var array */ private $lineScenarioMap = array(); /** * Initializes listener. * * @param SuitePrinter $suitePrinter */ public function __construct(SuitePrinter $suitePrinter) { $this->suitePrinter = $suitePrinter; } /** * {@inheritdoc} */ public function listenEvent(Formatter $formatter, Event $event, $eventName) { $this->captureOutlineOnBeforeOutlineEvent($event); $this->printHeaderOnBeforeSuiteTestedEvent($formatter, $event); $this->printFooterOnAfterSuiteTestedEvent($formatter, $event); } /** * Captures outline into the ivar on outline BEFORE event. * * @param Event $event */ private function captureOutlineOnBeforeOutlineEvent(Event $event) { if (!$event instanceof BeforeOutlineTested) { return; } $outline = $event->getOutline(); foreach ($outline->getExamples() as $example) { $this->lineScenarioMap[$example->getLine()] = $outline; } } /** * @param Formatter $formatter * @param Event $event */ private function printHeaderOnBeforeSuiteTestedEvent(Formatter $formatter, Event $event) { if (!$event instanceof BeforeSuiteTested) { return; } $this->suitePrinter->printHeader($formatter, $event->getSuite()); } /** * @param Formatter $formatter * @param Event $event */ private function printFooterOnAfterSuiteTestedEvent(Formatter $formatter, Event $event) { if (!$event instanceof AfterSuiteTested) { return; } $this->suitePrinter->printFooter($formatter, $event->getSuite()); } /** * @param ExampleNode $scenario * @return OutlineNode */ public function getCurrentOutline(ExampleNode $scenario) { return $this->lineScenarioMap[$scenario->getLine()]; } }