Changeset 131

Show
Ignore:
Timestamp:
03/04/08 00:39:10 (10 months ago)
Author:
iteman
Message:

- Refactored.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/Stagehand/TestRunner/Collector/Common.php

    r130 r131  
    8484                                      '!^#.+#$!' 
    8585                                      ); 
     86    private $_testCases = array(); 
    8687 
    8788    /**#@-*/ 
     
    134135        } 
    135136 
    136         if (is_dir($absoluteTargetPath) && $this->_isRecursive) { 
    137             $suite = $this->_createTestSuite(); 
    138             $directories = $this->_getDirectories($absoluteTargetPath); 
    139             for ($i = 0, $count = count($directories); $i < $count; ++$i) { 
    140                 $this->_buildTestSuite($suite, $directories[$i]); 
    141             } 
     137        if (is_dir($absoluteTargetPath)) { 
     138            $this->_collectTestCases($absoluteTargetPath); 
    142139        } else { 
    143             $suite = $this->_buildTestSuite($this->_createTestSuite(), $absoluteTargetPath); 
    144         } 
    145  
    146         return $suite; 
     140            $this->_collectTestCaseFromFile($absoluteTargetPath); 
     141        } 
     142 
     143        return $this->_buildTestSuite(); 
    147144    } 
    148145 
     
    201198     * directory. 
    202199     * 
    203      * @param array $testCases 
    204200     * @return mixed 
    205201     */ 
    206     private function _createTestSuiteFromTestCases($testCases) 
     202    private function _createTestSuiteFromTestCases() 
    207203    { 
    208204        $suite = $this->_createTestSuite(); 
    209         foreach ($testCases as $testCase) { 
     205        foreach ($this->_testCases as $testCase) { 
    210206            $this->_addTestCase($suite, $testCase); 
    211207        } 
     
    220216     * Builds a test suite object. 
    221217     * 
    222      * @param mixed  $suite 
     218     * @return mixed 
     219     */ 
     220    private function _buildTestSuite() 
     221    { 
     222        $suite = $this->_createTestSuite(); 
     223        $this->_doBuildTestSuite($suite, $this->_createTestSuiteFromTestCases()); 
     224        return $suite; 
     225    } 
     226 
     227    // }}} 
     228    // {{{ _collectTestCases() 
     229 
     230    /** 
     231     * Collects all test cases included in the specified directory. 
     232     * 
    223233     * @param string $directory 
    224      * @return mixed 
    225      */ 
    226     private function _buildTestSuite($suite, $directory) 
    227     { 
    228         $this->_doBuildTestSuite($suite, $this->_createTestSuiteFromTestCases($this->_collectTestCases(realpath($directory)))); 
    229         return $suite; 
    230     } 
    231  
    232     // }}} 
    233     // {{{ _collectTestCases() 
    234  
    235     /** 
    236      * Collects test cases in the directory. 
    237      * 
    238      * @param string $directory 
    239      * @return array 
    240234     */ 
    241235    private function _collectTestCases($directory) 
    242236    { 
    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; 
    320237        $files = scandir($directory); 
    321  
    322238        for ($i = 0, $count = count($files); $i < $count; ++$i) { 
    323239            if ($files[$i] == '.' || $files[$i] == '..') { 
     
    331247            } 
    332248 
    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        } 
    342305    } 
    343306