/tests/PHPUnit/PHPUnit/Runner/BaseTestRunner.php

https://github.com/joac/sugarcrm_dev · PHP · 190 lines · 80 code · 22 blank · 88 comment · 5 complexity · aff3036f5767636ff6eb3b929125b851 MD5 · raw file

  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. * Base class for all test runners.
  47. *
  48. * @package PHPUnit
  49. * @subpackage Runner
  50. * @author Sebastian Bergmann <sebastian@phpunit.de>
  51. * @copyright 2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
  52. * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  53. * @version Release: 3.5.14
  54. * @link http://www.phpunit.de/
  55. * @since Class available since Release 2.0.0
  56. */
  57. abstract class PHPUnit_Runner_BaseTestRunner
  58. {
  59. const STATUS_PASSED = 0;
  60. const STATUS_SKIPPED = 1;
  61. const STATUS_INCOMPLETE = 2;
  62. const STATUS_FAILURE = 3;
  63. const STATUS_ERROR = 4;
  64. const SUITE_METHODNAME = 'suite';
  65. /**
  66. * Returns the loader to be used.
  67. *
  68. * @return PHPUnit_Runner_TestSuiteLoader
  69. */
  70. public function getLoader()
  71. {
  72. return new PHPUnit_Runner_StandardTestSuiteLoader;
  73. }
  74. /**
  75. * Returns the Test corresponding to the given suite.
  76. * This is a template method, subclasses override
  77. * the runFailed() and clearStatus() methods.
  78. *
  79. * @param string $suiteClassName
  80. * @param string $suiteClassFile
  81. * @param boolean $syntaxCheck
  82. * @return PHPUnit_Framework_Test
  83. */
  84. public function getTest($suiteClassName, $suiteClassFile = '', $syntaxCheck = FALSE)
  85. {
  86. if (is_dir($suiteClassName) &&
  87. !is_file($suiteClassName . '.php') && empty($suiteClassFile)) {
  88. $testCollector = new PHPUnit_Runner_IncludePathTestCollector(
  89. array($suiteClassName)
  90. );
  91. $suite = new PHPUnit_Framework_TestSuite($suiteClassName);
  92. $suite->addTestFiles($testCollector->collectTests(), $syntaxCheck);
  93. return $suite;
  94. }
  95. try {
  96. $testClass = $this->loadSuiteClass(
  97. $suiteClassName, $suiteClassFile, $syntaxCheck
  98. );
  99. }
  100. catch (Exception $e) {
  101. $this->runFailed($e->getMessage());
  102. return NULL;
  103. }
  104. try {
  105. $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
  106. if (!$suiteMethod->isStatic()) {
  107. $this->runFailed(
  108. 'suite() method must be static.'
  109. );
  110. return NULL;
  111. }
  112. try {
  113. $test = $suiteMethod->invoke(NULL, $testClass->getName());
  114. }
  115. catch (ReflectionException $e) {
  116. $this->runFailed(
  117. sprintf(
  118. "Failed to invoke suite() method.\n%s",
  119. $e->getMessage()
  120. )
  121. );
  122. return NULL;
  123. }
  124. }
  125. catch (ReflectionException $e) {
  126. try {
  127. $test = new PHPUnit_Framework_TestSuite($testClass);
  128. }
  129. catch (InvalidArgumentException $e) {
  130. $test = new PHPUnit_Framework_TestSuite;
  131. $test->setName($suiteClassName);
  132. }
  133. }
  134. $this->clearStatus();
  135. return $test;
  136. }
  137. /**
  138. * Returns the loaded ReflectionClass for a suite name.
  139. *
  140. * @param string $suiteClassName
  141. * @param string $suiteClassFile
  142. * @param boolean $syntaxCheck
  143. * @return ReflectionClass
  144. */
  145. protected function loadSuiteClass($suiteClassName, $suiteClassFile = '', $syntaxCheck = FALSE)
  146. {
  147. $loader = $this->getLoader();
  148. if ($loader instanceof PHPUnit_Runner_StandardTestSuiteLoader) {
  149. return $loader->load($suiteClassName, $suiteClassFile, $syntaxCheck);
  150. } else {
  151. return $loader->load($suiteClassName, $suiteClassFile);
  152. }
  153. }
  154. /**
  155. * Clears the status message.
  156. *
  157. */
  158. protected function clearStatus()
  159. {
  160. }
  161. /**
  162. * Override to define how to handle a failed loading of
  163. * a test suite.
  164. *
  165. * @param string $message
  166. */
  167. abstract protected function runFailed($message);
  168. }