diff --git a/test/class/tree.class.php b/test/class/tree.class.php
new file mode 100644
index 0000000000..9ea4ca8e94
--- /dev/null
+++ b/test/class/tree.class.php
@@ -0,0 +1,570 @@
+objectModel = $tester->loadModel('tree');
+ }
+
+ public function getByIDTest($moduleID)
+ {
+ $objects = $this->objectModel->getByID($moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getAllModulePairsTest($type = 'task')
+ {
+ $objects = $this->objectModel->getAllModulePairs($type = 'task');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test build the sql query.
+ *
+ * @param int $rootID
+ * @param string $type
+ * @param int $startModule
+ * @param string $branch
+ * @access public
+ * @return string
+ */
+ public function buildMenuQueryTest($rootID, $type, $startModule = 0, $branch = 'all')
+ {
+ $string = $this->objectModel->buildMenuQuery($rootID, $type, $startModule, $branch);
+
+ if(dao::isError()) return dao::getError();
+
+ return $string;
+ }
+
+ public function getOptionMenuTest($rootID, $type = 'story', $startModule = 0, $branch = 0)
+ {
+ $objects = $this->objectModel->getOptionMenu($rootID, $type = 'story', $startModule = 0, $branch = 0);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getModulePairsTest($rootID, $viewType = 'story', $showModule = 'end', $extra = '')
+ {
+ $objects = $this->objectModel->getModulePairs($rootID, $viewType = 'story', $showModule = 'end', $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getTaskOptionMenuTest($rootID, $productID = 0, $startModule = 0, $extra = '')
+ {
+ $objects = $this->objectModel->getTaskOptionMenu($rootID, $productID = 0, $startModule = 0, $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test build tree array.
+ *
+ * @param array & $&treeMenu
+ * @param array $modules
+ * @param int $moduleID
+ * @param string $moduleName
+ * @access public
+ * @return array
+ */
+ public function buildTreeArrayTest(& $treeMenu, $modules, $moduleID, $moduleName = '/')
+ {
+ $module = $this->objectModel->getByID($moduleID);
+ $moduleName = $module->name;
+
+ $this->objectModel->buildTreeArray($treeMenu, $modules, $module, $moduleName);
+
+ if(dao::isError()) return dao::getError();
+
+ $objects = array();
+ foreach($treeMenu as $id => $string) $objects[$id] = strlen($string);
+ return $objects;
+ }
+
+ public function getTreeMenuTest($rootID, $type = 'root', $startModule = 0, $userFunc = '', $extra = '', $branch = 0, $extraParams = '')
+ {
+ $objects = $this->objectModel->getTreeMenu($rootID, $type = 'root', $startModule = 0, $userFunc = '', $extra = '', $branch = 0, $extraParams = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getTaskTreeMenuTest($rootID, $productID = 0, $startModule = 0, $userFunc = '', $extra = '')
+ {
+ $objects = $this->objectModel->getTaskTreeMenu($rootID, $productID = 0, $startModule = 0, $userFunc = '', $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getTaskStructureTest($rootID, $productID = 0)
+ {
+ $objects = $this->objectModel->getTaskStructure($rootID, $productID = 0);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getTreeStructureTest($rootID, $type)
+ {
+ $objects = $this->objectModel->getTreeStructure($rootID, $type);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getBugTreeMenuTest($rootID, $productID = 0, $startModule = 0, $userFunc = '', $extra = '')
+ {
+ $objects = $this->objectModel->getBugTreeMenu($rootID, $productID = 0, $startModule = 0, $userFunc = '', $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getCaseTreeMenuTest($rootID, $productID = 0, $startModule = 0, $userFunc = '', $extra = '')
+ {
+ $objects = $this->objectModel->getCaseTreeMenu($rootID, $productID = 0, $startModule = 0, $userFunc = '', $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getProjectStoryTreeMenuTest($rootID, $startModule = 0, $userFunc = '')
+ {
+ $objects = $this->objectModel->getProjectStoryTreeMenu($rootID, $startModule = 0, $userFunc = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function buildTreeTest(& $treeMenu, $module, $type, $userFunc, $extra, $branch = 'all')
+ {
+ $objects = $this->objectModel->buildTree($treeMenu, $module, $type, $userFunc, $extra, $branch = 'all');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getTaskTreeModulesTest($executionID, $parent = false, $linkObject = 'story')
+ {
+ $objects = $this->objectModel->getTaskTreeModules($executionID, $parent = false, $linkObject = 'story');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createStoryLinkTest($type, $module, $extra = array())
+ {
+ $objects = $this->objectModel->createStoryLink($type, $module, $extra = array());
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createLineLinkTest($type, $module, $extra)
+ {
+ $objects = $this->objectModel->createLineLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createTaskLinkTest($type, $module, $extra)
+ {
+ $objects = $this->objectModel->createTaskLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createProjectStoryLinkTest($type, $module, $extra)
+ {
+ $objects = $this->objectModel->createProjectStoryLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createRequirementLinkTest($type, $module)
+ {
+ $objects = $this->objectModel->createRequirementLink($type, $module);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createDocLinkTest($type, $module, $extra = '')
+ {
+ $objects = $this->objectModel->createDocLink($type, $module, $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createManageLinkTest($moduleID, $extra)
+ {
+ $type = 0;
+ $module = $this->objectModel->getByID($moduleID);
+
+ $link = $this->objectModel->createManageLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return substr($link, 0, 15);
+ }
+
+ public function createTaskManageLinkTest($type, $module, $extra)
+ {
+ $objects = $this->objectModel->createTaskManageLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test reate link of a bug.
+ *
+ * @param int $moduleID
+ * @access public
+ * @return string
+ */
+ public function createBugLinkTest($moduleID)
+ {
+ $type = '';
+ $module = $this->objectModel->getByID($moduleID);
+
+ $link = $this->objectModel->createBugLink($type, $module);
+
+ if(dao::isError()) return dao::getError();
+
+ $string = preg_replace("/.*(title='.*').*/", '$1', $link);
+ $string = str_replace("\n", '', $string);
+ return $string;
+ }
+
+ public function createCaseLinkTest($moduleID, $extra = array('branchID' => 0))
+ {
+ $type = '';
+ $module = $this->objectModel->getByID($moduleID);
+
+ $link = $this->objectModel->createCaseLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ $string = preg_replace("/.*(title='.*').*/", '$1', $link);
+ $string = str_replace("\n", '', $string);
+ return $string;
+ }
+
+ public function createTestTaskLinkTest($type, $module, $extra)
+ {
+ $objects = $this->objectModel->createTestTaskLink($type, $module, $extra);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test create case lib link.
+ *
+ * @param int $moduleID
+ * @access public
+ * @return string
+ */
+ public function createCaseLibLinkTest($moduleID)
+ {
+ $type = '';
+ $module = $this->objectModel->getByID($moduleID);
+
+ $link = $this->objectModel->createCaseLibLink($type, $module);
+
+ if(dao::isError()) return dao::getError();
+
+ $string = preg_replace("/.*(title='.*').*/", '$1', $link);
+ $string = str_replace("\n", '', $string);
+ return $string;
+ }
+
+ public function createBranchLinkTest($type, $rootID, $branchID, $branch)
+ {
+ $objects = $this->objectModel->createBranchLink($type, $rootID, $branchID, $branch);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test create feedback link.
+ *
+ * @param int $moduleID
+ * @access public
+ * @return string
+ */
+ public function createFeedbackLinkTest($moduleID)
+ {
+ $type = '';
+ $module = $this->objectModel->getByID($moduleID);
+
+ $link = $this->objectModel->createFeedbackLink($type, $module);
+
+ if(dao::isError()) return dao::getError();
+
+ $string = preg_replace("/.*(title='.*').*/", '$1', $link);
+ $string = str_replace("\n", '', $string);
+ return $string;
+ }
+
+ public function createTrainSkillLinkTest($type, $module, $extra = '')
+ {
+ $objects = $this->objectModel->createTrainSkillLink($type, $module, $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createTrainCourseLinkTest($type, $module, $extra = '')
+ {
+ $objects = $this->objectModel->createTrainCourseLink($type, $module, $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function createTrainPostLinkTest($type, $module, $extra = '')
+ {
+ $objects = $this->objectModel->createTrainPostLink($type, $module, $extra = '');
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getSonsTest($rootID, $moduleID, $type = 'root', $branch = 0)
+ {
+ $objects = $this->objectModel->getSons($rootID, $moduleID, $type = 'root', $branch = 0);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getTaskSonsTest($rootID, $productID, $moduleID)
+ {
+ $objects = $this->objectModel->getTaskSons($rootID, $productID, $moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getAllChildIdTest($moduleID)
+ {
+ $objects = $this->objectModel->getAllChildId($moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getProjectModuleTest($projectID, $productID = 0)
+ {
+ $objects = $this->objectModel->getProjectModule($projectID, $productID = 0);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getParentsTest($moduleID)
+ {
+ $objects = $this->objectModel->getParents($moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getProductTest($moduleID)
+ {
+ $objects = $this->objectModel->getProduct($moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getStoryModuleTest($moduleID)
+ {
+ $objects = $this->objectModel->getStoryModule($moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getModulesNameTest($moduleIdList, $allPath = true, $branchPath = false)
+ {
+ $objects = $this->objectModel->getModulesName($moduleIdList, $allPath = true, $branchPath = false);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function updateOrderTest($orders)
+ {
+ $objects = $this->objectModel->updateOrder($orders);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function manageChildTest($rootID, $type)
+ {
+ $objects = $this->objectModel->manageChild($rootID, $type);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function updateTest($moduleID)
+ {
+ $objects = $this->objectModel->update($moduleID);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test change root.
+ *
+ * @param int $moduleID
+ * @param int $oldRoot
+ * @param int $newRoot
+ * @param string $type
+ * @access public
+ * @return int
+ */
+ public function changeRootTest($moduleID, $oldRoot, $newRoot, $type)
+ {
+ $this->objectModel->changeRoot($moduleID, $oldRoot, $newRoot, $type);
+
+ if(dao::isError()) return dao::getError();
+
+ global $tester;
+ $objects = $tester->dao->select('*')->from(TABLE_STORY)->where('module')->eq($oldRoot)->andWhere('deleted')->eq(0)->fetchAll();
+ return $type == 'story' ? count($objects) : 0;
+ }
+
+ public function deleteTest($moduleID, $null = null)
+ {
+ $objects = $this->objectModel->delete($moduleID, $null = null);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function fixModulePathTest($root, $type)
+ {
+ $objects = $this->objectModel->fixModulePath($root, $type);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ /**
+ * Test check unique module name.
+ *
+ * @param object $module
+ * @param array $modules
+ * @param array $branches
+ * @access public
+ * @return string
+ */
+ public function checkUniqueTest($module, $modules = array(), $branches = array())
+ {
+ global $tester;
+ $modules = $tester->dao->select('id,name')->from(TABLE_MODULE)->where('id')->in($modules)->fetchPairs();
+
+ $repeatName = $this->objectModel->checkUnique($module, $modules, $branches);
+
+ if(dao::isError()) return dao::getError();
+
+ return $repeatName;
+ }
+
+ public function isMergeModuleTest($rootID, $viewType)
+ {
+ $objects = $this->objectModel->isMergeModule($rootID, $viewType);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getProductStructureTest($rootID, $viewType, $branchID = 'all', $currentModuleID = 0)
+ {
+ $objects = $this->objectModel->getProductStructure($rootID, $viewType, $branchID = 'all', $currentModuleID = 0);
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getDataStructureTest($stmt, $viewType, $keepModules = array())
+ {
+ $objects = $this->objectModel->getDataStructure($stmt, $viewType, $keepModules = array());
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+
+ public function getDocStructureTest()
+ {
+ $objects = $this->objectModel->getDocStructure();
+
+ if(dao::isError()) return dao::getError();
+
+ return $objects;
+ }
+}
diff --git a/test/model/tree/buildmenuquery.php b/test/model/tree/buildmenuquery.php
new file mode 100755
index 0000000000..615cfb20e4
--- /dev/null
+++ b/test/model/tree/buildmenuquery.php
@@ -0,0 +1,32 @@
+#!/usr/bin/env php
+buildMenuQuery();
+cid=1
+pid=1
+
+*/
+
+$root = array(1, 2, 3, 41, 42, 43, 101, 102, 103);
+$type = array('story', 'task');
+$startModule = array(1821, 1982);
+$branch = 1;
+
+$tree = new treeTest();
+
+r($tree->buildMenuQueryTest($root[0], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '1' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 1 type story 的查询语句
+r($tree->buildMenuQueryTest($root[1], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '2' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 2 type story 的查询语句
+r($tree->buildMenuQueryTest($root[2], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '3' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 3 type story 的查询语句
+r($tree->buildMenuQueryTest($root[3], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 41 type story 的查询语句
+r($tree->buildMenuQueryTest($root[4], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '42' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 42 type story 的查询语句
+r($tree->buildMenuQueryTest($root[5], $type[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '43' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 43 type story 的查询语句
+r($tree->buildMenuQueryTest($root[6], $type[1])) && p() && e("SELECT * FROM `zt_module` WHERE root = '101' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 101 type task 的查询语句
+r($tree->buildMenuQueryTest($root[7], $type[1])) && p() && e("SELECT * FROM `zt_module` WHERE root = '102' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 102 type task 的查询语句
+r($tree->buildMenuQueryTest($root[8], $type[1])) && p() && e("SELECT * FROM `zt_module` WHERE root = '103' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 103 type task 的查询语句
+r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1821,%' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 41 type story startModule 1821的查询语句
+r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[1], $branch)) && p() && e("SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1982,%' AND (branch = '0' OR branch = '1') AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 41 type story startModule 0 branch 1 的查询语句
diff --git a/test/model/tree/buildtreearray.php b/test/model/tree/buildtreearray.php
new file mode 100755
index 0000000000..62883cd7f1
--- /dev/null
+++ b/test/model/tree/buildtreearray.php
@@ -0,0 +1,38 @@
+#!/usr/bin/env php
+buildTreeArray();
+cid=1
+pid=1
+
+*/
+$tree = new treeTest();
+
+$treeMenu = array();
+
+$root = array(41, 42, 43, 101, 102, 103);
+$type = array('story', 'task');
+
+$stmt = $tester->dbh->query($tree->buildMenuQueryTest($root[0], $type[0]));
+$modules = array();
+while($module = $stmt->fetch()) $modules[$module->id] = $module;
+
+$moduleIDList = array_keys($modules);
+
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[0])) && p('1981') && e('56'); // 测试创建树选项的字符串长度 1
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[1])) && p('1981;2381') && e('56;58'); // 测试创建树选项的字符串长度 2
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[2])) && p('1981;2381') && e('112;58'); // 测试创建树选项的字符串长度 3
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[3])) && p('1981;2381') && e('112;116'); // 测试创建树选项的字符串长度 4
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[4])) && p('1981;2381;0') && e('112;116;148'); // 测试创建树选项的字符串长度 5
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[5])) && p('1981;2381;0') && e('112;116;300'); // 测试创建树选项的字符串长度 6
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[6])) && p('1981;2381;0') && e('112;116;336'); // 测试创建树选项的字符串长度 7
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[7])) && p('1981;2381;0') && e('112;116;372'); // 测试创建树选项的字符串长度 8
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[8])) && p('1981;2381;0') && e('112;116;408'); // 测试创建树选项的字符串长度 9
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[9])) && p('1981;2381;0') && e('112;116;444'); // 测试创建树选项的字符串长度 10
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[10])) && p('1981;2381;0') && e('112;116;480'); // 测试创建树选项的字符串长度 11
+r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[11])) && p('1981;2381;0') && e('112;116;516'); // 测试创建树选项的字符串长度 12
diff --git a/test/model/tree/changeroot.php b/test/model/tree/changeroot.php
new file mode 100755
index 0000000000..f0fdc2626b
--- /dev/null
+++ b/test/model/tree/changeroot.php
@@ -0,0 +1,32 @@
+#!/usr/bin/env php
+changeRoot();
+cid=1
+pid=1
+
+*/
+$moduleID = array(1821, 1822, 1825, 1826, 1981, 1982, 1985, 1986, 21, 22, 24, 25);
+$root = array(1, 2, 41, 42, 101, 102);
+$type = array('story', 'task');
+
+$tree = new treeTest();
+
+r($tree->changeRootTest($moduleID[0], $root[0], $root[1], $type[0])) && p('id,root') && e('0'); // 测试修改module 1821 的root从 1 修改为 2
+r($tree->changeRootTest($moduleID[1], $root[0], $root[1], $type[0])) && p('id,root') && e('0'); // 测试修改module 1822 的root从 1 修改为 2
+r($tree->changeRootTest($moduleID[2], $root[1], $root[0], $type[0])) && p('id,root') && e('0'); // 测试修改module 1825 的root从 2 修改为 1
+r($tree->changeRootTest($moduleID[3], $root[1], $root[0], $type[0])) && p('id,root') && e('0'); // 测试修改module 1826 的root从 2 修改为 1
+r($tree->changeRootTest($moduleID[4], $root[2], $root[3], $type[0])) && p('id,root') && e('0'); // 测试修改module 1981 的root从 41 修改为 42
+r($tree->changeRootTest($moduleID[5], $root[2], $root[3], $type[0])) && p('id,root') && e('0'); // 测试修改module 1982 的root从 41 修改为 42
+r($tree->changeRootTest($moduleID[6], $root[3], $root[2], $type[0])) && p('id,root') && e('0'); // 测试修改module 1985 的root从 42 修改为 41
+r($tree->changeRootTest($moduleID[7], $root[3], $root[2], $type[0])) && p('id,root') && e('0'); // 测试修改module 1986 的root从 42 修改为 41
+r($tree->changeRootTest($moduleID[8], $root[4], $root[5], $type[1])) && p('id,root') && e('0'); // 测试修改module 21 的root从 101 修改为 102
+r($tree->changeRootTest($moduleID[9], $root[4], $root[5], $type[1])) && p('id,root') && e('0'); // 测试修改module 22 的root从 101 修改为 102
+r($tree->changeRootTest($moduleID[10], $root[5], $root[4], $type[1])) && p('id,root') && e('0'); // 测试修改module 24 的root从 102 修改为 101
+r($tree->changeRootTest($moduleID[11], $root[5], $root[4], $type[1])) && p('id,root') && e('0'); // 测试修改module 25 的root从 102 修改为 101
+system("./ztest init");
diff --git a/test/model/tree/checkunique.php b/test/model/tree/checkunique.php
new file mode 100755
index 0000000000..5cb5bc78f4
--- /dev/null
+++ b/test/model/tree/checkunique.php
@@ -0,0 +1,69 @@
+#!/usr/bin/env php
+checkUnique();
+cid=1
+pid=1
+
+*/
+$module1 = new stdclass();
+$module1->name = '不会重名的模块';
+$module1->root = '1';
+$module1->branch = '0';
+$module1->type = 'story';
+$module1->parent = '0';
+
+$module2 = new stdclass();
+$module2->name = '产品模块3';
+$module2->root = '1';
+$module2->branch = '0';
+$module2->type = 'story';
+$module2->parent = '0';
+
+$module3 = new stdclass();
+$module3->name = '产品模块162';
+$module3->root = '41';
+$module3->branch = '2';
+$module3->type = 'story';
+$module3->parent = '0';
+
+$module4 = new stdclass();
+$module4->name = '产品子模块281';
+$module4->root = '41';
+$module4->branch = '0';
+$module4->type = 'story';
+$module4->parent = '2381';
+
+$module5 = new stdclass();
+$module5->name = '执行子模块1';
+$module5->root = '101';
+$module5->branch = '0';
+$module5->type = 'story';
+$module5->parent = '21';
+
+$moduleID1 = array(1821, 1823, 1825, 1826, 1981, 1982, 1985, 1986, 21, 2901, 3021);
+$moduleID2 = array(1822, 1823, 1825, 1826, 1981, 1822);
+$branches = array(0, 1, 2);
+
+$tree = new treeTest();
+
+r($tree->checkUniqueTest($module1)) && p() && e('0'); // 测试module1是否与已存在的模块重名
+r($tree->checkUniqueTest($module1, $moduleID1, $branches)) && p() && e('产品模块1'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module1, $moduleID2, $branches)) && p() && e('产品模块2'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module2)) && p() && e('产品模块3'); // 测试module1是否与已存在的模块重名
+r($tree->checkUniqueTest($module2, $moduleID1, $branches)) && p() && e('产品模块1'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module2, $moduleID2, $branches)) && p() && e('产品模块2'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module3)) && p() && e('0'); // 测试module1是否与已存在的模块重名
+r($tree->checkUniqueTest($module3, $moduleID1, $branches)) && p() && e('产品模块161'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module3, $moduleID2, $branches)) && p() && e('产品模块161'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module4)) && p() && e('产品子模块281'); // 测试module1是否与已存在的模块重名
+r($tree->checkUniqueTest($module4, $moduleID1, $branches)) && p() && e('产品子模块281'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module4, $moduleID2, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module5)) && p() && e('0'); // 测试module1是否与已存在的模块重名
+r($tree->checkUniqueTest($module5, $moduleID1, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
+r($tree->checkUniqueTest($module5, $moduleID2, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名
diff --git a/test/model/tree/createbuglink.php b/test/model/tree/createbuglink.php
new file mode 100755
index 0000000000..5902fb260e
--- /dev/null
+++ b/test/model/tree/createbuglink.php
@@ -0,0 +1,26 @@
+#!/usr/bin/env php
+createBugLink();
+cid=1
+pid=1
+
+*/
+
+$moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22);
+
+$tree = new treeTest();
+
+r($tree->createBugLinkTest($moduleID[0])) && p() && e("title='产品模块1'"); // 测试创建module 1821 的buglink
+r($tree->createBugLinkTest($moduleID[1])) && p() && e("title='产品模块2'"); // 测试创建module 1822 的buglink
+r($tree->createBugLinkTest($moduleID[2])) && p() && e("title='产品模块161'"); // 测试创建module 1981 的buglink
+r($tree->createBugLinkTest($moduleID[3])) && p() && e("title='产品模块162'"); // 测试创建module 1982 的buglink
+r($tree->createBugLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的buglink
+r($tree->createBugLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的buglink
+r($tree->createBugLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的buglink
+r($tree->createBugLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的buglink
diff --git a/test/model/tree/createcaseliblink.php b/test/model/tree/createcaseliblink.php
new file mode 100755
index 0000000000..643f747154
--- /dev/null
+++ b/test/model/tree/createcaseliblink.php
@@ -0,0 +1,25 @@
+#!/usr/bin/env php
+createCaseLibLink();
+cid=1
+pid=1
+
+*/
+$moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22);
+
+$tree = new treeTest();
+
+r($tree->createCaseLibLinkTest($moduleID[0])) && p() && e("title='产品模块1'"); // 测试创建module 1821 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[1])) && p() && e("title='产品模块2'"); // 测试创建module 1822 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[2])) && p() && e("title='产品模块161'"); // 测试创建module 1981 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[3])) && p() && e("title='产品模块162'"); // 测试创建module 1982 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的caseliblink
+r($tree->createCaseLibLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的caseliblink
diff --git a/test/model/tree/createcaselink.php b/test/model/tree/createcaselink.php
new file mode 100755
index 0000000000..73d668dc4a
--- /dev/null
+++ b/test/model/tree/createcaselink.php
@@ -0,0 +1,31 @@
+#!/usr/bin/env php
+createCaseLink();
+cid=1
+pid=1
+
+*/
+
+$moduleID = array(1821, 1822, 1982, 1983, 1621, 1622, 21, 22);
+$extra = array(0, 1, 2);
+
+$tree = new treeTest();
+
+r($tree->createCaseLinkTest($moduleID[0])) && p() && e("title='产品模块1'"); // 测试创建module 1821 的caselink
+r($tree->createCaseLinkTest($moduleID[1])) && p() && e("title='产品模块2'"); // 测试创建module 1822 的caselink
+r($tree->createCaseLinkTest($moduleID[2], array('branchID' => $extra[0]))) && p() && e("title='产品模块162'"); // 测试创建module 1983 branch 0 的caselink
+r($tree->createCaseLinkTest($moduleID[2], array('branchID' => $extra[1]))) && p() && e("title='产品模块162'"); // 测试创建module 1983 branch 1 的caselink
+r($tree->createCaseLinkTest($moduleID[2], array('branchID' => $extra[2]))) && p() && e("title='产品模块162'"); // 测试创建module 1983 branch 2 的caselink
+r($tree->createCaseLinkTest($moduleID[3], array('branchID' => $extra[0]))) && p() && e("title='产品模块163'"); // 测试创建module 1983 branch 0 的caselink
+r($tree->createCaseLinkTest($moduleID[3], array('branchID' => $extra[1]))) && p() && e("title='产品模块163'"); // 测试创建module 1983 branch 1 的caselink
+r($tree->createCaseLinkTest($moduleID[3], array('branchID' => $extra[2]))) && p() && e("title='产品模块163'"); // 测试创建module 1983 branch 2 的caselink
+r($tree->createCaseLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的caselink
+r($tree->createCaseLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的caselink
+r($tree->createCaseLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的caselink
+r($tree->createCaseLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的caselink
diff --git a/test/model/tree/createfeedbacklink.php b/test/model/tree/createfeedbacklink.php
new file mode 100755
index 0000000000..617307a5b1
--- /dev/null
+++ b/test/model/tree/createfeedbacklink.php
@@ -0,0 +1,25 @@
+#!/usr/bin/env php
+createFeedbackLink();
+cid=1
+pid=1
+
+*/
+$moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22);
+
+$tree = new treeTest();
+
+r($tree->createFeedbackLinkTest($moduleID[0])) && p() && e("title='产品模块1'"); // 测试创建module 1821 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[1])) && p() && e("title='产品模块2'"); // 测试创建module 1822 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[2])) && p() && e("title='产品模块161'"); // 测试创建module 1981 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[3])) && p() && e("title='产品模块162'"); // 测试创建module 1982 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的feedbacklink
+r($tree->createFeedbackLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的feedbacklink
diff --git a/test/model/tree/createmanagelink.php b/test/model/tree/createmanagelink.php
new file mode 100755
index 0000000000..ae051dec84
--- /dev/null
+++ b/test/model/tree/createmanagelink.php
@@ -0,0 +1,32 @@
+#!/usr/bin/env php
+createManageLink();
+cid=1
+pid=1
+
+*/
+$moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22);
+$extra0 = array('branchID' => 0);
+$extra1 = array('branchID' => 1);
+$extra2 = array('branchID' => 2);
+
+$tree = new treeTest();
+
+r($tree->createManageLinkTest($moduleID[0], $extra0)) && p() && e("产品模块1 <"); // 测试创建module 1821 branch 0 的managelink
+r($tree->createManageLinkTest($moduleID[1], $extra0)) && p() && e("产品模块2 <"); // 测试创建module 1822 branch 0 的managelink
+r($tree->createManageLinkTest($moduleID[2], $extra0)) && p() && e("产品模块161"); // 测试创建module 1981 branch 0 的managelink
+r($tree->createManageLinkTest($moduleID[2], $extra1)) && p() && e("产品模块161"); // 测试创建module 1981 branch 1 的managelink
+r($tree->createManageLinkTest($moduleID[2], $extra2)) && p() && e("产品模块161"); // 测试创建module 1981 branch 2 的managelink
+r($tree->createManageLinkTest($moduleID[3], $extra0)) && p() && e("产品模块162"); // 测试创建module 1982 branch 0 的managelink
+r($tree->createManageLinkTest($moduleID[3], $extra1)) && p() && e("产品模块162"); // 测试创建module 1982 branch 1 的managelink
+r($tree->createManageLinkTest($moduleID[3], $extra2)) && p() && e("产品模块162"); // 测试创建module 1982 branch 2 的managelink
+r($tree->createManageLinkTest($moduleID[4], $extra0)) && p() && e("模块1601 createManageLinkTest($moduleID[5], $extra0)) && p() && e("模块1602 createManageLinkTest($moduleID[6], $extra0)) && p() && e("模块1 createManageLinkTest($moduleID[7], $extra0)) && p() && e("模块2