| 243 | | $testCases = array(); |
| 244 | | if (is_dir($directory)) { |
| 245 | | $files = scandir($directory); |
| 246 | | } else { |
| 247 | | $files = (array)$directory; |
| 248 | | } |
| 249 | | |
| 250 | | for ($i = 0, $iCount = count($files); $i < $iCount; ++$i) { |
| 251 | | if (is_dir($directory)) { |
| 252 | | $target = $directory . DIRECTORY_SEPARATOR . $files[$i]; |
| 253 | | } else { |
| 254 | | $target = $files[$i]; |
| 255 | | } |
| 256 | | |
| 257 | | if (!is_file($target)) { |
| 258 | | continue; |
| 259 | | } |
| 260 | | |
| 261 | | if (!preg_match("/{$this->_suffix}\.php\$/", $files[$i])) { |
| 262 | | continue; |
| 263 | | } |
| 264 | | |
| 265 | | print "Loading [ {$files[$i]} ] ... "; |
| 266 | | |
| 267 | | $currentClasses = get_declared_classes(); |
| 268 | | |
| 269 | | if (!include_once($target)) { |
| 270 | | print "Failed!\n"; |
| 271 | | continue; |
| 272 | | } |
| 273 | | |
| 274 | | print "Succeeded.\n"; |
| 275 | | |
| 276 | | $newClasses = array_values(array_diff(get_declared_classes(), $currentClasses)); |
| 277 | | for ($j = 0, $jCount = count($newClasses); $j < $jCount; ++$j) { |
| 278 | | if (!is_subclass_of($newClasses[$j], $this->_baseClass)) { |
| 279 | | continue; |
| 280 | | } |
| 281 | | |
| 282 | | if (!is_null($this->_excludePattern) |
| 283 | | && preg_match($this->_excludePattern, $newClasses[$j]) |
| 284 | | ) { |
| 285 | | continue; |
| 286 | | } |
| 287 | | |
| 288 | | if (!is_null($this->_includePattern) |
| 289 | | && !preg_match($this->_includePattern, $newClasses[$j]) |
| 290 | | ) { |
| 291 | | continue; |
| 292 | | } |
| 293 | | |
| 294 | | $testCases[] = $newClasses[$j]; |
| 295 | | print " => Added [ {$newClasses[$j]} ]\n"; |
| 296 | | } |
| 297 | | } |
| 298 | | |
| 299 | | return $testCases; |
| 300 | | } |
| 301 | | |
| 302 | | // }}} |
| 303 | | // {{{ _getDirectories() |
| 304 | | |
| 305 | | /** |
| 306 | | * Returns all directories under the directory. |
| 307 | | * |
| 308 | | * @param string $directory |
| 309 | | * @return array |
| 310 | | */ |
| 311 | | private function _getDirectories($directory) |
| 312 | | { |
| 313 | | static $directories; |
| 314 | | if (is_null($directories)) { |
| 315 | | $directories = array(); |
| 316 | | } |
| 317 | | |
| 318 | | $directory = realpath($directory); |
| 319 | | $directories[] = $directory; |
| 333 | | $next = $directory . DIRECTORY_SEPARATOR . $files[$i]; |
| 334 | | if (!is_dir($next)) { |
| 335 | | continue; |
| 336 | | } |
| 337 | | |
| 338 | | $this->_getDirectories($next); |
| 339 | | } |
| 340 | | |
| 341 | | return $directories; |
| | 249 | $element = $directory . DIRECTORY_SEPARATOR . $files[$i]; |
| | 250 | if (is_dir($element) && $this->_isRecursive) { |
| | 251 | $this->_collectTestCases($element); |
| | 252 | continue; |
| | 253 | } |
| | 254 | |
| | 255 | $this->_collectTestCaseFromFile($element); |
| | 256 | } |
| | 257 | } |
| | 258 | |
| | 259 | // }}} |
| | 260 | // {{{ _collectTestCaseFromFile() |
| | 261 | |
| | 262 | /** |
| | 263 | * Collects all test cases included in the given file. |
| | 264 | * |
| | 265 | * @param string $file |
| | 266 | */ |
| | 267 | private function _collectTestCaseFromFile($file) |
| | 268 | { |
| | 269 | if (!preg_match("/{$this->_suffix}\.php\$/", $file)) { |
| | 270 | return; |
| | 271 | } |
| | 272 | |
| | 273 | print "Loading [ $file ] ... "; |
| | 274 | |
| | 275 | $currentClasses = get_declared_classes(); |
| | 276 | |
| | 277 | if (!include_once($file)) { |
| | 278 | print "Failed!\n"; |
| | 279 | return; |
| | 280 | } |
| | 281 | |
| | 282 | print "Succeeded.\n"; |
| | 283 | |
| | 284 | $newClasses = array_values(array_diff(get_declared_classes(), $currentClasses)); |
| | 285 | for ($i = 0, $count = count($newClasses); $i < $count; ++$i) { |
| | 286 | if (!is_subclass_of($newClasses[$i], $this->_baseClass)) { |
| | 287 | continue; |
| | 288 | } |
| | 289 | |
| | 290 | if (!is_null($this->_excludePattern) |
| | 291 | && preg_match($this->_excludePattern, $newClasses[$i]) |
| | 292 | ) { |
| | 293 | continue; |
| | 294 | } |
| | 295 | |
| | 296 | if (!is_null($this->_includePattern) |
| | 297 | && !preg_match($this->_includePattern, $newClasses[$i]) |
| | 298 | ) { |
| | 299 | continue; |
| | 300 | } |
| | 301 | |
| | 302 | $this->_testCases[] = $newClasses[$i]; |
| | 303 | print " => Added [ {$newClasses[$i]} ]\n"; |
| | 304 | } |