Dylan Smith : comdlg32: Test and fix Find/ ReplaceText parameter checking code.
Alexandre Julliard
julliard at winehq.org
Wed Jul 21 10:54:48 CDT 2010
Module: wine
Branch: master
Commit: e5a476c66d4f9183b8f9edff7b783d5c33ddd864
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e5a476c66d4f9183b8f9edff7b783d5c33ddd864
Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date: Tue Jul 20 17:50:06 2010 -0400
comdlg32: Test and fix Find/ReplaceText parameter checking code.
---
dlls/comdlg32/finddlg.c | 10 +--
dlls/comdlg32/tests/Makefile.in | 1 +
dlls/comdlg32/tests/finddlg.c | 145 +++++++++++++++++++++++++++++++++++++++
3 files changed, 148 insertions(+), 8 deletions(-)
diff --git a/dlls/comdlg32/finddlg.c b/dlls/comdlg32/finddlg.c
index 8527631..e3a2c1a 100644
--- a/dlls/comdlg32/finddlg.c
+++ b/dlls/comdlg32/finddlg.c
@@ -304,7 +304,7 @@ static BOOL COMDLG32_FR_CheckPartial(
) {
if(!pfr)
{
- COMDLG32_SetCommDlgExtendedError(CDERR_GENERALCODES);
+ COMDLG32_SetCommDlgExtendedError(CDERR_INITIALIZATION);
return FALSE;
}
@@ -344,18 +344,12 @@ static BOOL COMDLG32_FR_CheckPartial(
return FALSE;
}
- if((pfr->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE)) && !pfr->hInstance)
+ if((pfr->Flags & FR_ENABLETEMPLATEHANDLE) && !pfr->hInstance)
{
COMDLG32_SetCommDlgExtendedError(CDERR_NOHINSTANCE);
return FALSE;
}
- if((pfr->Flags & FR_ENABLETEMPLATE) && !pfr->lpTemplateName)
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_NOTEMPLATE);
- return FALSE;
- }
-
return TRUE;
}
diff --git a/dlls/comdlg32/tests/Makefile.in b/dlls/comdlg32/tests/Makefile.in
index cfdecef..9362cd3 100644
--- a/dlls/comdlg32/tests/Makefile.in
+++ b/dlls/comdlg32/tests/Makefile.in
@@ -7,6 +7,7 @@ IMPORTS = comdlg32 winspool user32 gdi32 kernel32
C_SRCS = \
filedlg.c \
+ finddlg.c \
fontdlg.c \
printdlg.c
diff --git a/dlls/comdlg32/tests/finddlg.c b/dlls/comdlg32/tests/finddlg.c
new file mode 100644
index 0000000..4a10909
--- /dev/null
+++ b/dlls/comdlg32/tests/finddlg.c
@@ -0,0 +1,145 @@
+/*
+ * 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 "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 DefWindowProc(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;
+
+ /* invalid lpstrReplaceWith (NULL) for ReplaceText */
+ CHECK_FIND_SUCCEED();
+ CHECK_REPLACE_FAIL(FRERR_BUFFERLENGTHZERO);
+ fr.lpstrReplaceWith = replacebuffer;
+
+ /* 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 = GetModuleHandle(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();
+}
More information about the wine-cvs
mailing list