push a6a7df41ae272b3b1bf5fcfb544267c1e96afa99
[wine/hacks.git] / dlls / shdocvw / tests / shdocvw.c
blobf80a1112eb4ace1f4bd6688a4f24153b795a001d
1 /*
2 * Unit tests for misc shdocvw functions
4 * Copyright 2008 Detlef Riekenberg
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <stdarg.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winreg.h"
27 #include "wininet.h"
29 #include "wine/test.h"
31 /* ################ */
33 static HMODULE hshdocvw;
34 static HRESULT (WINAPI *pURLSubRegQueryA)(LPCSTR, LPCSTR, DWORD, LPVOID, DWORD, DWORD);
36 static CHAR appdata[] = "AppData";
37 static CHAR common_appdata[] = "Common AppData";
38 static CHAR default_page_url[] = "Default_Page_URL";
39 static CHAR does_not_exist[] = "does_not_exist";
40 static CHAR regpath_iemain[] = "Software\\Microsoft\\Internet Explorer\\Main";
41 static CHAR regpath_shellfolders[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
42 static CHAR start_page[] = "Start Page";
44 /* ################ */
46 static void init_functions(void)
48 hshdocvw = LoadLibraryA("shdocvw.dll");
49 pURLSubRegQueryA = (void *) GetProcAddress(hshdocvw, (LPSTR) 151);
52 /* ################ */
54 static void test_URLSubRegQueryA(void)
56 CHAR buffer[INTERNET_MAX_URL_LENGTH];
57 HRESULT hr;
58 DWORD used;
59 DWORD len;
61 if (!pURLSubRegQueryA) {
62 skip("URLSubRegQueryA not found\n");
63 return;
66 memset(buffer, '#', sizeof(buffer)-2);
67 buffer[sizeof(buffer)-1] = '\0';
68 /* called by inetcpl.cpl */
69 hr = pURLSubRegQueryA(regpath_iemain, default_page_url, REG_SZ, buffer, INTERNET_MAX_URL_LENGTH, -1);
70 ok(hr == E_FAIL || hr == S_OK, "got 0x%x (expected E_FAIL or S_OK)\n", hr);
72 memset(buffer, '#', sizeof(buffer)-2);
73 buffer[sizeof(buffer)-1] = '\0';
74 /* called by inetcpl.cpl */
75 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, buffer, INTERNET_MAX_URL_LENGTH, -1);
76 len = lstrlenA(buffer);
77 /* respect privacy: do not dump the url */
78 ok(hr == S_OK, "got 0x%x and %d (expected S_OK)\n", hr, len);
80 /* test buffer length: just large enough */
81 memset(buffer, '#', sizeof(buffer)-2);
82 buffer[sizeof(buffer)-1] = '\0';
83 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, buffer, len+1, -1);
84 used = lstrlenA(buffer);
85 /* respect privacy: do not dump the url */
86 ok((hr == S_OK) && (used == len),
87 "got 0x%x and %d (expected S_OK and %d)\n", hr, used, len);
89 /* no space for terminating 0: result is truncated */
90 memset(buffer, '#', sizeof(buffer)-2);
91 buffer[sizeof(buffer)-1] = '\0';
92 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, buffer, len, -1);
93 used = lstrlenA(buffer);
94 ok((hr == S_OK) && (used == len - 1),
95 "got 0x%x and %d (expected S_OK and %d)\n", hr, used, len - 1);
97 /* no space for the complete result: truncate another char */
98 if (len > 1) {
99 memset(buffer, '#', sizeof(buffer)-2);
100 buffer[sizeof(buffer)-1] = '\0';
101 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, buffer, len-1, -1);
102 used = lstrlenA(buffer);
103 ok((hr == S_OK) && (used == (len - 2)),
104 "got 0x%x and %d (expected S_OK and %d)\n", hr, used, len - 2);
107 /* only space for the terminating 0: function still succeded */
108 memset(buffer, '#', sizeof(buffer)-2);
109 buffer[sizeof(buffer)-1] = '\0';
110 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, buffer, 1, -1);
111 used = lstrlenA(buffer);
112 ok((hr == S_OK) && !used,
113 "got 0x%x and %d (expected S_OK and 0)\n", hr, used);
115 /* size of buffer is 0, but the function still succeed */
116 memset(buffer, '#', sizeof(buffer)-2);
117 buffer[sizeof(buffer)-1] = '\0';
118 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, buffer, 0, -1);
119 used = lstrlenA(buffer);
120 ok((hr == S_OK) && (used == INTERNET_MAX_URL_LENGTH - 1),
121 "got 0x%x and %d (expected S_OK and %d)\n", hr, used, INTERNET_MAX_URL_LENGTH-1);
123 /* still succeed without a buffer for the result */
124 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, NULL, 0, -1);
125 ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
127 /* still succeed, when a length is given without a buffer */
128 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_SZ, NULL, INTERNET_MAX_URL_LENGTH, -1);
129 ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
131 /* this value does not exist */
132 memset(buffer, '#', sizeof(buffer)-2);
133 buffer[sizeof(buffer)-1] = '\0';
134 hr = pURLSubRegQueryA(regpath_iemain, does_not_exist, REG_SZ, buffer, INTERNET_MAX_URL_LENGTH, -1);
135 /* random bytes are copied to the buffer */
136 ok((hr == E_FAIL), "got 0x%x (expected E_FAIL)\n", hr);
138 /* the third parameter is ignored. Is it really a type? (data is REG_SZ) */
139 memset(buffer, '#', sizeof(buffer)-2);
140 buffer[sizeof(buffer)-1] = '\0';
141 hr = pURLSubRegQueryA(regpath_iemain, start_page, REG_DWORD, buffer, INTERNET_MAX_URL_LENGTH, -1);
142 used = lstrlenA(buffer);
143 ok((hr == S_OK) && (used == len),
144 "got 0x%x and %d (expected S_OK and %d)\n", hr, used, len);
146 /* the function works for HKCU and HKLM */
147 memset(buffer, '#', sizeof(buffer)-2);
148 buffer[sizeof(buffer)-1] = '\0';
149 hr = pURLSubRegQueryA(regpath_shellfolders, appdata, REG_SZ, buffer, INTERNET_MAX_URL_LENGTH, -1);
150 used = lstrlenA(buffer);
151 ok(hr == S_OK, "got 0x%x and %d (expected S_OK)\n", hr, used);
153 memset(buffer, '#', sizeof(buffer)-2);
154 buffer[sizeof(buffer)-1] = '\0';
155 hr = pURLSubRegQueryA(regpath_shellfolders, common_appdata, REG_SZ, buffer, INTERNET_MAX_URL_LENGTH, -1);
156 used = lstrlenA(buffer);
157 ok(hr == S_OK, "got 0x%x and %d (expected S_OK)\n", hr, used);
159 /* todo: what does the last parameter mean? */
162 /* ################ */
164 START_TEST(shdocvw)
166 init_functions();
167 test_URLSubRegQueryA();