public function runUnitTests($tests)
 {
     // Build any unit tests
     $this->make('build-tests');
     // Now find all the test programs
     $root = $this->getProjectRoot();
     $test_dir = $root . "/tests/";
     $futures = array();
     if (!$tests) {
         $paths = glob($test_dir . "*.t");
     } else {
         $paths = array();
         foreach ($tests as $path) {
             $tpath = preg_replace('/\\.c$/', '.t', $path);
             if (preg_match("/\\.c\$/", $path) && file_exists($tpath)) {
                 $paths[] = realpath($tpath);
             }
         }
     }
     foreach ($paths as $test) {
         $relname = substr($test, strlen($test_dir));
         $futures[$relname] = new ExecFuture($test);
     }
     $results = array();
     $futures = new FutureIterator($futures);
     foreach ($futures->limit(4) as $test => $future) {
         list($err, $stdout, $stderr) = $future->resolve();
         $results[] = $this->parseTestResults($test, $err, $stdout, $stderr);
     }
     return $results;
 }
 public function testAddingFuture()
 {
     $future1 = new ExecFuture('cat');
     $future2 = new ExecFuture('cat');
     $iterator = new FutureIterator(array($future1));
     $iterator->limit(2);
     $results = array();
     foreach ($iterator as $future) {
         if ($future === $future1) {
             $iterator->addFuture($future2);
         }
         $results[] = $future->resolve();
     }
     $this->assertEqual(2, count($results));
 }
);
$args->parseStandardArguments();
if (posix_isatty(STDIN)) {
    echo phutil_console_format("%s\n", pht('Usage: %s', "find . -type f -name '*.php' | ./generate_php_symbols.php"));
    exit(1);
}
$input = file_get_contents('php://stdin');
$data = array();
$futures = array();
foreach (explode("\n", trim($input)) as $file) {
    $file = Filesystem::readablePath($file);
    $data[$file] = Filesystem::readFile($file);
    $futures[$file] = PhutilXHPASTBinary::getParserFuture($data[$file]);
}
$futures = new FutureIterator($futures);
foreach ($futures->limit(8) as $file => $future) {
    $tree = XHPASTTree::newFromDataAndResolvedExecFuture($data[$file], $future->resolve());
    $root = $tree->getRootNode();
    $scopes = array();
    $functions = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION');
    foreach ($functions as $function) {
        $name = $function->getChildByIndex(2);
        // Skip anonymous functions.
        if (!$name->getConcreteString()) {
            continue;
        }
        print_symbol($file, 'function', $name);
    }
    $classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION');
    foreach ($classes as $class) {
        $class_name = $class->getChildByIndex(1);