Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Behat / Output / Node / EventListener / AST / OutlineTableListener.php
diff --git a/vendor/behat/behat/src/Behat/Behat/Output/Node/EventListener/AST/OutlineTableListener.php b/vendor/behat/behat/src/Behat/Behat/Output/Node/EventListener/AST/OutlineTableListener.php
new file mode 100644 (file)
index 0000000..fa77da4
--- /dev/null
@@ -0,0 +1,260 @@
+<?php
+
+/*
+ * This file is part of the Behat.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * 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\AST;
+
+use Behat\Behat\EventDispatcher\Event\AfterOutlineTested;
+use Behat\Behat\EventDispatcher\Event\AfterScenarioSetup;
+use Behat\Behat\EventDispatcher\Event\AfterScenarioTested;
+use Behat\Behat\EventDispatcher\Event\AfterStepSetup;
+use Behat\Behat\EventDispatcher\Event\AfterStepTested;
+use Behat\Behat\EventDispatcher\Event\BeforeOutlineTested;
+use Behat\Behat\EventDispatcher\Event\ExampleTested;
+use Behat\Behat\EventDispatcher\Event\OutlineTested;
+use Behat\Behat\EventDispatcher\Event\StepTested;
+use Behat\Behat\Output\Node\Printer\ExampleRowPrinter;
+use Behat\Behat\Output\Node\Printer\OutlineTablePrinter;
+use Behat\Behat\Output\Node\Printer\SetupPrinter;
+use Behat\Behat\Tester\Result\StepResult;
+use Behat\Gherkin\Node\OutlineNode;
+use Behat\Testwork\Output\Formatter;
+use Behat\Testwork\Output\Node\EventListener\EventListener;
+use Behat\Testwork\Tester\Setup\Setup;
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Listens to outline table events and calls appropriate printers.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+final class OutlineTableListener implements EventListener
+{
+    /**
+     * @var OutlineTablePrinter
+     */
+    private $tablePrinter;
+    /**
+     * @var ExampleRowPrinter
+     */
+    private $exampleRowPrinter;
+    /**
+     * @var SetupPrinter
+     */
+    private $stepSetupPrinter;
+    /**
+     * @var SetupPrinter
+     */
+    private $exampleSetupPrinter;
+    /**
+     * @var OutlineNode
+     */
+    private $outline;
+    /**
+     * @var Setup
+     */
+    private $exampleSetup;
+    /**
+     * @var Boolean
+     */
+    private $headerPrinted = false;
+    /**
+     * @var AfterStepSetup[]
+     */
+    private $stepBeforeTestedEvents = array();
+    /**
+     * @var AfterStepTested[]
+     */
+    private $stepAfterTestedEvents = array();
+
+    /**
+     * Initializes listener.
+     *
+     * @param OutlineTablePrinter $tablePrinter
+     * @param ExampleRowPrinter   $exampleRowPrinter
+     * @param SetupPrinter        $exampleSetupPrinter
+     * @param SetupPrinter        $stepSetupPrinter
+     */
+    public function __construct(
+        OutlineTablePrinter $tablePrinter,
+        ExampleRowPrinter $exampleRowPrinter,
+        SetupPrinter $exampleSetupPrinter,
+        SetupPrinter $stepSetupPrinter
+    ) {
+        $this->tablePrinter = $tablePrinter;
+        $this->exampleRowPrinter = $exampleRowPrinter;
+        $this->exampleSetupPrinter = $exampleSetupPrinter;
+        $this->stepSetupPrinter = $stepSetupPrinter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function listenEvent(Formatter $formatter, Event $event, $eventName)
+    {
+        if ($event instanceof StepTested) {
+            $this->captureStepEvent($event);
+
+            return;
+        }
+
+        $this->captureOutlineOnBeforeOutlineEvent($event);
+        $this->forgetOutlineOnAfterOutlineEvent($eventName);
+        $this->captureExampleSetupOnBeforeEvent($event);
+
+        $this->printHeaderOnAfterExampleEvent($formatter, $event, $eventName);
+        $this->printExampleRowOnAfterExampleEvent($formatter, $event, $eventName);
+        $this->printFooterOnAfterEvent($formatter, $event);
+    }
+
+    /**
+     * Captures step tested event.
+     *
+     * @param StepTested $event
+     */
+    private function captureStepEvent(StepTested $event)
+    {
+        if ($event instanceof AfterStepSetup) {
+            $this->stepBeforeTestedEvents[$event->getStep()->getLine()] = $event;
+        } else {
+            $this->stepAfterTestedEvents[$event->getStep()->getLine()] = $event;
+        }
+    }
+
+    /**
+     * Captures outline into the ivar on outline BEFORE event.
+     *
+     * @param Event $event
+     */
+    private function captureOutlineOnBeforeOutlineEvent(Event $event)
+    {
+        if (!$event instanceof BeforeOutlineTested) {
+            return;
+        }
+
+        $this->outline = $event->getOutline();
+        $this->headerPrinted = false;
+    }
+
+    /**
+     * Captures example setup on example BEFORE event.
+     *
+     * @param Event $event
+     */
+    private function captureExampleSetupOnBeforeEvent(Event $event)
+    {
+        if (!$event instanceof AfterScenarioSetup) {
+            return;
+        }
+
+        $this->exampleSetup = $event->getSetup();
+    }
+
+    /**
+     * Removes outline from the ivar on outline AFTER event.
+     *
+     * @param string $eventName
+     */
+    private function forgetOutlineOnAfterOutlineEvent($eventName)
+    {
+        if (OutlineTested::AFTER !== $eventName) {
+            return;
+        }
+
+        $this->outline = null;
+    }
+
+    /**
+     * Prints outline header (if has not been printed yet) on example AFTER event.
+     *
+     * @param Formatter $formatter
+     * @param Event     $event
+     * @param string    $eventName
+     */
+    private function printHeaderOnAfterExampleEvent(Formatter $formatter, Event $event, $eventName)
+    {
+        if (!$event instanceof AfterScenarioTested || ExampleTested::AFTER !== $eventName) {
+            return;
+        }
+
+        if ($this->headerPrinted) {
+            return;
+        }
+
+        $feature = $event->getFeature();
+        $stepTestResults = $this->getStepTestResults();
+
+        $this->tablePrinter->printHeader($formatter, $feature, $this->outline, $stepTestResults);
+        $this->headerPrinted = true;
+    }
+
+    /**
+     * Prints example row on example AFTER event.
+     *
+     * @param Formatter $formatter
+     * @param Event     $event
+     * @param string    $eventName
+     */
+    private function printExampleRowOnAfterExampleEvent(Formatter $formatter, Event $event, $eventName)
+    {
+        if (!$event instanceof AfterScenarioTested || ExampleTested::AFTER !== $eventName) {
+            return;
+        }
+
+        $example = $event->getScenario();
+
+        $this->exampleSetupPrinter->printSetup($formatter, $this->exampleSetup);
+
+        foreach ($this->stepBeforeTestedEvents as $beforeEvent) {
+            $this->stepSetupPrinter->printSetup($formatter, $beforeEvent->getSetup());
+        }
+
+        $this->exampleRowPrinter->printExampleRow($formatter, $this->outline, $example, $this->stepAfterTestedEvents);
+
+        foreach ($this->stepAfterTestedEvents as $afterEvent) {
+            $this->stepSetupPrinter->printTeardown($formatter, $afterEvent->getTeardown());
+        }
+
+        $this->exampleSetupPrinter->printTeardown($formatter, $event->getTeardown());
+
+        $this->exampleSetup = null;
+        $this->stepBeforeTestedEvents = array();
+        $this->stepAfterTestedEvents = array();
+    }
+
+    /**
+     * Prints outline footer on outline AFTER event.
+     *
+     * @param Formatter $formatter
+     * @param Event     $event
+     */
+    private function printFooterOnAfterEvent(Formatter $formatter, Event $event)
+    {
+        if (!$event instanceof AfterOutlineTested) {
+            return;
+        }
+
+        $this->tablePrinter->printFooter($formatter, $event->getTestResult());
+    }
+
+    /**
+     * Returns currently captured step events results.
+     *
+     * @return StepResult[]
+     */
+    private function getStepTestResults()
+    {
+        return array_map(
+            function (AfterStepTested $event) {
+                return $event->getTestResult();
+            },
+            $this->stepAfterTestedEvents
+        );
+    }
+}