]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - tests/PHPUnit/PHPUnit/Runner/BaseTestRunner.php
Release 6.2.0
[Github/sugarcrm.git] / tests / PHPUnit / PHPUnit / Runner / BaseTestRunner.php
1 <?php
2 /**
3  * PHPUnit
4  *
5  * Copyright (c) 2002-2011, Sebastian Bergmann <sebastian@phpunit.de>.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  *   * Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *
15  *   * Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in
17  *     the documentation and/or other materials provided with the
18  *     distribution.
19  *
20  *   * Neither the name of Sebastian Bergmann nor the names of his
21  *     contributors may be used to endorse or promote products derived
22  *     from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  *
37  * @package    PHPUnit
38  * @subpackage Runner
39  * @author     Sebastian Bergmann <sebastian@phpunit.de>
40  * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
41  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
42  * @link       http://www.phpunit.de/
43  * @since      File available since Release 2.0.0
44  */
45
46 /**
47  * Base class for all test runners.
48  *
49  * @package    PHPUnit
50  * @subpackage Runner
51  * @author     Sebastian Bergmann <sebastian@phpunit.de>
52  * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
53  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
54  * @version    Release: 3.5.13
55  * @link       http://www.phpunit.de/
56  * @since      Class available since Release 2.0.0
57  */
58 abstract class PHPUnit_Runner_BaseTestRunner
59 {
60     const STATUS_PASSED     = 0;
61     const STATUS_SKIPPED    = 1;
62     const STATUS_INCOMPLETE = 2;
63     const STATUS_FAILURE    = 3;
64     const STATUS_ERROR      = 4;
65     const SUITE_METHODNAME  = 'suite';
66
67     /**
68      * Returns the loader to be used.
69      *
70      * @return PHPUnit_Runner_TestSuiteLoader
71      */
72     public function getLoader()
73     {
74         return new PHPUnit_Runner_StandardTestSuiteLoader;
75     }
76
77     /**
78      * Returns the Test corresponding to the given suite.
79      * This is a template method, subclasses override
80      * the runFailed() and clearStatus() methods.
81      *
82      * @param  string  $suiteClassName
83      * @param  string  $suiteClassFile
84      * @param  boolean $syntaxCheck
85      * @return PHPUnit_Framework_Test
86      */
87     public function getTest($suiteClassName, $suiteClassFile = '', $syntaxCheck = FALSE)
88     {
89         if (is_dir($suiteClassName) &&
90             !is_file($suiteClassName . '.php') && empty($suiteClassFile)) {
91             $testCollector = new PHPUnit_Runner_IncludePathTestCollector(
92               array($suiteClassName)
93             );
94
95             $suite = new PHPUnit_Framework_TestSuite($suiteClassName);
96             $suite->addTestFiles($testCollector->collectTests(), $syntaxCheck);
97
98             return $suite;
99         }
100
101         try {
102             $testClass = $this->loadSuiteClass(
103               $suiteClassName, $suiteClassFile, $syntaxCheck
104             );
105         }
106
107         catch (Exception $e) {
108             $this->runFailed($e->getMessage());
109             return NULL;
110         }
111
112         try {
113             $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
114
115             if (!$suiteMethod->isStatic()) {
116                 $this->runFailed(
117                   'suite() method must be static.'
118                 );
119
120                 return NULL;
121             }
122
123             try {
124                 $test = $suiteMethod->invoke(NULL, $testClass->getName());
125             }
126
127             catch (ReflectionException $e) {
128                 $this->runFailed(
129                   sprintf(
130                     "Failed to invoke suite() method.\n%s",
131
132                     $e->getMessage()
133                   )
134                 );
135
136                 return NULL;
137             }
138         }
139
140         catch (ReflectionException $e) {
141             try {
142                 $test = new PHPUnit_Framework_TestSuite($testClass);
143             }
144
145             catch (InvalidArgumentException $e) {
146                 $test = new PHPUnit_Framework_TestSuite;
147                 $test->setName($suiteClassName);
148             }
149         }
150
151         $this->clearStatus();
152
153         return $test;
154     }
155
156     /**
157      * Returns the loaded ReflectionClass for a suite name.
158      *
159      * @param  string  $suiteClassName
160      * @param  string  $suiteClassFile
161      * @param  boolean $syntaxCheck
162      * @return ReflectionClass
163      */
164     protected function loadSuiteClass($suiteClassName, $suiteClassFile = '', $syntaxCheck = FALSE)
165     {
166         $loader = $this->getLoader();
167
168         if ($loader instanceof PHPUnit_Runner_StandardTestSuiteLoader) {
169             return $loader->load($suiteClassName, $suiteClassFile, $syntaxCheck);
170         } else {
171             return $loader->load($suiteClassName, $suiteClassFile);
172         }
173     }
174
175     /**
176      * Clears the status message.
177      *
178      */
179     protected function clearStatus()
180     {
181     }
182
183     /**
184      * Override to define how to handle a failed loading of
185      * a test suite.
186      *
187      * @param  string  $message
188      */
189     abstract protected function runFailed($message);
190 }