Version 1
[yaffs-website] / vendor / phpunit / phpunit / src / Util / Configuration.php
diff --git a/vendor/phpunit/phpunit/src/Util/Configuration.php b/vendor/phpunit/phpunit/src/Util/Configuration.php
new file mode 100644 (file)
index 0000000..5c10416
--- /dev/null
@@ -0,0 +1,1158 @@
+<?php
+/*
+ * This file is part of PHPUnit.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Wrapper for the PHPUnit XML configuration file.
+ *
+ * Example XML configuration file:
+ * <code>
+ * <?xml version="1.0" encoding="utf-8" ?>
+ *
+ * <phpunit backupGlobals="true"
+ *          backupStaticAttributes="false"
+ *          bootstrap="/path/to/bootstrap.php"
+ *          cacheTokens="false"
+ *          columns="80"
+ *          colors="false"
+ *          stderr="false"
+ *          convertErrorsToExceptions="true"
+ *          convertNoticesToExceptions="true"
+ *          convertWarningsToExceptions="true"
+ *          forceCoversAnnotation="false"
+ *          mapTestClassNameToCoveredClassName="false"
+ *          printerClass="PHPUnit_TextUI_ResultPrinter"
+ *          processIsolation="false"
+ *          stopOnError="false"
+ *          stopOnFailure="false"
+ *          stopOnIncomplete="false"
+ *          stopOnRisky="false"
+ *          stopOnSkipped="false"
+ *          testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
+ *          timeoutForSmallTests="1"
+ *          timeoutForMediumTests="10"
+ *          timeoutForLargeTests="60"
+ *          beStrictAboutTestsThatDoNotTestAnything="false"
+ *          beStrictAboutOutputDuringTests="false"
+ *          beStrictAboutTestSize="false"
+ *          beStrictAboutTodoAnnotatedTests="false"
+ *          checkForUnintentionallyCoveredCode="false"
+ *          disallowChangesToGlobalState="false"
+ *          verbose="false">
+ *   <testsuites>
+ *     <testsuite name="My Test Suite">
+ *       <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
+ *       <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
+ *       <exclude>/path/to/files/exclude</exclude>
+ *     </testsuite>
+ *   </testsuites>
+ *
+ *   <groups>
+ *     <include>
+ *       <group>name</group>
+ *     </include>
+ *     <exclude>
+ *       <group>name</group>
+ *     </exclude>
+ *   </groups>
+ *
+ *   <filter>
+ *     <blacklist>
+ *       <directory suffix=".php">/path/to/files</directory>
+ *       <file>/path/to/file</file>
+ *       <exclude>
+ *         <directory suffix=".php">/path/to/files</directory>
+ *         <file>/path/to/file</file>
+ *       </exclude>
+ *     </blacklist>
+ *     <whitelist addUncoveredFilesFromWhitelist="true"
+ *                processUncoveredFilesFromWhitelist="false">
+ *       <directory suffix=".php">/path/to/files</directory>
+ *       <file>/path/to/file</file>
+ *       <exclude>
+ *         <directory suffix=".php">/path/to/files</directory>
+ *         <file>/path/to/file</file>
+ *       </exclude>
+ *     </whitelist>
+ *   </filter>
+ *
+ *   <listeners>
+ *     <listener class="MyListener" file="/optional/path/to/MyListener.php">
+ *       <arguments>
+ *         <array>
+ *           <element key="0">
+ *             <string>Sebastian</string>
+ *           </element>
+ *         </array>
+ *         <integer>22</integer>
+ *         <string>April</string>
+ *         <double>19.78</double>
+ *         <null/>
+ *         <object class="stdClass"/>
+ *         <file>MyRelativeFile.php</file>
+ *         <directory>MyRelativeDir</directory>
+ *       </arguments>
+ *     </listener>
+ *   </listeners>
+ *
+ *   <logging>
+ *     <log type="coverage-html" target="/tmp/report" lowUpperBound="50" highLowerBound="90"/>
+ *     <log type="coverage-clover" target="/tmp/clover.xml"/>
+ *     <log type="coverage-crap4j" target="/tmp/crap.xml" threshold="30"/>
+ *     <log type="json" target="/tmp/logfile.json"/>
+ *     <log type="plain" target="/tmp/logfile.txt"/>
+ *     <log type="tap" target="/tmp/logfile.tap"/>
+ *     <log type="junit" target="/tmp/logfile.xml" logIncompleteSkipped="false"/>
+ *     <log type="testdox-html" target="/tmp/testdox.html"/>
+ *     <log type="testdox-text" target="/tmp/testdox.txt"/>
+ *   </logging>
+ *
+ *   <php>
+ *     <includePath>.</includePath>
+ *     <ini name="foo" value="bar"/>
+ *     <const name="foo" value="bar"/>
+ *     <var name="foo" value="bar"/>
+ *     <env name="foo" value="bar"/>
+ *     <post name="foo" value="bar"/>
+ *     <get name="foo" value="bar"/>
+ *     <cookie name="foo" value="bar"/>
+ *     <server name="foo" value="bar"/>
+ *     <files name="foo" value="bar"/>
+ *     <request name="foo" value="bar"/>
+ *   </php>
+ *
+ *   <selenium>
+ *     <browser name="Firefox on Linux"
+ *              browser="*firefox /usr/lib/firefox/firefox-bin"
+ *              host="my.linux.box"
+ *              port="4444"
+ *              timeout="30000"/>
+ *   </selenium>
+ * </phpunit>
+ * </code>
+ *
+ * @since Class available since Release 3.2.0
+ */
+class PHPUnit_Util_Configuration
+{
+    private static $instances = array();
+
+    protected $document;
+    protected $xpath;
+    protected $filename;
+
+    /**
+     * Loads a PHPUnit configuration file.
+     *
+     * @param string $filename
+     */
+    protected function __construct($filename)
+    {
+        $this->filename = $filename;
+        $this->document = PHPUnit_Util_XML::loadFile($filename, false, true, true);
+        $this->xpath    = new DOMXPath($this->document);
+    }
+
+    /**
+     * @since  Method available since Release 3.4.0
+     */
+    final private function __clone()
+    {
+    }
+
+    /**
+     * Returns a PHPUnit configuration object.
+     *
+     * @param string $filename
+     *
+     * @return PHPUnit_Util_Configuration
+     *
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getInstance($filename)
+    {
+        $realpath = realpath($filename);
+
+        if ($realpath === false) {
+            throw new PHPUnit_Framework_Exception(
+                sprintf(
+                    'Could not read "%s".',
+                    $filename
+                )
+            );
+        }
+
+        if (!isset(self::$instances[$realpath])) {
+            self::$instances[$realpath] = new self($realpath);
+        }
+
+        return self::$instances[$realpath];
+    }
+
+    /**
+     * Returns the realpath to the configuration file.
+     *
+     * @return string
+     *
+     * @since  Method available since Release 3.6.0
+     */
+    public function getFilename()
+    {
+        return $this->filename;
+    }
+
+    /**
+     * Returns the configuration for SUT filtering.
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.1
+     */
+    public function getFilterConfiguration()
+    {
+        $addUncoveredFilesFromWhitelist     = true;
+        $processUncoveredFilesFromWhitelist = false;
+
+        $tmp = $this->xpath->query('filter/whitelist');
+
+        if ($tmp->length == 1) {
+            if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) {
+                $addUncoveredFilesFromWhitelist = $this->getBoolean(
+                    (string) $tmp->item(0)->getAttribute(
+                        'addUncoveredFilesFromWhitelist'
+                    ),
+                    true
+                );
+            }
+
+            if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) {
+                $processUncoveredFilesFromWhitelist = $this->getBoolean(
+                    (string) $tmp->item(0)->getAttribute(
+                        'processUncoveredFilesFromWhitelist'
+                    ),
+                    false
+                );
+            }
+        }
+
+        return array(
+          'blacklist' => array(
+            'include' => array(
+              'directory' => $this->readFilterDirectories(
+                  'filter/blacklist/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                  'filter/blacklist/file'
+              )
+            ),
+            'exclude' => array(
+              'directory' => $this->readFilterDirectories(
+                  'filter/blacklist/exclude/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                  'filter/blacklist/exclude/file'
+              )
+            )
+          ),
+          'whitelist' => array(
+            'addUncoveredFilesFromWhitelist'     => $addUncoveredFilesFromWhitelist,
+            'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist,
+            'include'                            => array(
+              'directory' => $this->readFilterDirectories(
+                  'filter/whitelist/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                  'filter/whitelist/file'
+              )
+            ),
+            'exclude' => array(
+              'directory' => $this->readFilterDirectories(
+                  'filter/whitelist/exclude/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                  'filter/whitelist/exclude/file'
+              )
+            )
+          )
+        );
+    }
+
+    /**
+     * Returns the configuration for groups.
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.1
+     */
+    public function getGroupConfiguration()
+    {
+        $groups = array(
+          'include' => array(),
+          'exclude' => array()
+        );
+
+        foreach ($this->xpath->query('groups/include/group') as $group) {
+            $groups['include'][] = (string) $group->textContent;
+        }
+
+        foreach ($this->xpath->query('groups/exclude/group') as $group) {
+            $groups['exclude'][] = (string) $group->textContent;
+        }
+
+        return $groups;
+    }
+
+    /**
+     * Returns the configuration for listeners.
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.4.0
+     */
+    public function getListenerConfiguration()
+    {
+        $result = array();
+
+        foreach ($this->xpath->query('listeners/listener') as $listener) {
+            $class     = (string) $listener->getAttribute('class');
+            $file      = '';
+            $arguments = array();
+
+            if ($listener->getAttribute('file')) {
+                $file = $this->toAbsolutePath(
+                    (string) $listener->getAttribute('file'),
+                    true
+                );
+            }
+
+            foreach ($listener->childNodes as $node) {
+                if ($node instanceof DOMElement && $node->tagName == 'arguments') {
+                    foreach ($node->childNodes as $argument) {
+                        if ($argument instanceof DOMElement) {
+                            if ($argument->tagName == 'file' ||
+                            $argument->tagName == 'directory') {
+                                $arguments[] = $this->toAbsolutePath((string) $argument->textContent);
+                            } else {
+                                $arguments[] = PHPUnit_Util_XML::xmlToVariable($argument);
+                            }
+                        }
+                    }
+                }
+            }
+
+            $result[] = array(
+              'class'     => $class,
+              'file'      => $file,
+              'arguments' => $arguments
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the logging configuration.
+     *
+     * @return array
+     */
+    public function getLoggingConfiguration()
+    {
+        $result = array();
+
+        foreach ($this->xpath->query('logging/log') as $log) {
+            $type   = (string) $log->getAttribute('type');
+            $target = (string) $log->getAttribute('target');
+
+            if (!$target) {
+                continue;
+            }
+
+            $target = $this->toAbsolutePath($target);
+
+            if ($type == 'coverage-html') {
+                if ($log->hasAttribute('lowUpperBound')) {
+                    $result['lowUpperBound'] = $this->getInteger(
+                        (string) $log->getAttribute('lowUpperBound'),
+                        50
+                    );
+                }
+
+                if ($log->hasAttribute('highLowerBound')) {
+                    $result['highLowerBound'] = $this->getInteger(
+                        (string) $log->getAttribute('highLowerBound'),
+                        90
+                    );
+                }
+            } elseif ($type == 'coverage-crap4j') {
+                if ($log->hasAttribute('threshold')) {
+                    $result['crap4jThreshold'] = $this->getInteger(
+                        (string) $log->getAttribute('threshold'),
+                        30
+                    );
+                }
+            } elseif ($type == 'junit') {
+                if ($log->hasAttribute('logIncompleteSkipped')) {
+                    $result['logIncompleteSkipped'] = $this->getBoolean(
+                        (string) $log->getAttribute('logIncompleteSkipped'),
+                        false
+                    );
+                }
+            } elseif ($type == 'coverage-text') {
+                if ($log->hasAttribute('showUncoveredFiles')) {
+                    $result['coverageTextShowUncoveredFiles'] = $this->getBoolean(
+                        (string) $log->getAttribute('showUncoveredFiles'),
+                        false
+                    );
+                }
+                if ($log->hasAttribute('showOnlySummary')) {
+                    $result['coverageTextShowOnlySummary'] = $this->getBoolean(
+                        (string) $log->getAttribute('showOnlySummary'),
+                        false
+                    );
+                }
+            }
+
+            $result[$type] = $target;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the PHP configuration.
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.1
+     */
+    public function getPHPConfiguration()
+    {
+        $result = array(
+          'include_path' => array(),
+          'ini'          => array(),
+          'const'        => array(),
+          'var'          => array(),
+          'env'          => array(),
+          'post'         => array(),
+          'get'          => array(),
+          'cookie'       => array(),
+          'server'       => array(),
+          'files'        => array(),
+          'request'      => array()
+        );
+
+        foreach ($this->xpath->query('php/includePath') as $includePath) {
+            $path = (string) $includePath->textContent;
+            if ($path) {
+                $result['include_path'][] = $this->toAbsolutePath($path);
+            }
+        }
+
+        foreach ($this->xpath->query('php/ini') as $ini) {
+            $name  = (string) $ini->getAttribute('name');
+            $value = (string) $ini->getAttribute('value');
+
+            $result['ini'][$name] = $value;
+        }
+
+        foreach ($this->xpath->query('php/const') as $const) {
+            $name  = (string) $const->getAttribute('name');
+            $value = (string) $const->getAttribute('value');
+
+            $result['const'][$name] = $this->getBoolean($value, $value);
+        }
+
+        foreach (array('var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
+            foreach ($this->xpath->query('php/' . $array) as $var) {
+                $name  = (string) $var->getAttribute('name');
+                $value = (string) $var->getAttribute('value');
+
+                $result[$array][$name] = $this->getBoolean($value, $value);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Handles the PHP configuration.
+     *
+     * @since  Method available since Release 3.2.20
+     */
+    public function handlePHPConfiguration()
+    {
+        $configuration = $this->getPHPConfiguration();
+
+        if (! empty($configuration['include_path'])) {
+            ini_set(
+                'include_path',
+                implode(PATH_SEPARATOR, $configuration['include_path']) .
+                PATH_SEPARATOR .
+                ini_get('include_path')
+            );
+        }
+
+        foreach ($configuration['ini'] as $name => $value) {
+            if (defined($value)) {
+                $value = constant($value);
+            }
+
+            ini_set($name, $value);
+        }
+
+        foreach ($configuration['const'] as $name => $value) {
+            if (!defined($name)) {
+                define($name, $value);
+            }
+        }
+
+        foreach (array('var', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
+            // See https://github.com/sebastianbergmann/phpunit/issues/277
+            switch ($array) {
+                case 'var':
+                    $target = &$GLOBALS;
+                    break;
+
+                case 'server':
+                    $target = &$_SERVER;
+                    break;
+
+                default:
+                    $target = &$GLOBALS['_' . strtoupper($array)];
+                    break;
+            }
+
+            foreach ($configuration[$array] as $name => $value) {
+                $target[$name] = $value;
+            }
+        }
+
+        foreach ($configuration['env'] as $name => $value) {
+            if (false === getenv($name)) {
+                putenv("{$name}={$value}");
+            }
+            if (!isset($_ENV[$name])) {
+                $_ENV[$name] = $value;
+            }
+        }
+    }
+
+    /**
+     * Returns the PHPUnit configuration.
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.14
+     */
+    public function getPHPUnitConfiguration()
+    {
+        $result = array();
+        $root   = $this->document->documentElement;
+
+        if ($root->hasAttribute('cacheTokens')) {
+            $result['cacheTokens'] = $this->getBoolean(
+                (string) $root->getAttribute('cacheTokens'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('columns')) {
+            $columns = (string) $root->getAttribute('columns');
+
+            if ($columns == 'max') {
+                $result['columns'] = 'max';
+            } else {
+                $result['columns'] = $this->getInteger($columns, 80);
+            }
+        }
+
+        if ($root->hasAttribute('colors')) {
+            /* only allow boolean for compatibility with previous versions
+              'always' only allowed from command line */
+            if ($this->getBoolean($root->getAttribute('colors'), false)) {
+                $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_AUTO;
+            } else {
+                $result['colors'] = PHPUnit_TextUI_ResultPrinter::COLOR_NEVER;
+            }
+        }
+
+        /*
+         * Issue #657
+         */
+        if ($root->hasAttribute('stderr')) {
+            $result['stderr'] = $this->getBoolean(
+                (string) $root->getAttribute('stderr'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('backupGlobals')) {
+            $result['backupGlobals'] = $this->getBoolean(
+                (string) $root->getAttribute('backupGlobals'),
+                true
+            );
+        }
+
+        if ($root->hasAttribute('backupStaticAttributes')) {
+            $result['backupStaticAttributes'] = $this->getBoolean(
+                (string) $root->getAttribute('backupStaticAttributes'),
+                false
+            );
+        }
+
+        if ($root->getAttribute('bootstrap')) {
+            $result['bootstrap'] = $this->toAbsolutePath(
+                (string) $root->getAttribute('bootstrap')
+            );
+        }
+
+        if ($root->hasAttribute('convertErrorsToExceptions')) {
+            $result['convertErrorsToExceptions'] = $this->getBoolean(
+                (string) $root->getAttribute('convertErrorsToExceptions'),
+                true
+            );
+        }
+
+        if ($root->hasAttribute('convertNoticesToExceptions')) {
+            $result['convertNoticesToExceptions'] = $this->getBoolean(
+                (string) $root->getAttribute('convertNoticesToExceptions'),
+                true
+            );
+        }
+
+        if ($root->hasAttribute('convertWarningsToExceptions')) {
+            $result['convertWarningsToExceptions'] = $this->getBoolean(
+                (string) $root->getAttribute('convertWarningsToExceptions'),
+                true
+            );
+        }
+
+        if ($root->hasAttribute('forceCoversAnnotation')) {
+            $result['forceCoversAnnotation'] = $this->getBoolean(
+                (string) $root->getAttribute('forceCoversAnnotation'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('mapTestClassNameToCoveredClassName')) {
+            $result['mapTestClassNameToCoveredClassName'] = $this->getBoolean(
+                (string) $root->getAttribute('mapTestClassNameToCoveredClassName'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('processIsolation')) {
+            $result['processIsolation'] = $this->getBoolean(
+                (string) $root->getAttribute('processIsolation'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('stopOnError')) {
+            $result['stopOnError'] = $this->getBoolean(
+                (string) $root->getAttribute('stopOnError'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('stopOnFailure')) {
+            $result['stopOnFailure'] = $this->getBoolean(
+                (string) $root->getAttribute('stopOnFailure'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('stopOnIncomplete')) {
+            $result['stopOnIncomplete'] = $this->getBoolean(
+                (string) $root->getAttribute('stopOnIncomplete'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('stopOnRisky')) {
+            $result['stopOnRisky'] = $this->getBoolean(
+                (string) $root->getAttribute('stopOnRisky'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('stopOnSkipped')) {
+            $result['stopOnSkipped'] = $this->getBoolean(
+                (string) $root->getAttribute('stopOnSkipped'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('testSuiteLoaderClass')) {
+            $result['testSuiteLoaderClass'] = (string) $root->getAttribute(
+                'testSuiteLoaderClass'
+            );
+        }
+
+        if ($root->getAttribute('testSuiteLoaderFile')) {
+            $result['testSuiteLoaderFile'] = $this->toAbsolutePath(
+                (string) $root->getAttribute('testSuiteLoaderFile')
+            );
+        }
+
+        if ($root->hasAttribute('printerClass')) {
+            $result['printerClass'] = (string) $root->getAttribute(
+                'printerClass'
+            );
+        }
+
+        if ($root->getAttribute('printerFile')) {
+            $result['printerFile'] = $this->toAbsolutePath(
+                (string) $root->getAttribute('printerFile')
+            );
+        }
+
+        if ($root->hasAttribute('timeoutForSmallTests')) {
+            $result['timeoutForSmallTests'] = $this->getInteger(
+                (string) $root->getAttribute('timeoutForSmallTests'),
+                1
+            );
+        }
+
+        if ($root->hasAttribute('timeoutForMediumTests')) {
+            $result['timeoutForMediumTests'] = $this->getInteger(
+                (string) $root->getAttribute('timeoutForMediumTests'),
+                10
+            );
+        }
+
+        if ($root->hasAttribute('timeoutForLargeTests')) {
+            $result['timeoutForLargeTests'] = $this->getInteger(
+                (string) $root->getAttribute('timeoutForLargeTests'),
+                60
+            );
+        }
+
+        if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) {
+            $result['reportUselessTests'] = $this->getBoolean(
+                (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('checkForUnintentionallyCoveredCode')) {
+            $result['strictCoverage'] = $this->getBoolean(
+                (string) $root->getAttribute('checkForUnintentionallyCoveredCode'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('beStrictAboutOutputDuringTests')) {
+            $result['disallowTestOutput'] = $this->getBoolean(
+                (string) $root->getAttribute('beStrictAboutOutputDuringTests'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('beStrictAboutChangesToGlobalState')) {
+            $result['disallowChangesToGlobalState'] = $this->getBoolean(
+                (string) $root->getAttribute('beStrictAboutChangesToGlobalState'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('beStrictAboutTestSize')) {
+            $result['enforceTimeLimit'] = $this->getBoolean(
+                (string) $root->getAttribute('beStrictAboutTestSize'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) {
+            $result['disallowTodoAnnotatedTests'] = $this->getBoolean(
+                (string) $root->getAttribute('beStrictAboutTodoAnnotatedTests'),
+                false
+            );
+        }
+
+        if ($root->hasAttribute('strict')) {
+            $flag = $this->getBoolean(
+                (string) $root->getAttribute('strict'),
+                false
+            );
+
+            $result['reportUselessTests']          = $flag;
+            $result['strictCoverage']              = $flag;
+            $result['disallowTestOutput']          = $flag;
+            $result['enforceTimeLimit']            = $flag;
+            $result['disallowTodoAnnotatedTests']  = $flag;
+            $result['deprecatedStrictModeSetting'] = true;
+        }
+
+        if ($root->hasAttribute('verbose')) {
+            $result['verbose'] = $this->getBoolean(
+                (string) $root->getAttribute('verbose'),
+                false
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the SeleniumTestCase browser configuration.
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.9
+     */
+    public function getSeleniumBrowserConfiguration()
+    {
+        $result = array();
+
+        foreach ($this->xpath->query('selenium/browser') as $config) {
+            $name    = (string) $config->getAttribute('name');
+            $browser = (string) $config->getAttribute('browser');
+
+            if ($config->hasAttribute('host')) {
+                $host = (string) $config->getAttribute('host');
+            } else {
+                $host = 'localhost';
+            }
+
+            if ($config->hasAttribute('port')) {
+                $port = $this->getInteger(
+                    (string) $config->getAttribute('port'),
+                    4444
+                );
+            } else {
+                $port = 4444;
+            }
+
+            if ($config->hasAttribute('timeout')) {
+                $timeout = $this->getInteger(
+                    (string) $config->getAttribute('timeout'),
+                    30000
+                );
+            } else {
+                $timeout = 30000;
+            }
+
+            $result[] = array(
+              'name'    => $name,
+              'browser' => $browser,
+              'host'    => $host,
+              'port'    => $port,
+              'timeout' => $timeout
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the test suite configuration.
+     *
+     * @return PHPUnit_Framework_TestSuite
+     *
+     * @since  Method available since Release 3.2.1
+     */
+    public function getTestSuiteConfiguration($testSuiteFilter = null)
+    {
+        $testSuiteNodes = $this->xpath->query('testsuites/testsuite');
+
+        if ($testSuiteNodes->length == 0) {
+            $testSuiteNodes = $this->xpath->query('testsuite');
+        }
+
+        if ($testSuiteNodes->length == 1) {
+            return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter);
+        }
+
+        if ($testSuiteNodes->length > 1) {
+            $suite = new PHPUnit_Framework_TestSuite;
+
+            foreach ($testSuiteNodes as $testSuiteNode) {
+                $suite->addTestSuite(
+                    $this->getTestSuite($testSuiteNode, $testSuiteFilter)
+                );
+            }
+
+            return $suite;
+        }
+    }
+
+    /**
+     * @param DOMElement $testSuiteNode
+     *
+     * @return PHPUnit_Framework_TestSuite
+     *
+     * @since  Method available since Release 3.4.0
+     */
+    protected function getTestSuite(DOMElement $testSuiteNode, $testSuiteFilter = null)
+    {
+        if ($testSuiteNode->hasAttribute('name')) {
+            $suite = new PHPUnit_Framework_TestSuite(
+                (string) $testSuiteNode->getAttribute('name')
+            );
+        } else {
+            $suite = new PHPUnit_Framework_TestSuite;
+        }
+
+        $exclude = array();
+
+        foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) {
+            $excludeFile = (string) $excludeNode->textContent;
+            if ($excludeFile) {
+                $exclude[] = $this->toAbsolutePath($excludeFile);
+            }
+        }
+
+        $fileIteratorFacade = new File_Iterator_Facade;
+
+        foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) {
+            if ($testSuiteFilter && $directoryNode->parentNode->getAttribute('name') != $testSuiteFilter) {
+                continue;
+            }
+
+            $directory = (string) $directoryNode->textContent;
+
+            if (empty($directory)) {
+                continue;
+            }
+
+            if ($directoryNode->hasAttribute('phpVersion')) {
+                $phpVersion = (string) $directoryNode->getAttribute('phpVersion');
+            } else {
+                $phpVersion = PHP_VERSION;
+            }
+
+            if ($directoryNode->hasAttribute('phpVersionOperator')) {
+                $phpVersionOperator = (string) $directoryNode->getAttribute('phpVersionOperator');
+            } else {
+                $phpVersionOperator = '>=';
+            }
+
+            if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
+                continue;
+            }
+
+            if ($directoryNode->hasAttribute('prefix')) {
+                $prefix = (string) $directoryNode->getAttribute('prefix');
+            } else {
+                $prefix = '';
+            }
+
+            if ($directoryNode->hasAttribute('suffix')) {
+                $suffix = (string) $directoryNode->getAttribute('suffix');
+            } else {
+                $suffix = 'Test.php';
+            }
+
+            $files = $fileIteratorFacade->getFilesAsArray(
+                $this->toAbsolutePath($directory),
+                $suffix,
+                $prefix,
+                $exclude
+            );
+            $suite->addTestFiles($files);
+        }
+
+        foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) {
+            if ($testSuiteFilter && $fileNode->parentNode->getAttribute('name') != $testSuiteFilter) {
+                continue;
+            }
+
+            $file = (string) $fileNode->textContent;
+
+            if (empty($file)) {
+                continue;
+            }
+
+            // Get the absolute path to the file
+            $file = $fileIteratorFacade->getFilesAsArray(
+                $this->toAbsolutePath($file)
+            );
+
+            if (!isset($file[0])) {
+                continue;
+            }
+
+            $file = $file[0];
+
+            if ($fileNode->hasAttribute('phpVersion')) {
+                $phpVersion = (string) $fileNode->getAttribute('phpVersion');
+            } else {
+                $phpVersion = PHP_VERSION;
+            }
+
+            if ($fileNode->hasAttribute('phpVersionOperator')) {
+                $phpVersionOperator = (string) $fileNode->getAttribute('phpVersionOperator');
+            } else {
+                $phpVersionOperator = '>=';
+            }
+
+            if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
+                continue;
+            }
+
+            $suite->addTestFile($file);
+        }
+
+        return $suite;
+    }
+
+    /**
+     * @param string $value
+     * @param bool   $default
+     *
+     * @return bool
+     *
+     * @since  Method available since Release 3.2.3
+     */
+    protected function getBoolean($value, $default)
+    {
+        if (strtolower($value) == 'false') {
+            return false;
+        } elseif (strtolower($value) == 'true') {
+            return true;
+        }
+
+        return $default;
+    }
+
+    /**
+     * @param string $value
+     * @param bool   $default
+     *
+     * @return bool
+     *
+     * @since  Method available since Release 3.6.0
+     */
+    protected function getInteger($value, $default)
+    {
+        if (is_numeric($value)) {
+            return (int) $value;
+        }
+
+        return $default;
+    }
+
+    /**
+     * @param string $query
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.3
+     */
+    protected function readFilterDirectories($query)
+    {
+        $directories = array();
+
+        foreach ($this->xpath->query($query) as $directory) {
+            $directoryPath = (string) $directory->textContent;
+
+            if (!$directoryPath) {
+                continue;
+            }
+
+            if ($directory->hasAttribute('prefix')) {
+                $prefix = (string) $directory->getAttribute('prefix');
+            } else {
+                $prefix = '';
+            }
+
+            if ($directory->hasAttribute('suffix')) {
+                $suffix = (string) $directory->getAttribute('suffix');
+            } else {
+                $suffix = '.php';
+            }
+
+            if ($directory->hasAttribute('group')) {
+                $group = (string) $directory->getAttribute('group');
+            } else {
+                $group = 'DEFAULT';
+            }
+
+            $directories[] = array(
+              'path'   => $this->toAbsolutePath($directoryPath),
+              'prefix' => $prefix,
+              'suffix' => $suffix,
+              'group'  => $group
+            );
+        }
+
+        return $directories;
+    }
+
+    /**
+     * @param string $query
+     *
+     * @return array
+     *
+     * @since  Method available since Release 3.2.3
+     */
+    protected function readFilterFiles($query)
+    {
+        $files = array();
+
+        foreach ($this->xpath->query($query) as $file) {
+            $filePath = (string) $file->textContent;
+
+            if ($filePath) {
+                $files[] = $this->toAbsolutePath($filePath);
+            }
+        }
+
+        return $files;
+    }
+
+    /**
+     * @param string $path
+     * @param bool   $useIncludePath
+     *
+     * @return string
+     *
+     * @since  Method available since Release 3.5.0
+     */
+    protected function toAbsolutePath($path, $useIncludePath = false)
+    {
+        $path = trim($path);
+
+        if ($path[0] === '/') {
+            return $path;
+        }
+
+        // Matches the following on Windows:
+        //  - \\NetworkComputer\Path
+        //  - \\.\D:
+        //  - \\.\c:
+        //  - C:\Windows
+        //  - C:\windows
+        //  - C:/windows
+        //  - c:/windows
+        if (defined('PHP_WINDOWS_VERSION_BUILD') &&
+            ($path[0] === '\\' ||
+            (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) {
+            return $path;
+        }
+
+        // Stream
+        if (strpos($path, '://') !== false) {
+            return $path;
+        }
+
+        $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path;
+
+        if ($useIncludePath && !file_exists($file)) {
+            $includePathFile = stream_resolve_include_path($path);
+
+            if ($includePathFile) {
+                $file = $includePathFile;
+            }
+        }
+
+        return $file;
+    }
+}