wintab32: Add a test for context validation by WTOpen.
diff --git a/configure b/configure
index 2f74bac..199187a 100755
--- a/configure
+++ b/configure
Binary files differ
diff --git a/configure.ac b/configure.ac
index 3b805fe..17bfc66 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2431,6 +2431,7 @@
WINE_CONFIG_MAKEFILE([dlls/winspool.drv/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
WINE_CONFIG_MAKEFILE([dlls/wintab.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16])
WINE_CONFIG_MAKEFILE([dlls/wintab32/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
+WINE_CONFIG_MAKEFILE([dlls/wintab32/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
WINE_CONFIG_MAKEFILE([dlls/wintrust/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
WINE_CONFIG_MAKEFILE([dlls/wintrust/tests/Makefile],[dlls/Maketest.rules],[dlls],[ALL_TEST_DIRS],[enable_tests])
WINE_CONFIG_MAKEFILE([dlls/wldap32/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS])
diff --git a/dlls/wintab32/tests/Makefile.in b/dlls/wintab32/tests/Makefile.in
new file mode 100644
index 0000000..07c2961
--- /dev/null
+++ b/dlls/wintab32/tests/Makefile.in
@@ -0,0 +1,13 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+TESTDLL = wintab32.dll
+IMPORTS = kernel32 user32
+
+CTESTS = \
+ context.c
+
+@MAKE_TEST_RULES@
+
+@DEPENDENCIES@ # everything below this line is overwritten by make depend
diff --git a/dlls/wintab32/tests/context.c b/dlls/wintab32/tests/context.c
new file mode 100644
index 0000000..c9f13fa
--- /dev/null
+++ b/dlls/wintab32/tests/context.c
@@ -0,0 +1,152 @@
+/*
+ * tests for Wintab context behavior
+ *
+ * Copyright 2009 John Klehm
+ *
+ * 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 <assert.h>
+#include <windows.h>
+#include <wintab.h>
+
+#include "wine/test.h"
+
+static const CHAR wintab32Dll[] = "Wintab32.dll";
+static const CHAR defaultWindowName[] = "Wintab Test";
+static const CHAR wintabTestWindowClassName[] = "WintabTestWnd";
+static const CHAR contextName[] = "TestContext";
+static const UINT X = 0;
+static const UINT Y = 0;
+static const UINT WIDTH = 200;
+static const UINT HEIGHT = 200;
+
+static HCTX (WINAPI *pWTOpenA)(HWND, LPLOGCONTEXTA, BOOL);
+static BOOL (WINAPI *pWTClose)(HCTX);
+
+static HMODULE load_functions(void)
+{
+#define GET_PROC(func) \
+ (p ## func = (void *)GetProcAddress(hWintab, #func))
+
+ HMODULE hWintab = LoadLibraryA(wintab32Dll);
+
+ if (!hWintab)
+ {
+ trace("LoadLibraryA(%s) failed\n",
+ wintab32Dll);
+ return NULL;
+ }
+
+ if (GET_PROC(WTOpenA) &&
+ GET_PROC(WTClose) )
+ {
+ return hWintab;
+ }
+ else
+ {
+ FreeLibrary(hWintab);
+ trace("Library loaded but failed to load function pointers\n");
+ return NULL;
+ }
+
+#undef GET_PROC
+}
+
+static LRESULT CALLBACK wintabTestWndProc(HWND hwnd, UINT msg, WPARAM wParam,
+ LPARAM lParam)
+{
+ return DefWindowProcA(hwnd, msg, wParam, lParam);
+}
+
+static void wintab_create_window(HWND* pHwnd)
+{
+ WNDCLASSA testWindowClass;
+
+ if (!pHwnd) return;
+
+ *pHwnd = NULL;
+
+ ZeroMemory(&testWindowClass, sizeof(testWindowClass));
+
+ testWindowClass.lpfnWndProc = (WNDPROC)wintabTestWndProc;
+ testWindowClass.hInstance = NULL;
+ testWindowClass.hIcon = NULL;
+ testWindowClass.hCursor = NULL;
+ testWindowClass.hbrBackground = NULL;
+ testWindowClass.lpszMenuName = NULL;
+ testWindowClass.lpszClassName = wintabTestWindowClassName;
+
+ assert(RegisterClassA(&testWindowClass));
+
+ *pHwnd = CreateWindowA(wintabTestWindowClassName, NULL,
+ WS_OVERLAPPED, X, Y, WIDTH, HEIGHT, NULL, NULL,
+ NULL, NULL);
+
+ assert(*pHwnd != NULL);
+}
+
+static void wintab_destroy_window(HWND hwnd)
+{
+ DestroyWindow(hwnd);
+ UnregisterClassA(wintabTestWindowClassName, NULL);
+}
+
+/* test how a logcontext is validated by wtopen */
+static void test_WTOpenContextValidation(void)
+{
+ HWND defaultWindow = NULL;
+ HCTX hCtx = NULL;
+ LOGCONTEXTA testLogCtx;
+ LOGCONTEXTA refLogCtx;
+ int memdiff;
+
+ wintab_create_window(&defaultWindow);
+
+ ZeroMemory(&testLogCtx, sizeof(testLogCtx));
+ strcpy(testLogCtx.lcName, contextName);
+
+ ZeroMemory(&refLogCtx, sizeof(refLogCtx));
+ strcpy(refLogCtx.lcName, contextName);
+
+ /* a zeroed out context has values which makes WTOpen return null
+ * on wacom tablets but not on uclogic tablets */
+ hCtx = pWTOpenA(defaultWindow, &testLogCtx, TRUE);
+
+ /* check if the context gets updated */
+ memdiff = memcmp(&testLogCtx, &refLogCtx, sizeof(LOGCONTEXTA));
+ ok(0 == memdiff, "Expected 0 == memcmp(testLogCtx, refLogCtx), got %i\n",
+ memdiff);
+
+ if (hCtx)
+ pWTClose(hCtx);
+
+ wintab_destroy_window(defaultWindow);
+}
+
+START_TEST(context)
+{
+ HMODULE hWintab = load_functions();
+
+ if (!hWintab)
+ {
+ skip("Wintab32.dll not available\n");
+ return;
+ }
+
+ test_WTOpenContextValidation();
+
+ FreeLibrary(hWintab);
+}