| /* Unit tests for treeview. | |
| * | |
| * Copyright 2005 Krzysztof Foltman | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include <assert.h> | |
| #include <stdarg.h> | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "wingdi.h" | |
| #include "winuser.h" | |
| #include "winnls.h" | |
| #include "winreg.h" | |
| #include "commctrl.h" | |
| #include "wine/test.h" | |
| static HWND hMainWnd; | |
| static HWND hTree; | |
| static HTREEITEM hRoot, hChild; | |
| static int pos = 0; | |
| static char sequence[256]; | |
| static void Clear(void) | |
| { | |
| pos = 0; | |
| sequence[0] = '\0'; | |
| } | |
| static void AddItem(char ch) | |
| { | |
| sequence[pos++] = ch; | |
| sequence[pos] = '\0'; | |
| } | |
| static void IdentifyItem(HTREEITEM hItem) | |
| { | |
| if (hItem == hRoot) { | |
| AddItem('R'); | |
| return; | |
| } | |
| if (hItem == hChild) { | |
| AddItem('C'); | |
| return; | |
| } | |
| if (hItem == NULL) { | |
| AddItem('n'); | |
| return; | |
| } | |
| AddItem('?'); | |
| } | |
| static void FillRoot(void) | |
| { | |
| TVINSERTSTRUCTA ins; | |
| Clear(); | |
| AddItem('A'); | |
| ins.hParent = TVI_ROOT; | |
| ins.hInsertAfter = TVI_ROOT; | |
| U(ins).item.mask = TVIF_TEXT; | |
| U(ins).item.pszText = "Root"; | |
| hRoot = TreeView_InsertItem(hTree, &ins); | |
| assert(hRoot); | |
| AddItem('B'); | |
| ins.hParent = hRoot; | |
| ins.hInsertAfter = TVI_FIRST; | |
| U(ins).item.mask = TVIF_TEXT; | |
| U(ins).item.pszText = "Child"; | |
| hChild = TreeView_InsertItem(hTree, &ins); | |
| assert(hChild); | |
| AddItem('.'); | |
| ok(!strcmp(sequence, "AB."), "Item creation\n"); | |
| } | |
| static void DoTest1(void) | |
| { | |
| TreeView_SelectItem(hTree, NULL); | |
| Clear(); | |
| AddItem('1'); | |
| TreeView_SelectItem(hTree, hRoot); | |
| AddItem('2'); | |
| TreeView_SelectItem(hTree, hRoot); | |
| AddItem('3'); | |
| TreeView_SelectItem(hTree, NULL); | |
| AddItem('4'); | |
| TreeView_SelectItem(hTree, NULL); | |
| AddItem('5'); | |
| TreeView_SelectItem(hTree, hRoot); | |
| AddItem('.'); | |
| ok(!strcmp(sequence, "1(nR)nR23(Rn)Rn45(nR)nR."), "root-none select test\n"); | |
| } | |
| static void DoTest2(void) | |
| { | |
| TreeView_SelectItem(hTree, NULL); | |
| Clear(); | |
| AddItem('1'); | |
| TreeView_SelectItem(hTree, hRoot); | |
| AddItem('2'); | |
| TreeView_SelectItem(hTree, hRoot); | |
| AddItem('3'); | |
| TreeView_SelectItem(hTree, hChild); | |
| AddItem('4'); | |
| TreeView_SelectItem(hTree, hChild); | |
| AddItem('5'); | |
| TreeView_SelectItem(hTree, hRoot); | |
| AddItem('.'); | |
| ok(!strcmp(sequence, "1(nR)nR23(RC)RC45(CR)CR."), "root-child select test\n"); | |
| } | |
| LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | |
| { | |
| switch(msg) { | |
| case WM_CREATE: | |
| { | |
| hTree = CreateWindowExA(WS_EX_CLIENTEDGE, WC_TREEVIEWA, NULL, WS_CHILD|WS_VISIBLE| | |
| TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS, | |
| 0, 0, 300, 50, hWnd, (HMENU)100, GetModuleHandleA(0), 0); | |
| SetFocus(hTree); | |
| return 0; | |
| } | |
| case WM_NOTIFY: | |
| { | |
| NMHDR *pHdr = (NMHDR *)lParam; | |
| if (pHdr->idFrom == 100) { | |
| NMTREEVIEWA *pTreeView = (LPNMTREEVIEWA) lParam; | |
| switch(pHdr->code) { | |
| case TVN_SELCHANGINGA: | |
| AddItem('('); | |
| IdentifyItem(pTreeView->itemOld.hItem); | |
| IdentifyItem(pTreeView->itemNew.hItem); | |
| return 0; | |
| case TVN_SELCHANGEDA: | |
| AddItem(')'); | |
| IdentifyItem(pTreeView->itemOld.hItem); | |
| IdentifyItem(pTreeView->itemNew.hItem); | |
| return 0; | |
| } | |
| } | |
| return 0; | |
| } | |
| case WM_SIZE: | |
| MoveWindow(hTree, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); | |
| break; | |
| case WM_DESTROY: | |
| PostQuitMessage(0); | |
| break; | |
| default: | |
| return DefWindowProcA(hWnd, msg, wParam, lParam); | |
| } | |
| return 0L; | |
| } | |
| START_TEST(treeview) | |
| { | |
| WNDCLASSA wc; | |
| MSG msg; | |
| INITCOMMONCONTROLSEX icex; | |
| RECT rc; | |
| icex.dwSize = sizeof(INITCOMMONCONTROLSEX); | |
| icex.dwICC = ICC_TREEVIEW_CLASSES; | |
| InitCommonControlsEx(&icex); | |
| wc.style = CS_HREDRAW | CS_VREDRAW; | |
| wc.cbClsExtra = 0; | |
| wc.cbWndExtra = 0; | |
| wc.hInstance = GetModuleHandleA(NULL); | |
| wc.hIcon = NULL; | |
| wc.hCursor = LoadCursorA(NULL, MAKEINTRESOURCEA(IDC_IBEAM)); | |
| wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); | |
| wc.lpszMenuName = NULL; | |
| wc.lpszClassName = "MyTestWnd"; | |
| wc.lpfnWndProc = MyWndProc; | |
| RegisterClassA(&wc); | |
| hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW, | |
| CW_USEDEFAULT, CW_USEDEFAULT, 680, 260, NULL, NULL, GetModuleHandleA(NULL), 0); | |
| GetClientRect(hMainWnd, &rc); | |
| FillRoot(); | |
| DoTest1(); | |
| DoTest2(); | |
| PostMessageA(hMainWnd, WM_CLOSE, 0, 0); | |
| while(GetMessageA(&msg,0,0,0)) { | |
| TranslateMessage(&msg); | |
| DispatchMessageA(&msg); | |
| } | |
| } |