'paths', ); } public function requiresWorkingCopy() { return true; } public function requiresRepositoryAPI() { return true; } public function run() { $working_copy = $this->getWorkingCopy(); $engine_class = $this->getArgument( 'engine', $working_copy->getConfig('unit_engine')); if (!$engine_class) { throw new ArcanistNoEngineException( "No unit test engine is configured for this project. Edit .arcconfig ". "to specify a unit test engine."); } $ok = phutil_autoload_class($engine_class); if (!$ok) { throw new ArcanistUsageException( "Configured unit test engine '{$engine_class}' could not be loaded."); } $repository_api = $this->getRepositoryAPI(); if ($this->getArgument('paths')) { // TODO: deal with git stuff $paths = $this->getArgument('paths'); } else { $paths = $repository_api->getWorkingCopyStatus(); $paths = array_keys($paths); } $engine = newv($engine_class, array()); $engine->setWorkingCopy($working_copy); $engine->setPaths($paths); $results = $engine->run(); $status_codes = array( ArcanistUnitTestResult::RESULT_PASS => phutil_console_format( ' ** PASS **'), ArcanistUnitTestResult::RESULT_FAIL => phutil_console_format( ' ** FAIL **'), ArcanistUnitTestResult::RESULT_SKIP => phutil_console_format( ' ** SKIP **'), ArcanistUnitTestResult::RESULT_BROKEN => phutil_console_format( ' ** BROKEN **'), ArcanistUnitTestResult::RESULT_UNSOUND => phutil_console_format( ' ** UNSOUND **'), ); $unresolved = array(); foreach ($results as $result) { $result_code = $result->getResult(); echo $status_codes[$result_code].' '.$result->getName()."\n"; if ($result_code != ArcanistUnitTestResult::RESULT_PASS) { echo $result->getUserData()."\n"; $unresolved[] = $result; } } $this->unresolvedTests = $unresolved; $overall_result = self::RESULT_OKAY; foreach ($results as $result) { $result_code = $result->getResult(); if ($result_code == ArcanistUnitTestResult::RESULT_FAIL || $result_code == ArcanistUnitTestResult::RESULT_BROKEN) { $overall_result = self::RESULT_FAIL; break; } else if ($result_code == ArcanistUnitTestResult::RESULT_UNSOUND) { $overall_result = self::RESULT_UNSOUND; } } return $overall_result; } public function getUnresolvedTests() { return $this->unresolvedTests; } }