private function createProject(PhabricatorUser $user, PhabricatorProject $parent = null, $is_milestone = false)
 {
     $project = PhabricatorProject::initializeNewProject($user);
     $name = pht('Test Project %d', mt_rand());
     $xactions = array();
     $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_NAME)->setNewValue($name);
     if ($parent) {
         if ($is_milestone) {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_MILESTONE)->setNewValue($parent->getPHID());
         } else {
             $xactions[] = id(new PhabricatorProjectTransaction())->setTransactionType(PhabricatorProjectTransaction::TYPE_PARENT)->setNewValue($parent->getPHID());
         }
     }
     $this->applyTransactions($project, $user, $xactions);
     // Force these values immediately; they are normally updated by the
     // index engine.
     if ($parent) {
         if ($is_milestone) {
             $parent->setHasMilestones(1)->save();
         } else {
             $parent->setHasSubprojects(1)->save();
         }
     }
     return $project;
 }