diff options
Diffstat (limited to 'buildscripts/PHPUnit2/Framework/TestSuite.php')
| -rw-r--r-- | buildscripts/PHPUnit2/Framework/TestSuite.php | 1108 | 
1 files changed, 554 insertions, 554 deletions
| diff --git a/buildscripts/PHPUnit2/Framework/TestSuite.php b/buildscripts/PHPUnit2/Framework/TestSuite.php index 3d5d670e..12c4ce5a 100644 --- a/buildscripts/PHPUnit2/Framework/TestSuite.php +++ b/buildscripts/PHPUnit2/Framework/TestSuite.php @@ -1,554 +1,554 @@ -<?php
 -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 -
 -/**
 - * PHP Version 5
 - *
 - * Copyright (c) 2002-2006, Sebastian Bergmann <sb@sebastian-bergmann.de>.
 - * All rights reserved.
 - *
 - * Redistribution and use in source and binary forms, with or without
 - * modification, are permitted provided that the following conditions
 - * are met:
 - *
 - *   * Redistributions of source code must retain the above copyright
 - *     notice, this list of conditions and the following disclaimer.
 - * 
 - *   * Redistributions in binary form must reproduce the above copyright
 - *     notice, this list of conditions and the following disclaimer in
 - *     the documentation and/or other materials provided with the
 - *     distribution.
 - *
 - *   * Neither the name of Sebastian Bergmann nor the names of his
 - *     contributors may be used to endorse or promote products derived
 - *     from this software without specific prior written permission.
 - *
 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
 - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 - * POSSIBILITY OF SUCH DAMAGE.
 - *
 - * @category   Testing
 - * @package    PHPUnit2
 - * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
 - * @copyright  2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
 - * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
 - * @version    CVS: $Id: TestSuite.php,v 1.26.2.11 2005/12/17 16:04:56 sebastian Exp $
 - * @link       http://pear.php.net/package/PHPUnit2
 - * @since      File available since Release 2.0.0
 - */
 -
 -require_once 'PHPUnit2/Framework/Test.php';
 -require_once 'PHPUnit2/Framework/TestCase.php';
 -require_once 'PHPUnit2/Framework/TestResult.php';
 -require_once 'PHPUnit2/Runner/BaseTestRunner.php';
 -require_once 'PHPUnit2/Util/Fileloader.php';
 -
 -/**
 - * A TestSuite is a composite of Tests. It runs a collection of test cases.
 - *
 - * Here is an example using the dynamic test definition.
 - *
 - * <code>
 - * <?php
 - * $suite = new PHPUnit2_Framework_TestSuite;
 - * $suite->addTest(new MathTest('testPass'));
 - * ?>
 - * </code>
 - *
 - * Alternatively, a TestSuite can extract the tests to be run automatically.
 - * To do so you pass a ReflectionClass instance for your
 - * PHPUnit2_Framework_TestCase class to the PHPUnit2_Framework_TestSuite
 - * constructor.
 - *
 - * <code>
 - * <?php
 - * $suite = new PHPUnit2_Framework_TestSuite(
 - *   new ReflectionClass('MathTest')
 - * );
 - * ?>
 - * </code>
 - *
 - * This constructor creates a suite with all the methods starting with
 - * "test" that take no arguments.
 - *
 - * @category   Testing
 - * @package    PHPUnit2
 - * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
 - * @copyright  2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
 - * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
 - * @version    Release: @package_version@
 - * @link       http://pear.php.net/package/PHPUnit2
 - * @since      Class available since Release 2.0.0
 - */
 -class PHPUnit2_Framework_TestSuite implements PHPUnit2_Framework_Test {
 -    /**
 -     * The name of the test suite.
 -     *
 -     * @var    string
 -     * @access private
 -     */
 -    private $name = '';
 -
 -    /**
 -     * The tests in the test suite.
 -     *
 -     * @var    array
 -     * @access private
 -     */
 -    private $tests = array();
 -
 -    /**
 -     * Constructs a new TestSuite:
 -     *
 -     *   - PHPUnit2_Framework_TestSuite() constructs an empty TestSuite.
 -     *
 -     *   - PHPUnit2_Framework_TestSuite(ReflectionClass) constructs a
 -     *     TestSuite from the given class.
 -     *
 -     *   - PHPUnit2_Framework_TestSuite(ReflectionClass, String)
 -     *     constructs a TestSuite from the given class with the given
 -     *     name.
 -     *
 -     *   - PHPUnit2_Framework_TestSuite(String) either constructs a
 -     *     TestSuite from the given class (if the passed string is the
 -     *     name of an existing class) or constructs an empty TestSuite
 -     *     with the given name.
 -     *
 -     * @param  mixed  $theClass
 -     * @param  string $name
 -     * @throws Exception
 -     * @access public
 -     */
 -    public function __construct($theClass = '', $name = '') {
 -        $argumentsValid = FALSE;
 -
 -        if (is_object($theClass) &&
 -            $theClass instanceof ReflectionClass) {
 -            $argumentsValid = TRUE;
 -        }
 -
 -        else if (is_string($theClass) && $theClass !== '' && class_exists($theClass)) {
 -            $argumentsValid = TRUE;
 -
 -            if ($name == '') {
 -                $name = $theClass;
 -            }
 -
 -            $theClass = new ReflectionClass($theClass);
 -        }
 -
 -        else if (is_string($theClass)) {
 -            $this->setName($theClass);
 -            return;
 -        }
 -
 -        if (!$argumentsValid) {
 -            throw new Exception;
 -        }
 -
 -        if ($name != '') {
 -            $this->setName($name);
 -        } else {
 -            $this->setName($theClass->getName());
 -        }
 -
 -        $constructor = $theClass->getConstructor();
 -
 -        if ($constructor === NULL ||
 -            !$constructor->isPublic()) {
 -            $this->addTest(
 -              self::warning(
 -                sprintf(
 -                  'Class %s has no public constructor',
 -
 -                  $theClass->getName()
 -                )
 -              )
 -            );
 -
 -            return;
 -        }
 -
 -        $methods = $theClass->getMethods();
 -        $names   = array();
 -
 -        foreach ($methods as $method) {
 -            $this->addTestMethod($method, $names, $theClass);
 -        }
 -
 -        if (empty($this->tests)) {
 -            $this->addTest(
 -              self::warning(
 -                sprintf(
 -                  'No tests found in %s',
 -
 -                  $theClass->getName()
 -                )
 -              )
 -            );
 -        }
 -    }
 -
 -    /**
 -     * Returns a string representation of the test suite.
 -     *
 -     * @return string
 -     * @access public
 -     */
 -    public function toString() {
 -        return $this->getName();
 -    }
 -
 -    /**
 -     * Adds a test to the suite.
 -     *
 -     * @param  PHPUnit2_Framework_Test $test
 -     * @access public
 -     */
 -    public function addTest(PHPUnit2_Framework_Test $test) {
 -        $this->tests[] = $test;
 -    }
 -
 -    /**
 -     * Adds the tests from the given class to the suite.
 -     *
 -     * @param  mixed $testClass
 -     * @access public
 -     */
 -    public function addTestSuite($testClass) {
 -        if (is_string($testClass) &&
 -            class_exists($testClass)) {
 -            $testClass = new ReflectionClass($testClass);
 -        }
 -
 -        if (is_object($testClass) &&
 -            $testClass instanceof ReflectionClass) {
 -            $this->addTest(new PHPUnit2_Framework_TestSuite($testClass));
 -        }
 -    }
 -
 -    /**
 -     * Wraps both <code>addTest()</code> and <code>addTestSuite</code>
 -     * as well as the separate import statements for the user's convenience.
 -     *
 -     * If the named file cannot be read or there are no new tests that can be
 -     * added, a <code>PHPUnit2_Framework_Warning</code> will be created instead,
 -     * leaving the current test run untouched.
 -     *
 -     * @param  string $filename
 -     * @throws Exception
 -     * @access public
 -     * @since  Method available since Release 2.3.0
 -     * @author Stefano F. Rausch <stefano@rausch-e.net>
 -     */
 -    public function addTestFile($filename) {
 -        if (!is_string($filename) || !file_exists($filename)) {
 -            throw new Exception;
 -        }
 -
 -        $declaredClasses = get_declared_classes();
 -
 -        PHPUnit2_Util_Fileloader::checkAndLoad($filename);
 -
 -        $newClasses = array_values(
 -          array_diff(get_declared_classes(), $declaredClasses)
 -        );
 -
 -        $testsFound = 0;
 -
 -        foreach ($newClasses as $class) {
 -            if (preg_match('"Tests?$"', $class)) {
 -                try {
 -                    $suiteMethod = new ReflectionMethod(
 -                      $class, PHPUnit2_Runner_BaseTestRunner::SUITE_METHODNAME
 -                    );
 -
 -                    $this->addTest($suiteMethod->invoke(NULL));
 -                } catch (ReflectionException $e) {
 -                    $this->addTestSuite(new ReflectionClass($class));
 -                }
 -
 -                $testsFound++;
 -            }
 -        }
 -
 -        if ($testsFound == 0) {
 -            $this->addTest(
 -              new PHPUnit2_Framework_Warning('No tests found in file ' . $filename)
 -            );
 -        }
 -    }
 -
 -    /**
 -     * Wrapper for addTestFile() that adds multiple test files.
 -     *
 -     * @param  Array $filenames
 -     * @throws Exception
 -     * @access public
 -     * @since  Method available since Release 2.3.0
 -     */
 -    public function addTestFiles($filenames) {
 -        foreach ($filenames as $filename) {
 -            $this->addTestFile($filename);
 -        }
 -    }
 -
 -    /**
 -     * Counts the number of test cases that will be run by this test.
 -     *
 -     * @return integer
 -     * @access public
 -     */
 -    public function countTestCases() {
 -        $count = 0;
 -
 -        foreach ($this->tests as $test) {
 -            $count += $test->countTestCases();
 -        }
 -
 -        return $count;
 -    }
 -
 -    /**
 -     * @param  ReflectionClass $theClass
 -     * @param  string          $name
 -     * @return PHPUnit2_Framework_Test
 -     * @access public
 -     * @static
 -     */
 -    public static function createTest(ReflectionClass $theClass, $name) {
 -        if (!$theClass->isInstantiable()) {
 -            return self::warning(
 -              sprintf(
 -                'Cannot instantiate test case %s.',
 -                $theClass->getName()
 -              )
 -            );
 -        }
 -
 -        $constructor = $theClass->getConstructor();
 -
 -        if ($constructor !== NULL) {
 -            $parameters = $constructor->getParameters();
 -
 -            if (sizeof($parameters) == 0) {
 -                $test = $theClass->newInstance();
 -
 -                if ($test instanceof PHPUnit2_Framework_TestCase) {
 -                    $test->setName($name);
 -                }
 -            }
 -
 -            else if (sizeof($parameters) == 1 &&
 -                     $parameters[0]->getClass() === NULL) {
 -                $test = $theClass->newInstance($name);
 -            }
 -
 -            else {
 -                return self::warning(
 -                  sprintf(
 -                    'Constructor of class %s is not TestCase($name) or TestCase().',
 -                    $theClass->getName()
 -                  )
 -                );
 -            }
 -        }
 -
 -        return $test;
 -    }
 -
 -    /**
 -     * Creates a default TestResult object.
 -     *
 -     * @return PHPUnit2_Framework_TestResult
 -     * @access protected
 -     */
 -    protected function createResult() {
 -        return new PHPUnit2_Framework_TestResult;
 -    }
 -
 -    /**
 -     * Returns the name of the suite.
 -     *
 -     * @return string
 -     * @access public
 -     */
 -    public function getName() {
 -        return $this->name;
 -    }
 -
 -    /**
 -     * Runs the tests and collects their result in a TestResult.
 -     *
 -     * @param  PHPUnit2_Framework_TestResult $result
 -     * @return PHPUnit2_Framework_TestResult
 -     * @throws Exception
 -     * @access public
 -     */
 -    public function run($result = NULL) {
 -        if ($result === NULL) {
 -            $result = $this->createResult();
 -        }
 -
 -        // XXX: Workaround for missing ability to declare type-hinted parameters as optional.
 -        else if (!($result instanceof PHPUnit2_Framework_TestResult)) {
 -            throw new Exception(
 -              'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.'
 -            );
 -        }
 -
 -        $result->startTestSuite($this);
 -
 -        foreach ($this->tests as $test) {
 -            if ($result->shouldStop()) {
 -                break;
 -            }
 -
 -            $this->runTest($test, $result);
 -        }
 -
 -        $result->endTestSuite($this);
 -
 -        return $result;
 -    }
 -
 -    /**
 -     * Runs a test.
 -     *
 -     * @param  PHPUnit2_Framework_Test        $test
 -     * @param  PHPUnit2_Framework_TestResult  $testResult
 -     * @access public
 -     */
 -    public function runTest(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_TestResult $result) {
 -        $test->run($result);
 -    }
 -
 -    /**
 -     * Sets the name of the suite.
 -     *
 -     * @param  string
 -     * @access public
 -     */
 -    public function setName($name) {
 -        $this->name = $name;
 -    }
 -
 -    /**
 -     * Returns the test at the given index.
 -     *
 -     * @param  integer
 -     * @return PHPUnit2_Framework_Test
 -     * @access public
 -     */
 -    public function testAt($index) {
 -        if (isset($this->tests[$index])) {
 -            return $this->tests[$index];
 -        } else {
 -            return FALSE;
 -        }
 -    }
 -
 -    /**
 -     * Returns the number of tests in this suite.
 -     *
 -     * @return integer
 -     * @access public
 -     */
 -    public function testCount() {
 -        return sizeof($this->tests);
 -    }
 -
 -    /**
 -     * Returns the tests as an enumeration.
 -     *
 -     * @return array
 -     * @access public
 -     */
 -    public function tests() {
 -        return $this->tests;
 -    }
 -
 -    /**
 -     * @param  ReflectionMethod $method
 -     * @param  array            $names
 -     * @param  ReflectionClass  $theClass
 -     * @access private
 -     */
 -    private function addTestMethod(ReflectionMethod $method, &$names, ReflectionClass $theClass) {
 -        $name = $method->getName();
 -
 -        if (in_array($name, $names)) {
 -            return;
 -        }
 -
 -        if ($this->isPublicTestMethod($method)) {
 -            $names[] = $name;
 -
 -            $this->addTest(
 -              self::createTest(
 -                $theClass,
 -                $name
 -              )
 -            );
 -        }
 -
 -        else if ($this->isTestMethod($method)) {
 -            $this->addTest(
 -              self::warning(
 -                sprintf(
 -                  'Test method is not public: %s',
 -
 -                  $name
 -                )
 -              )
 -            );
 -        }
 -    }
 -
 -    /**
 -     * @param  ReflectionMethod $method
 -     * @return boolean
 -     * @access private
 -     */
 -    private function isPublicTestMethod(ReflectionMethod $method) {
 -        return ($this->isTestMethod($method) &&
 -                $method->isPublic());
 -    }
 -
 -    /**
 -     * @param  ReflectionMethod $method
 -     * @return boolean
 -     * @access private
 -     */
 -    private function isTestMethod(ReflectionMethod $method) {
 -        return (substr($method->name, 0, 4) == 'test');
 -    }
 -
 -    /**
 -     * @param  string  $message
 -     * @return PHPUnit2_Framework_Warning
 -     * @access private
 -     */
 -    private static function warning($message) {
 -        require_once 'PHPUnit2/Framework/Warning.php';
 -        return new PHPUnit2_Framework_Warning($message);
 -    }
 -}
 -
 -/*
 - * Local variables:
 - * tab-width: 4
 - * c-basic-offset: 4
 - * c-hanging-comment-ender-p: nil
 - * End:
 - */
 -?>
 +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * PHP Version 5 + * + * Copyright (c) 2002-2006, Sebastian Bergmann <sb@sebastian-bergmann.de>. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + *   * Redistributions of source code must retain the above copyright + *     notice, this list of conditions and the following disclaimer. + *  + *   * Redistributions in binary form must reproduce the above copyright + *     notice, this list of conditions and the following disclaimer in + *     the documentation and/or other materials provided with the + *     distribution. + * + *   * Neither the name of Sebastian Bergmann nor the names of his + *     contributors may be used to endorse or promote products derived + *     from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * @category   Testing + * @package    PHPUnit2 + * @author     Sebastian Bergmann <sb@sebastian-bergmann.de> + * @copyright  2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de> + * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License + * @version    CVS: $Id: TestSuite.php,v 1.26.2.11 2005/12/17 16:04:56 sebastian Exp $ + * @link       http://pear.php.net/package/PHPUnit2 + * @since      File available since Release 2.0.0 + */ + +require_once 'PHPUnit2/Framework/Test.php'; +require_once 'PHPUnit2/Framework/TestCase.php'; +require_once 'PHPUnit2/Framework/TestResult.php'; +require_once 'PHPUnit2/Runner/BaseTestRunner.php'; +require_once 'PHPUnit2/Util/Fileloader.php'; + +/** + * A TestSuite is a composite of Tests. It runs a collection of test cases. + * + * Here is an example using the dynamic test definition. + * + * <code> + * <?php + * $suite = new PHPUnit2_Framework_TestSuite; + * $suite->addTest(new MathTest('testPass')); + * ?> + * </code> + * + * Alternatively, a TestSuite can extract the tests to be run automatically. + * To do so you pass a ReflectionClass instance for your + * PHPUnit2_Framework_TestCase class to the PHPUnit2_Framework_TestSuite + * constructor. + * + * <code> + * <?php + * $suite = new PHPUnit2_Framework_TestSuite( + *   new ReflectionClass('MathTest') + * ); + * ?> + * </code> + * + * This constructor creates a suite with all the methods starting with + * "test" that take no arguments. + * + * @category   Testing + * @package    PHPUnit2 + * @author     Sebastian Bergmann <sb@sebastian-bergmann.de> + * @copyright  2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de> + * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License + * @version    Release: @package_version@ + * @link       http://pear.php.net/package/PHPUnit2 + * @since      Class available since Release 2.0.0 + */ +class PHPUnit2_Framework_TestSuite implements PHPUnit2_Framework_Test { +    /** +     * The name of the test suite. +     * +     * @var    string +     * @access private +     */ +    private $name = ''; + +    /** +     * The tests in the test suite. +     * +     * @var    array +     * @access private +     */ +    private $tests = array(); + +    /** +     * Constructs a new TestSuite: +     * +     *   - PHPUnit2_Framework_TestSuite() constructs an empty TestSuite. +     * +     *   - PHPUnit2_Framework_TestSuite(ReflectionClass) constructs a +     *     TestSuite from the given class. +     * +     *   - PHPUnit2_Framework_TestSuite(ReflectionClass, String) +     *     constructs a TestSuite from the given class with the given +     *     name. +     * +     *   - PHPUnit2_Framework_TestSuite(String) either constructs a +     *     TestSuite from the given class (if the passed string is the +     *     name of an existing class) or constructs an empty TestSuite +     *     with the given name. +     * +     * @param  mixed  $theClass +     * @param  string $name +     * @throws Exception +     * @access public +     */ +    public function __construct($theClass = '', $name = '') { +        $argumentsValid = FALSE; + +        if (is_object($theClass) && +            $theClass instanceof ReflectionClass) { +            $argumentsValid = TRUE; +        } + +        else if (is_string($theClass) && $theClass !== '' && class_exists($theClass)) { +            $argumentsValid = TRUE; + +            if ($name == '') { +                $name = $theClass; +            } + +            $theClass = new ReflectionClass($theClass); +        } + +        else if (is_string($theClass)) { +            $this->setName($theClass); +            return; +        } + +        if (!$argumentsValid) { +            throw new Exception; +        } + +        if ($name != '') { +            $this->setName($name); +        } else { +            $this->setName($theClass->getName()); +        } + +        $constructor = $theClass->getConstructor(); + +        if ($constructor === NULL || +            !$constructor->isPublic()) { +            $this->addTest( +              self::warning( +                sprintf( +                  'Class %s has no public constructor', + +                  $theClass->getName() +                ) +              ) +            ); + +            return; +        } + +        $methods = $theClass->getMethods(); +        $names   = array(); + +        foreach ($methods as $method) { +            $this->addTestMethod($method, $names, $theClass); +        } + +        if (empty($this->tests)) { +            $this->addTest( +              self::warning( +                sprintf( +                  'No tests found in %s', + +                  $theClass->getName() +                ) +              ) +            ); +        } +    } + +    /** +     * Returns a string representation of the test suite. +     * +     * @return string +     * @access public +     */ +    public function toString() { +        return $this->getName(); +    } + +    /** +     * Adds a test to the suite. +     * +     * @param  PHPUnit2_Framework_Test $test +     * @access public +     */ +    public function addTest(PHPUnit2_Framework_Test $test) { +        $this->tests[] = $test; +    } + +    /** +     * Adds the tests from the given class to the suite. +     * +     * @param  mixed $testClass +     * @access public +     */ +    public function addTestSuite($testClass) { +        if (is_string($testClass) && +            class_exists($testClass)) { +            $testClass = new ReflectionClass($testClass); +        } + +        if (is_object($testClass) && +            $testClass instanceof ReflectionClass) { +            $this->addTest(new PHPUnit2_Framework_TestSuite($testClass)); +        } +    } + +    /** +     * Wraps both <code>addTest()</code> and <code>addTestSuite</code> +     * as well as the separate import statements for the user's convenience. +     * +     * If the named file cannot be read or there are no new tests that can be +     * added, a <code>PHPUnit2_Framework_Warning</code> will be created instead, +     * leaving the current test run untouched. +     * +     * @param  string $filename +     * @throws Exception +     * @access public +     * @since  Method available since Release 2.3.0 +     * @author Stefano F. Rausch <stefano@rausch-e.net> +     */ +    public function addTestFile($filename) { +        if (!is_string($filename) || !file_exists($filename)) { +            throw new Exception; +        } + +        $declaredClasses = get_declared_classes(); + +        PHPUnit2_Util_Fileloader::checkAndLoad($filename); + +        $newClasses = array_values( +          array_diff(get_declared_classes(), $declaredClasses) +        ); + +        $testsFound = 0; + +        foreach ($newClasses as $class) { +            if (preg_match('"Tests?$"', $class)) { +                try { +                    $suiteMethod = new ReflectionMethod( +                      $class, PHPUnit2_Runner_BaseTestRunner::SUITE_METHODNAME +                    ); + +                    $this->addTest($suiteMethod->invoke(NULL)); +                } catch (ReflectionException $e) { +                    $this->addTestSuite(new ReflectionClass($class)); +                } + +                $testsFound++; +            } +        } + +        if ($testsFound == 0) { +            $this->addTest( +              new PHPUnit2_Framework_Warning('No tests found in file ' . $filename) +            ); +        } +    } + +    /** +     * Wrapper for addTestFile() that adds multiple test files. +     * +     * @param  Array $filenames +     * @throws Exception +     * @access public +     * @since  Method available since Release 2.3.0 +     */ +    public function addTestFiles($filenames) { +        foreach ($filenames as $filename) { +            $this->addTestFile($filename); +        } +    } + +    /** +     * Counts the number of test cases that will be run by this test. +     * +     * @return integer +     * @access public +     */ +    public function countTestCases() { +        $count = 0; + +        foreach ($this->tests as $test) { +            $count += $test->countTestCases(); +        } + +        return $count; +    } + +    /** +     * @param  ReflectionClass $theClass +     * @param  string          $name +     * @return PHPUnit2_Framework_Test +     * @access public +     * @static +     */ +    public static function createTest(ReflectionClass $theClass, $name) { +        if (!$theClass->isInstantiable()) { +            return self::warning( +              sprintf( +                'Cannot instantiate test case %s.', +                $theClass->getName() +              ) +            ); +        } + +        $constructor = $theClass->getConstructor(); + +        if ($constructor !== NULL) { +            $parameters = $constructor->getParameters(); + +            if (sizeof($parameters) == 0) { +                $test = $theClass->newInstance(); + +                if ($test instanceof PHPUnit2_Framework_TestCase) { +                    $test->setName($name); +                } +            } + +            else if (sizeof($parameters) == 1 && +                     $parameters[0]->getClass() === NULL) { +                $test = $theClass->newInstance($name); +            } + +            else { +                return self::warning( +                  sprintf( +                    'Constructor of class %s is not TestCase($name) or TestCase().', +                    $theClass->getName() +                  ) +                ); +            } +        } + +        return $test; +    } + +    /** +     * Creates a default TestResult object. +     * +     * @return PHPUnit2_Framework_TestResult +     * @access protected +     */ +    protected function createResult() { +        return new PHPUnit2_Framework_TestResult; +    } + +    /** +     * Returns the name of the suite. +     * +     * @return string +     * @access public +     */ +    public function getName() { +        return $this->name; +    } + +    /** +     * Runs the tests and collects their result in a TestResult. +     * +     * @param  PHPUnit2_Framework_TestResult $result +     * @return PHPUnit2_Framework_TestResult +     * @throws Exception +     * @access public +     */ +    public function run($result = NULL) { +        if ($result === NULL) { +            $result = $this->createResult(); +        } + +        // XXX: Workaround for missing ability to declare type-hinted parameters as optional. +        else if (!($result instanceof PHPUnit2_Framework_TestResult)) { +            throw new Exception( +              'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.' +            ); +        } + +        $result->startTestSuite($this); + +        foreach ($this->tests as $test) { +            if ($result->shouldStop()) { +                break; +            } + +            $this->runTest($test, $result); +        } + +        $result->endTestSuite($this); + +        return $result; +    } + +    /** +     * Runs a test. +     * +     * @param  PHPUnit2_Framework_Test        $test +     * @param  PHPUnit2_Framework_TestResult  $testResult +     * @access public +     */ +    public function runTest(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_TestResult $result) { +        $test->run($result); +    } + +    /** +     * Sets the name of the suite. +     * +     * @param  string +     * @access public +     */ +    public function setName($name) { +        $this->name = $name; +    } + +    /** +     * Returns the test at the given index. +     * +     * @param  integer +     * @return PHPUnit2_Framework_Test +     * @access public +     */ +    public function testAt($index) { +        if (isset($this->tests[$index])) { +            return $this->tests[$index]; +        } else { +            return FALSE; +        } +    } + +    /** +     * Returns the number of tests in this suite. +     * +     * @return integer +     * @access public +     */ +    public function testCount() { +        return sizeof($this->tests); +    } + +    /** +     * Returns the tests as an enumeration. +     * +     * @return array +     * @access public +     */ +    public function tests() { +        return $this->tests; +    } + +    /** +     * @param  ReflectionMethod $method +     * @param  array            $names +     * @param  ReflectionClass  $theClass +     * @access private +     */ +    private function addTestMethod(ReflectionMethod $method, &$names, ReflectionClass $theClass) { +        $name = $method->getName(); + +        if (in_array($name, $names)) { +            return; +        } + +        if ($this->isPublicTestMethod($method)) { +            $names[] = $name; + +            $this->addTest( +              self::createTest( +                $theClass, +                $name +              ) +            ); +        } + +        else if ($this->isTestMethod($method)) { +            $this->addTest( +              self::warning( +                sprintf( +                  'Test method is not public: %s', + +                  $name +                ) +              ) +            ); +        } +    } + +    /** +     * @param  ReflectionMethod $method +     * @return boolean +     * @access private +     */ +    private function isPublicTestMethod(ReflectionMethod $method) { +        return ($this->isTestMethod($method) && +                $method->isPublic()); +    } + +    /** +     * @param  ReflectionMethod $method +     * @return boolean +     * @access private +     */ +    private function isTestMethod(ReflectionMethod $method) { +        return (substr($method->name, 0, 4) == 'test'); +    } + +    /** +     * @param  string  $message +     * @return PHPUnit2_Framework_Warning +     * @access private +     */ +    private static function warning($message) { +        require_once 'PHPUnit2/Framework/Warning.php'; +        return new PHPUnit2_Framework_Warning($message); +    } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ +?> | 
