Security update for permissions_by_term
[yaffs-website] / vendor / behat / behat / src / Behat / Testwork / Output / Printer / JUnitOutputPrinter.php
diff --git a/vendor/behat/behat/src/Behat/Testwork/Output/Printer/JUnitOutputPrinter.php b/vendor/behat/behat/src/Behat/Testwork/Output/Printer/JUnitOutputPrinter.php
new file mode 100644 (file)
index 0000000..7577e11
--- /dev/null
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ * This file is part of the Behat Testwork.
+ * (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\Testwork\Output\Printer;
+
+use Behat\Testwork\Output\Printer\Factory\FilesystemOutputFactory;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * A convenient wrapper around the ConsoleOutputPrinter to write valid JUnit
+ * reports.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ * @author James Watson <james@sitepulse.org>
+ */
+final class JUnitOutputPrinter extends StreamOutputPrinter
+{
+    const XML_VERSION  = '1.0';
+    const XML_ENCODING = 'UTF-8';
+
+    /**
+     * @var \DOMDocument
+     */
+    private $domDocument;
+    /**
+     * @var \DOMElement
+     */
+    private $currentTestsuite;
+    /**
+     * @var \DOMElement
+     */
+    private $currentTestcase;
+    /**
+     * @var \DOMElement
+     */
+    private $testSuites;
+
+    public function __construct(FilesystemOutputFactory $outputFactory)
+    {
+        parent::__construct($outputFactory);
+    }
+
+    /**
+     * Creates a new JUnit file.
+     *
+     * The file will be initialized with an XML definition and the root element.
+     *
+     * @param string $name                 The filename (without extension) and default value of the name attribute
+     * @param array  $testsuitesAttributes Attributes for the root element
+     */
+    public function createNewFile($name, array $testsuitesAttributes = array())
+    {
+        $this->setFileName(strtolower(trim(preg_replace('/[^[:alnum:]_]+/', '_', $name), '_')));
+
+        $this->domDocument = new \DOMDocument(self::XML_VERSION, self::XML_ENCODING);
+        $this->domDocument->formatOutput = true;
+
+        $this->testSuites = $this->domDocument->createElement('testsuites');
+        $this->domDocument->appendChild($this->testSuites);
+        $this->addAttributesToNode($this->testSuites, array_merge(array('name' => $name), $testsuitesAttributes));
+        $this->flush();
+    }
+
+    /**
+     * Adds a new <testsuite> node.
+     *
+     * @param array $testsuiteAttributes
+     */
+    public function addTestsuite(array $testsuiteAttributes = array())
+    {
+        $this->currentTestsuite = $this->domDocument->createElement('testsuite');
+        $this->testSuites->appendChild($this->currentTestsuite);
+        $this->addAttributesToNode($this->currentTestsuite, $testsuiteAttributes);
+    }
+
+
+    /**
+     * Adds a new <testcase> node.
+     *
+     * @param array $testcaseAttributes
+     */
+    public function addTestcase(array $testcaseAttributes = array())
+    {
+        $this->currentTestcase = $this->domDocument->createElement('testcase');
+        $this->currentTestsuite->appendChild($this->currentTestcase);
+        $this->addAttributesToNode($this->currentTestcase, $testcaseAttributes);
+    }
+
+    /**
+     * Add a testcase child element.
+     *
+     * @param string $nodeName
+     * @param array  $nodeAttributes
+     * @param string $nodeValue
+     */
+    public function addTestcaseChild($nodeName, array $nodeAttributes = array(), $nodeValue = null)
+    {
+        $childNode = $this->domDocument->createElement($nodeName, $nodeValue);
+        $this->currentTestcase->appendChild($childNode);
+        $this->addAttributesToNode($childNode, $nodeAttributes);
+    }
+
+    private function addAttributesToNode(\DOMElement $node, array $attributes)
+    {
+        foreach ($attributes as $name => $value){
+            $node->setAttribute($name, $value);
+        }
+    }
+
+    /**
+     * Sets file name.
+     *
+     * @param string $fileName
+     * @param string $extension The file extension, defaults to "xml"
+     */
+    public function setFileName($fileName, $extension = 'xml')
+    {
+        if ('.'.$extension !== substr($fileName, strlen($extension) + 1)) {
+            $fileName .= '.'.$extension;
+        }
+
+        $this->getOutputFactory()->setFileName($fileName);
+        $this->flush();
+    }
+
+    /**
+     * Generate XML from the DOMDocument and parse to the the writing stream
+     */
+    public function flush()
+    {
+        if($this->domDocument instanceof \DOMDocument){
+            $this->getWritingStream()->write(
+                $this->domDocument->saveXML(null, LIBXML_NOEMPTYTAG),
+                false,
+                OutputInterface::OUTPUT_RAW
+            );
+        }
+
+        parent::flush();
+    }
+}