void test_deletes_the_root_from_the_tree(){ Tree tree = createTree(areNodesEqual); int number = 12; insertTreeNode(&tree, NULL, &number); ASSERT(searchInTree(tree, &number)); ASSERT(1 == deleteFromTree(&tree, &number)); }
void test_must_not_delete_any_Parent_node(){ Tree tree = createTree(compareInts); Iterator result; int data[2] = {10,23}; ASSERT(insertIntoTree(&tree, NULL, &data)); ASSERT(insertIntoTree(&tree, &data, &data[1])); ASSERT(0 == deleteFromTree(&tree,&data[0])); disposeTree(&tree); }
void test_deletes_child_of_root(){ Tree tree = createTree(areNodesEqual); int nums[3] = {1,2,3}; insertTreeNode(&tree, NULL, &nums[0]); insertTreeNode(&tree, &nums[0], &nums[1]); insertTreeNode(&tree, &nums[0], &nums[2]); ASSERT(1 == searchInTree(tree, &nums[1])); ASSERT(1 == deleteFromTree(&tree, &nums[1])); ASSERT(0 == searchInTree(tree, &nums[1])); }
void test_must_delete_node_at_second_level(){ Tree tree = createTree(compareInts); Iterator result; int data[2] = {10,23}; ASSERT(insertIntoTree(&tree, NULL, &data)); ASSERT(insertIntoTree(&tree, &data, &data[1])); ASSERT(deleteFromTree(&tree,&data[1])); result = getChildren(&tree, &data); ASSERT(0 == result.hasNext(&result)); disposeTree(&tree); }
void test_does_not_delete_node_with_children(){ Tree tree = createTree(areNodesEqual); int nums[4] ={1,2,3,4}; insertTreeNode(&tree, NULL, &nums[0]); insertTreeNode(&tree, &nums[0], &nums[1]); insertTreeNode(&tree, &nums[0], &nums[2]); insertTreeNode(&tree, &nums[2], &nums[3]); ASSERT(1 == searchInTree(tree, &nums[2])); ASSERT(0 == deleteFromTree(&tree, &nums[2])); }
void test_must_delete_nodes_from_different_levels(){ Tree tree = createTree(compareInts); Iterator result; int data[7] = {10,12,30,4,45,5,50}; ASSERT(insertIntoTree(&tree, NULL, &data[0])); ASSERT(insertIntoTree(&tree, &data[0], &data[1])); ASSERT(insertIntoTree(&tree, &data[1], &data[2])); ASSERT(insertIntoTree(&tree, &data[2], &data[3])); ASSERT(insertIntoTree(&tree, &data[3], &data[4])); ASSERT(insertIntoTree(&tree, &data[4], &data[5])); ASSERT(deleteFromTree(&tree, &data[5])); result = getChildren(&tree, &data[4]); ASSERT(0 == result.hasNext(&result)); disposeTree(&tree); }
bool FileBrowser::deleteFromTree(generic_string rootPath, HTREEITEM node, std::vector<generic_string> linarPathArray) { if (node == nullptr) // it's a root. Search the right root with rootPath { // Search if ((node = getRootFromFullPath(rootPath)) == nullptr) return false; } if (linarPathArray.size() == 1) { // Search HTREEITEM childNodeFound = findChildNodeFromName(node, linarPathArray[0]); if (childNodeFound == nullptr) return false; // found it, delete it _treeView.removeItem(childNodeFound); return true; } else { HTREEITEM childNodeFound = nullptr; for (HTREEITEM hItemNode = _treeView.getChildFrom(node); hItemNode != NULL && childNodeFound == nullptr; hItemNode = _treeView.getNextSibling(hItemNode)) { TCHAR textBuffer[MAX_PATH]; TVITEM tvItem; tvItem.mask = TVIF_TEXT; tvItem.pszText = textBuffer; tvItem.cchTextMax = MAX_PATH; tvItem.hItem = hItemNode; SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, (LPARAM)&tvItem); if (linarPathArray[0] == tvItem.pszText) { // search recursively the node for an action linarPathArray.erase(linarPathArray.begin()); return deleteFromTree(rootPath, hItemNode, linarPathArray); } } return false; } }
INT_PTR CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG : { FileBrowser::initPopupMenus(); _treeView.init(_hInst, _hSelf, ID_FILEBROWSERTREEVIEW); setImageList(IDI_PROJECT_WORKSPACE, IDI_PROJECT_WORKSPACEDIRTY, IDI_PROJECT_PROJECT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID); _treeView.addCanNotDropInList(INDEX_OPEN_ROOT); _treeView.addCanNotDropInList(INDEX_CLOSE_ROOT); _treeView.addCanNotDropInList(INDEX_OPEN_NODE); _treeView.addCanNotDropInList(INDEX_CLOSED_NODE); _treeView.addCanNotDropInList(INDEX_LEAF); _treeView.addCanNotDropInList(INDEX_LEAF_INVALID); _treeView.addCanNotDragOutList(INDEX_OPEN_ROOT); _treeView.addCanNotDragOutList(INDEX_CLOSE_ROOT); _treeView.addCanNotDragOutList(INDEX_OPEN_NODE); _treeView.addCanNotDragOutList(INDEX_CLOSED_NODE); _treeView.addCanNotDragOutList(INDEX_LEAF); _treeView.addCanNotDragOutList(INDEX_LEAF_INVALID); _treeView.makeLabelEditable(false); _treeView.display(); return TRUE; } case WM_MOUSEMOVE: if (_treeView.isDragging()) _treeView.dragItem(_hSelf, LOWORD(lParam), HIWORD(lParam)); break; case WM_LBUTTONUP: if (_treeView.isDragging()) if (_treeView.dropItem()) { } break; case WM_NOTIFY: { notified((LPNMHDR)lParam); } return TRUE; case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); HWND hwnd = _treeView.getHSelf(); if (hwnd) ::MoveWindow(hwnd, 0, 0, width, height, TRUE); break; } case WM_CONTEXTMENU: if (!_treeView.isDragging()) showContextMenu(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return TRUE; case WM_COMMAND: { popupMenuCmd(LOWORD(wParam)); break; } case WM_DESTROY: { _treeView.destroy(); destroyMenus(); break; } case FB_ADDFILE: { const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam; generic_string separator = TEXT("\\\\"); size_t sepPos = file2Change[0].find(separator); if (sepPos == generic_string::npos) return false; generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1); // remove prefix of file/folder in changeInfo, splite the remained path vector<generic_string> linarPathArray = split(pathSuffix, '\\'); generic_string rootPath = file2Change[0].substr(0, sepPos); generic_string path = rootPath; generic_string addedFilePath = file2Change[0].substr(0, sepPos + 1); addedFilePath += pathSuffix; bool isAdded = addInTree(rootPath, addedFilePath, nullptr, linarPathArray); if (not isAdded) { //MessageBox(NULL, addedFilePath.c_str(), TEXT("file/folder is not added"), MB_OK); } break; } case FB_RMFILE: { const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam; generic_string separator = TEXT("\\\\"); size_t sepPos = file2Change[0].find(separator); if (sepPos == generic_string::npos) return false; generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1); // remove prefix of file/folder in changeInfo, splite the remained path vector<generic_string> linarPathArray = split(pathSuffix, '\\'); generic_string rootPath = file2Change[0].substr(0, sepPos); // search recursively and modify the tree structure bool isRemoved = deleteFromTree(rootPath, nullptr, linarPathArray); if (not isRemoved) { //MessageBox(NULL, file2Change[0].c_str(), TEXT("file/folder is not removed"), MB_OK); } break; } case FB_RNFILE: { const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam; generic_string separator = TEXT("\\\\"); size_t sepPos = file2Change[0].find(separator); if (sepPos == generic_string::npos) return false; generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1); // remove prefix of file/folder in changeInfo, splite the remained path vector<generic_string> linarPathArray = split(pathSuffix, '\\'); generic_string rootPath = file2Change[0].substr(0, sepPos); size_t sepPos2 = file2Change[1].find(separator); if (sepPos2 == generic_string::npos) return false; generic_string pathSuffix2 = file2Change[1].substr(sepPos2 + separator.length(), file2Change[1].length() - 1); vector<generic_string> linarPathArray2 = split(pathSuffix2, '\\'); bool isRenamed = renameInTree(rootPath, nullptr, linarPathArray, linarPathArray2); if (not isRenamed) { //MessageBox(NULL, file2Change[0].c_str(), TEXT("file/folder is not removed"), MB_OK); } break; } default : return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } return DockingDlgInterface::run_dlgProc(message, wParam, lParam); }
void test_deletion_failed_when_data_is_not_in_tree(){ Tree tree = createTree(areNodesEqual); int number = 12; ASSERT(0 == deleteFromTree(&tree, &number)); }