| /* |
| * Unit test suite for comdlg32 API functions: find/replace dialogs |
| * |
| * Copyright 2010 by Dylan Smith |
| * |
| * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| * |
| */ |
| |
| #include "windows.h" |
| #include "commdlg.h" |
| #include "cderr.h" |
| #include "wine/test.h" |
| |
| static UINT ID_FINDMSGSTRING; |
| |
| static LRESULT handle_findmsg(FINDREPLACEA *fr) |
| { |
| return 0; |
| } |
| |
| static LRESULT CALLBACK OwnerWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
| { |
| if(msg == ID_FINDMSGSTRING) { |
| return handle_findmsg((FINDREPLACEA*)lParam); |
| } |
| return DefWindowProcA(hwnd, msg, wParam, lParam); |
| } |
| |
| static void test_param_check(void) |
| { |
| char findbuffer[64]; |
| char replacebuffer[64]; |
| FINDREPLACEA fr, *pFr; |
| WNDCLASSA wc; |
| |
| ZeroMemory(&wc, sizeof(wc)); |
| wc.lpfnWndProc = OwnerWndProc; |
| wc.lpszClassName = "test_param_check"; |
| RegisterClassA(&wc); |
| |
| #define CHECK_FIND_OR_REPLACE(FUNC, FAIL, ERR_CODE) \ |
| do { \ |
| HWND hwnd = FUNC(pFr); \ |
| BOOL is_ok = !!hwnd == !FAIL; \ |
| ok(is_ok, "%s should%s fail\n", #FUNC, FAIL ? "" : "n't"); \ |
| if (FAIL && is_ok) { \ |
| DWORD ext_err = CommDlgExtendedError(); \ |
| ok(ext_err == ERR_CODE, "expected err %x got %x\n", \ |
| ERR_CODE, ext_err); \ |
| } else { \ |
| DestroyWindow(hwnd); \ |
| } \ |
| } while (0) |
| |
| #define CHECK_FIND_FAIL(ERR_CODE) \ |
| CHECK_FIND_OR_REPLACE(FindTextA, TRUE, ERR_CODE) |
| |
| #define CHECK_FIND_SUCCEED() \ |
| CHECK_FIND_OR_REPLACE(FindTextA, FALSE, 0) |
| |
| #define CHECK_REPLACE_FAIL(ERR_CODE) \ |
| CHECK_FIND_OR_REPLACE(ReplaceTextA, TRUE, ERR_CODE) |
| |
| #define CHECK_REPLACE_SUCCEED() \ |
| CHECK_FIND_OR_REPLACE(ReplaceTextA, FALSE, 0) |
| |
| #define CHECK_FINDREPLACE_FAIL(ERR_CODE) \ |
| do { \ |
| CHECK_FIND_FAIL(ERR_CODE); \ |
| CHECK_REPLACE_FAIL(ERR_CODE); \ |
| } while (0) |
| |
| pFr = NULL; |
| CHECK_FINDREPLACE_FAIL(CDERR_INITIALIZATION); |
| pFr = &fr; |
| |
| ZeroMemory(&fr, sizeof(fr)); |
| /* invalid lStructSize (0) */ |
| CHECK_FINDREPLACE_FAIL(CDERR_STRUCTSIZE); |
| fr.lStructSize = sizeof(fr); |
| |
| /* invalid hwndOwner (NULL) */ |
| CHECK_FINDREPLACE_FAIL(CDERR_DIALOGFAILURE); |
| fr.hwndOwner = CreateWindowA(wc.lpszClassName, NULL, WS_VISIBLE, 0, 0, 200, 100, |
| NULL, NULL, GetModuleHandleA(NULL), NULL); |
| |
| /* invalid wFindWhatLen (0) */ |
| CHECK_FINDREPLACE_FAIL(FRERR_BUFFERLENGTHZERO); |
| fr.wFindWhatLen = sizeof(findbuffer); |
| |
| /* invalid lpstrFindWhat (NULL) */ |
| CHECK_FINDREPLACE_FAIL(FRERR_BUFFERLENGTHZERO); |
| fr.lpstrFindWhat = findbuffer; |
| strcpy(findbuffer, "abc"); |
| |
| /* invalid lpstrReplaceWith (NULL) for ReplaceText */ |
| CHECK_FIND_SUCCEED(); |
| CHECK_REPLACE_FAIL(FRERR_BUFFERLENGTHZERO); |
| fr.lpstrReplaceWith = replacebuffer; |
| strcpy(replacebuffer, "def"); |
| |
| /* wReplaceWithLen may be 0, even for ReplaceText */ |
| CHECK_FIND_SUCCEED(); |
| CHECK_REPLACE_SUCCEED(); |
| fr.wReplaceWithLen = sizeof(replacebuffer); |
| |
| /* invalid lpfnHook (NULL) when Flags has FR_ENABLEHOOK */ |
| fr.Flags = FR_ENABLEHOOK; |
| CHECK_FINDREPLACE_FAIL(CDERR_NOHOOK); |
| |
| /* invalid hInstance (NULL) |
| * when Flags has FR_ENABLETEMPLATE or FR_ENABLETEMPLATEHANDLE */ |
| fr.Flags = FR_ENABLETEMPLATE; |
| CHECK_FINDREPLACE_FAIL(CDERR_FINDRESFAILURE); |
| fr.Flags = FR_ENABLETEMPLATEHANDLE; |
| CHECK_FINDREPLACE_FAIL(CDERR_NOHINSTANCE); |
| fr.hInstance = GetModuleHandleA(NULL); |
| |
| /* invalid lpTemplateName (NULL) when Flags has FR_ENABLETEMPLATE */ |
| fr.Flags = FR_ENABLETEMPLATE; |
| CHECK_FINDREPLACE_FAIL(CDERR_FINDRESFAILURE); |
| fr.Flags = 0; |
| |
| CHECK_FIND_SUCCEED(); |
| CHECK_REPLACE_SUCCEED(); |
| |
| DestroyWindow(fr.hwndOwner); |
| } |
| |
| START_TEST(finddlg) |
| { |
| ID_FINDMSGSTRING = RegisterWindowMessageA(FINDMSGSTRINGA); |
| |
| test_param_check(); |
| } |