regedit/tests: Add missing ok() check after RegOpenKeyExA().
[wine.git] / programs / regedit / tests / regedit.c
blobb91df5af73438fc4f7c3c45a3a67b3f7b7471960
1 /*
2 * Copyright 2010 Andrew Eikum for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <windows.h>
21 #include "wine/test.h"
23 static BOOL supports_wchar;
25 #define lok ok_(__FILE__,line)
27 #define exec_import_str(c) r_exec_import_str(__LINE__, c)
28 static BOOL r_exec_import_str(unsigned line, const char *file_contents)
30 STARTUPINFOA si = {sizeof(STARTUPINFOA)};
31 PROCESS_INFORMATION pi;
32 HANDLE regfile;
33 DWORD written, dr;
34 BOOL br;
35 char cmd[] = "regedit /s test.reg";
37 regfile = CreateFileA("test.reg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
38 FILE_ATTRIBUTE_NORMAL, NULL);
39 lok(regfile != INVALID_HANDLE_VALUE, "Failed to create test.reg file\n");
40 if(regfile == INVALID_HANDLE_VALUE)
41 return FALSE;
43 br = WriteFile(regfile, file_contents, strlen(file_contents), &written,
44 NULL);
45 lok(br == TRUE, "WriteFile failed: %d\n", GetLastError());
47 CloseHandle(regfile);
49 if(!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
50 return FALSE;
52 dr = WaitForSingleObject(pi.hProcess, 10000);
53 if(dr == WAIT_TIMEOUT)
54 TerminateProcess(pi.hProcess, 1);
55 CloseHandle(pi.hThread);
56 CloseHandle(pi.hProcess);
58 br = DeleteFileA("test.reg");
59 lok(br == TRUE, "DeleteFileA failed: %d\n", GetLastError());
61 return (dr != WAIT_TIMEOUT);
64 #define exec_import_wstr(c) r_exec_import_wstr(__LINE__, c)
65 static BOOL r_exec_import_wstr(unsigned line, const WCHAR *file_contents)
67 STARTUPINFOA si = {sizeof(STARTUPINFOA)};
68 PROCESS_INFORMATION pi;
69 HANDLE regfile;
70 DWORD written, dr;
71 BOOL br;
72 char cmd[] = "regedit /s test.reg";
74 regfile = CreateFileA("test.reg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
75 FILE_ATTRIBUTE_NORMAL, NULL);
76 lok(regfile != INVALID_HANDLE_VALUE, "Failed to create test.reg file\n");
77 if(regfile == INVALID_HANDLE_VALUE)
78 return FALSE;
80 br = WriteFile(regfile, file_contents,
81 lstrlenW(file_contents) * sizeof(WCHAR), &written, NULL);
82 lok(br == TRUE, "WriteFile failed: %d\n", GetLastError());
84 CloseHandle(regfile);
86 if(!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
87 return FALSE;
89 dr = WaitForSingleObject(pi.hProcess, 10000);
90 if(dr == WAIT_TIMEOUT)
91 TerminateProcess(pi.hProcess, 1);
92 CloseHandle(pi.hThread);
93 CloseHandle(pi.hProcess);
95 br = DeleteFileA("test.reg");
96 lok(br == TRUE, "DeleteFileA failed: %d\n", GetLastError());
98 return (dr != WAIT_TIMEOUT);
101 #define TODO_REG_TYPE (0x0001u)
102 #define TODO_REG_SIZE (0x0002u)
103 #define TODO_REG_DATA (0x0004u)
105 /* verify_reg() adapted from programs/reg/tests/reg.c */
106 #define verify_reg(k,v,t,d,s,todo) verify_reg_(__LINE__,k,v,t,d,s,todo)
107 static void verify_reg_(unsigned line, HKEY hkey, const char *value,
108 DWORD exp_type, const void *exp_data, DWORD exp_size, DWORD todo)
110 DWORD type, size;
111 BYTE data[256];
112 LONG err;
114 size = sizeof(data);
115 memset(data, 0xdd, size);
116 err = RegQueryValueExA(hkey, value, NULL, &type, data, &size);
117 lok(err == ERROR_SUCCESS, "RegQueryValueEx failed: got %d\n", err);
118 if (err != ERROR_SUCCESS)
119 return;
121 todo_wine_if (todo & TODO_REG_TYPE)
122 lok(type == exp_type, "got wrong type %d, expected %d\n", type, exp_type);
123 todo_wine_if (todo & TODO_REG_SIZE)
124 lok(size == exp_size, "got wrong size %d, expected %d\n", size, exp_size);
125 todo_wine_if (todo & TODO_REG_DATA)
126 lok(memcmp(data, exp_data, size) == 0, "got wrong data\n");
129 #define verify_reg_wsz(k,n,e) r_verify_reg_wsz(__LINE__,k,n,e)
130 static void r_verify_reg_wsz(unsigned line, HKEY key, const char *value_name, const WCHAR *exp_value)
132 LONG lr;
133 DWORD fnd_type, fnd_len;
134 WCHAR fnd_value[1024], value_nameW[1024];
136 MultiByteToWideChar(CP_ACP, 0, value_name, -1, value_nameW,
137 sizeof(value_nameW)/sizeof(value_nameW[0]));
139 fnd_len = sizeof(fnd_value);
140 lr = RegQueryValueExW(key, value_nameW, NULL, &fnd_type, (BYTE*)fnd_value, &fnd_len);
141 lok(lr == ERROR_SUCCESS, "RegQueryValueExW failed: %d\n", lr);
142 if(lr != ERROR_SUCCESS)
143 return;
145 lok(fnd_type == REG_SZ, "Got wrong type: %d\n", fnd_type);
146 if(fnd_type != REG_SZ)
147 return;
148 lok(!lstrcmpW(exp_value, fnd_value),
149 "Strings differ: expected %s, got %s\n",
150 wine_dbgstr_w(exp_value), wine_dbgstr_w(fnd_value));
153 #define verify_reg_nonexist(k,n) r_verify_reg_nonexist(__LINE__,k,n)
154 static void r_verify_reg_nonexist(unsigned line, HKEY key, const char *value_name)
156 LONG lr;
157 DWORD fnd_type, fnd_len;
158 char fnd_value[32];
160 fnd_len = sizeof(fnd_value);
161 lr = RegQueryValueExA(key, value_name, NULL, &fnd_type, (BYTE*)fnd_value, &fnd_len);
162 lok(lr == ERROR_FILE_NOT_FOUND, "Reg value shouldn't exist: %s\n",
163 value_name);
166 #define KEY_BASE "Software\\Wine\\regedit_test"
168 static void test_basic_import(void)
170 HKEY hkey, subkey;
171 DWORD dword = 0x17;
172 char exp_binary[] = {0xAA,0xBB,0xCC,0x11};
173 WCHAR wide_test[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
174 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
175 'i','o','n',' ','5','.','0','0','\n','\n',
176 '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E',
177 'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
178 'r','e','g','e','d','i','t','_','t','e','s','t',']','\n',
179 '"','T','e','s','t','V','a','l','u','e','3','"','=','"',0x3041,'V','a',
180 'l','u','e','"','\n',0};
181 WCHAR wide_test_r[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
182 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
183 'i','o','n',' ','5','.','0','0','\r','\r',
184 '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E',
185 'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
186 'r','e','g','e','d','i','t','_','t','e','s','t',']','\r',
187 '"','T','e','s','t','V','a','l','u','e','5','"','=','"',0x3041,'V','a',
188 'l','u','e','"','\r',0};
189 WCHAR wide_exp[] = {0x3041,'V','a','l','u','e',0};
190 LONG lr;
192 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
193 ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND,
194 "RegDeleteKeyA failed: %d\n", lr);
196 exec_import_str("REGEDIT4\n\n"
197 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
198 "\"TestValue\"=\"AValue\"\n");
199 lr = RegOpenKeyExA(HKEY_CURRENT_USER, KEY_BASE, 0, KEY_READ, &hkey);
200 ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr);
201 verify_reg(hkey, "TestValue", REG_SZ, "AValue", 7, 0);
203 exec_import_str("REGEDIT4\r\n\r\n"
204 "[HKEY_CURRENT_USER\\" KEY_BASE "]\r\n"
205 "\"TestValue2\"=\"BValue\"\r\n");
206 verify_reg(hkey, "TestValue2", REG_SZ, "BValue", 7, 0);
208 if (supports_wchar)
210 exec_import_wstr(wide_test);
211 verify_reg_wsz(hkey, "TestValue3", wide_exp);
213 exec_import_wstr(wide_test_r);
214 verify_reg_wsz(hkey, "TestValue5", wide_exp);
216 else
217 win_skip("Some WCHAR tests skipped\n");
219 exec_import_str("REGEDIT4\r\r"
220 "[HKEY_CURRENT_USER\\" KEY_BASE "]\r"
221 "\"TestValue4\"=\"DValue\"\r");
222 verify_reg(hkey, "TestValue4", REG_SZ, "DValue", 7, 0);
224 exec_import_str("REGEDIT4\n\n"
225 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
226 "\"TestDword\"=dword:00000017\n");
227 verify_reg(hkey, "TestDword", REG_DWORD, &dword, sizeof(dword), 0);
229 exec_import_str("REGEDIT4\n\n"
230 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
231 "\"TestBinary\"=hex:aa,bb,cc,11\n");
232 verify_reg(hkey, "TestBinary", REG_BINARY, exp_binary, sizeof(exp_binary), 0);
234 exec_import_str("REGEDIT4\n\n"
235 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
236 "\"With=Equals\"=\"asdf\"\n");
237 verify_reg(hkey, "With=Equals", REG_SZ, "asdf", 5, 0);
239 exec_import_str("REGEDIT4\n\n"
240 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
241 "\"Line1\"=\"Value1\"\n\n"
242 "\"Line2\"=\"Value2\"\n\n\n"
243 "\"Line3\"=\"Value3\"\n\n\n\n"
244 "\"Line4\"=\"Value4\"\n\n");
245 verify_reg(hkey, "Line1", REG_SZ, "Value1", 7, 0);
246 verify_reg(hkey, "Line2", REG_SZ, "Value2", 7, 0);
247 verify_reg(hkey, "Line3", REG_SZ, "Value3", 7, 0);
248 verify_reg(hkey, "Line4", REG_SZ, "Value4", 7, 0);
250 exec_import_str("REGEDIT4\n\n"
251 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
252 "\"Wine1\"=dword:00000782\n\n"
253 "\"Wine2\"=\"Test Value\"\n"
254 "\"Wine3\"=hex(7):4c,69,6e,65,20,\\\n"
255 " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
256 "#comment\n"
257 "@=\"Test\"\n"
258 ";comment\n\n"
259 "\"Wine4\"=dword:12345678\n\n");
260 dword = 0x782;
261 verify_reg(hkey, "Wine1", REG_DWORD, &dword, sizeof(dword), 0);
262 verify_reg(hkey, "Wine2", REG_SZ, "Test Value", 11, 0);
263 verify_reg(hkey, "Wine3", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
264 verify_reg(hkey, "", REG_SZ, "Test", 5, 0);
265 dword = 0x12345678;
266 verify_reg(hkey, "Wine4", REG_DWORD, &dword, sizeof(dword), 0);
268 exec_import_str("REGEDIT4\n\n"
269 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
270 "\"Wine5\"=\"No newline\"");
271 todo_wine verify_reg(hkey, "Wine5", REG_SZ, "No newline", 11, 0);
273 exec_import_str("REGEDIT4\n\n"
274 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
275 "\"Wine6\"=dword:00000050\n\n"
276 "\"Wine7\"=\"No newline\"");
277 dword = 0x50;
278 verify_reg(hkey, "Wine6", REG_DWORD, &dword, sizeof(dword), 0);
279 todo_wine verify_reg(hkey, "Wine7", REG_SZ, "No newline", 11, 0);
281 exec_import_str("REGEDIT4\n\n"
282 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
283 "\"double\\\"quote\"=\"valid \\\"or\\\" not\"\n"
284 "\"single'quote\"=dword:00000008\n\n");
285 verify_reg(hkey, "double\"quote", REG_SZ, "valid \"or\" not", 15, 0);
286 dword = 0x00000008;
287 verify_reg(hkey, "single'quote", REG_DWORD, &dword, sizeof(dword), 0);
289 exec_import_str("REGEDIT4\n\n"
290 "[HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey\"1]\n"
291 "\"Wine\\\\31\"=\"Test value\"\n\n");
292 lr = RegOpenKeyExA(hkey, "Subkey\"1", 0, KEY_READ, &subkey);
293 ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
294 verify_reg(subkey, "Wine\\31", REG_SZ, "Test value", 11, 0);
295 lr = RegCloseKey(subkey);
296 ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
297 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE "\\Subkey\"1");
298 ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
300 exec_import_str("REGEDIT4\n\n"
301 "[HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey/2]\n"
302 "\"123/\\\"4;'5\"=\"Random value name\"\n\n");
303 lr = RegOpenKeyExA(hkey, "Subkey/2", 0, KEY_READ, &subkey);
304 ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
305 verify_reg(subkey, "123/\"4;'5", REG_SZ, "Random value name", 18, 0);
306 lr = RegCloseKey(subkey);
307 ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
308 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE "\\Subkey/2");
309 ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
311 RegCloseKey(hkey);
313 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
314 ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
317 static void test_basic_import_31(void)
319 HKEY hkey;
320 LONG lr;
322 lr = RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
323 ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND,
324 "RegDeleteKeyA failed: %d\n", lr);
326 /* Test simple value */
327 exec_import_str("REGEDIT\r\n"
328 "HKEY_CLASSES_ROOT\\" KEY_BASE " = Value0\r\n");
329 lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, KEY_BASE, 0, KEY_READ, &hkey);
330 ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr);
331 verify_reg(hkey, "", REG_SZ, "Value0", 7, 0);
333 /* Test proper handling of spaces and equals signs */
334 exec_import_str("REGEDIT\r\n"
335 "HKEY_CLASSES_ROOT\\" KEY_BASE " =Value1\r\n");
336 verify_reg(hkey, "", REG_SZ, "Value1", 7, 0);
338 exec_import_str("REGEDIT\r\n"
339 "HKEY_CLASSES_ROOT\\" KEY_BASE " = Value2\r\n");
340 verify_reg(hkey, "", REG_SZ, " Value2", 8, 0);
342 exec_import_str("REGEDIT\r\n"
343 "HKEY_CLASSES_ROOT\\" KEY_BASE " = Value3 \r\n");
344 verify_reg(hkey, "", REG_SZ, "Value3 ", 8, 0);
346 exec_import_str("REGEDIT\r\n"
347 "HKEY_CLASSES_ROOT\\" KEY_BASE " Value4\r\n");
348 verify_reg(hkey, "", REG_SZ, "Value4", 7, 0);
350 exec_import_str("REGEDIT\r\n"
351 "HKEY_CLASSES_ROOT\\" KEY_BASE " Value5\r\n");
352 verify_reg(hkey, "", REG_SZ, "Value5", 7, 0);
354 exec_import_str("REGEDIT\r\n"
355 "HKEY_CLASSES_ROOT\\" KEY_BASE "\r\n");
356 verify_reg(hkey, "", REG_SZ, "", 1, 0);
358 exec_import_str("REGEDIT\r\n"
359 "HKEY_CLASSES_ROOT\\" KEY_BASE " \r\n");
360 verify_reg(hkey, "", REG_SZ, "", 1, 0);
362 exec_import_str("REGEDIT\r\n"
363 "HKEY_CLASSES_ROOT\\" KEY_BASE " = No newline");
364 verify_reg(hkey, "", REG_SZ, "No newline", 11, TODO_REG_SIZE | TODO_REG_DATA);
366 RegCloseKey(hkey);
368 lr = RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
369 ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
372 static void test_invalid_import(void)
374 LONG lr;
375 HKEY hkey;
377 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
378 ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND, "RegDeleteKeyA failed: %d\n", lr);
380 exec_import_str("REGEDIT4\n\n"
381 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
382 "\"TestNoEndQuote\"=\"Asdffdsa\n");
383 lr = RegOpenKeyExA(HKEY_CURRENT_USER, KEY_BASE, 0, KEY_READ, &hkey);
384 ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr);
385 verify_reg_nonexist(hkey, "TestNoEndQuote");
387 exec_import_str("REGEDIT4\n\n"
388 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
389 "\"TestNoBeginQuote\"=Asdffdsa\"\n");
390 verify_reg_nonexist(hkey, "TestNoBeginQuote");
392 exec_import_str("REGEDIT4\n\n"
393 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
394 "\"TestNoQuotes\"=Asdffdsa\n");
395 verify_reg_nonexist(hkey, "TestNoQuotes");
397 exec_import_str("REGEDIT4\n\n"
398 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
399 "\"NameNoEndQuote=\"Asdffdsa\"\n");
400 verify_reg_nonexist(hkey, "NameNoEndQuote");
402 exec_import_str("REGEDIT4\n\n"
403 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
404 "NameNoBeginQuote\"=\"Asdffdsa\"\n");
405 verify_reg_nonexist(hkey, "NameNoBeginQuote");
407 exec_import_str("REGEDIT4\n\n"
408 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
409 "NameNoQuotes=\"Asdffdsa\"\n");
410 verify_reg_nonexist(hkey, "NameNoQuotes");
412 exec_import_str("REGEDIT4\n\n"
413 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
414 "\"MixedQuotes=Asdffdsa\"\n");
415 verify_reg_nonexist(hkey, "MixedQuotes");
416 verify_reg_nonexist(hkey, "MixedQuotes=Asdffdsa");
418 /* Test import with non-standard registry file headers */
419 exec_import_str("REGEDIT3\n\n"
420 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
421 "\"Test1\"=\"Value\"\n");
422 verify_reg_nonexist(hkey, "Test1");
424 exec_import_str("regedit4\n\n"
425 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
426 "\"Test2\"=\"Value\"\n");
427 verify_reg_nonexist(hkey, "Test2");
429 exec_import_str("Regedit4\n\n"
430 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
431 "\"Test3\"=\"Value\"\n");
432 verify_reg_nonexist(hkey, "Test3");
434 exec_import_str("REGEDIT 4\n\n"
435 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
436 "\"Test4\"=\"Value\"\n");
437 verify_reg_nonexist(hkey, "Test4");
439 exec_import_str("REGEDIT4FOO\n\n"
440 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
441 "\"Test5\"=\"Value\"\n");
442 verify_reg_nonexist(hkey, "Test5");
444 exec_import_str("REGEDIT4 FOO\n\n"
445 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
446 "\"Test6\"=\"Value\"\n");
447 verify_reg_nonexist(hkey, "Test6");
449 exec_import_str("REGEDIT5\n\n"
450 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
451 "\"Test7\"=\"Value\"\n");
452 verify_reg_nonexist(hkey, "Test7");
454 exec_import_str("Windows Registry Editor Version 4.00\n\n"
455 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
456 "\"Test8\"=\"Value\"\n");
457 verify_reg_nonexist(hkey, "Test8");
459 exec_import_str("Windows Registry Editor Version 5\n\n"
460 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
461 "\"Test9\"=\"Value\"\n");
462 verify_reg_nonexist(hkey, "Test9");
464 exec_import_str("WINDOWS REGISTRY EDITOR VERSION 5.00\n\n"
465 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
466 "\"Test10\"=\"Value\"\n");
467 verify_reg_nonexist(hkey, "Test10");
469 exec_import_str("Windows Registry Editor version 5.00\n\n"
470 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
471 "\"Test11\"=\"Value\"\n");
472 verify_reg_nonexist(hkey, "Test11");
474 /* Test multi-line import with incorrect comma placement */
475 exec_import_str("REGEDIT4\n\n"
476 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
477 "\"Multi-Line1\"=hex(7):4c,69,6e,65,20\\\n"
478 ",63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
479 todo_wine verify_reg_nonexist(hkey, "Multi-Line1");
481 exec_import_str("REGEDIT4\n\n"
482 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
483 "\"Multi-Line2\"=hex(7):4c,69,6e,65,20\\\n"
484 " ,63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
485 verify_reg_nonexist(hkey, "Multi-Line2");
487 exec_import_str("Windows Registry Editor Version 5.00\n\n"
488 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
489 "\"Multi-Line3\"=hex(7):4c,69,6e,65,20\\\n"
490 ",63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
491 todo_wine verify_reg_nonexist(hkey, "Multi-Line3");
493 exec_import_str("Windows Registry Editor Version 5.00\n\n"
494 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
495 "\"Multi-Line4\"=hex(7):4c,69,6e,65,20\\\n"
496 " ,63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
497 verify_reg_nonexist(hkey, "Multi-Line4");
499 RegCloseKey(hkey);
501 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
502 ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
505 static void test_comments(void)
507 LONG lr;
508 HKEY hkey;
509 DWORD dword;
511 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
512 ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND, "RegDeleteKeyA failed: %d\n", lr);
514 exec_import_str("REGEDIT4\n\n"
515 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
516 "#comment\\\n"
517 "\"Wine1\"=\"Line 1\"\n"
518 ";comment\\\n"
519 "\"Wine2\"=\"Line 2\"\n\n");
520 lr = RegOpenKeyExA(HKEY_CURRENT_USER, KEY_BASE, 0, KEY_READ, &hkey);
521 ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr);
522 verify_reg(hkey, "Wine1", REG_SZ, "Line 1", 7, 0);
523 verify_reg(hkey, "Wine2", REG_SZ, "Line 2", 7, 0);
525 exec_import_str("REGEDIT4\n\n"
526 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
527 "\"Wine3\"=\"Value 1\"#comment\n"
528 "\"Wine4\"=\"Value 2\";comment\n"
529 "\"Wine5\"=dword:01020304 #comment\n"
530 "\"Wine6\"=dword:02040608 ;comment\n\n");
531 verify_reg_nonexist(hkey, "Wine3");
532 todo_wine verify_reg(hkey, "Wine4", REG_SZ, "Value 2", 8, 0);
533 verify_reg_nonexist(hkey, "Wine5");
534 dword = 0x2040608;
535 todo_wine verify_reg(hkey, "Wine6", REG_DWORD, &dword, sizeof(dword), 0);
537 exec_import_str("REGEDIT4\n\n"
538 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
539 "\"Wine7\"=hex(7):4c,69,6e,65,20,\\\n"
540 " #comment\n"
541 " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
542 "\"Wine8\"=\"A valid line\"\n"
543 "\"Wine9\"=hex(7):4c,69,6e,65,20,\\\n"
544 " ;comment\n"
545 " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
546 "\"Wine10\"=\"Another valid line\"\n\n");
547 verify_reg_nonexist(hkey, "Wine7");
548 verify_reg(hkey, "Wine8", REG_SZ, "A valid line", 13, 0);
549 todo_wine verify_reg(hkey, "Wine9", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
550 verify_reg(hkey, "Wine10", REG_SZ, "Another valid line", 19, 0);
552 exec_import_str("REGEDIT4\n\n"
553 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
554 "#\"Comment1\"=\"Value 1\"\n"
555 ";\"Comment2\"=\"Value 2\"\n"
556 " #\"Comment3\"=\"Value 3\"\n"
557 " ;\"Comment4\"=\"Value 4\"\n"
558 "\"Wine11\"=\"Value 6\"#\"Comment5\"=\"Value 5\"\n"
559 "\"Wine12\"=\"Value 7\";\"Comment6\"=\"Value 6\"\n\n");
560 verify_reg_nonexist(hkey, "Comment1");
561 verify_reg_nonexist(hkey, "Comment2");
562 verify_reg_nonexist(hkey, "Comment3");
563 verify_reg_nonexist(hkey, "Comment4");
564 todo_wine verify_reg_nonexist(hkey, "Wine11");
565 verify_reg_nonexist(hkey, "Comment5");
566 verify_reg(hkey, "Wine12", REG_SZ, "Value 7", 8, TODO_REG_SIZE|TODO_REG_DATA);
567 verify_reg_nonexist(hkey, "Comment6");
569 exec_import_str("REGEDIT4\n\n"
570 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
571 "\"Wine13\"=#\"Value 8\"\n"
572 "\"Wine14\"=;\"Value 9\"\n"
573 "\"Wine15\"=\"#comment1\"\n"
574 "\"Wine16\"=\";comment2\"\n"
575 "\"Wine17\"=\"Value#comment3\"\n"
576 "\"Wine18\"=\"Value;comment4\"\n"
577 "\"Wine19\"=\"Value #comment5\"\n"
578 "\"Wine20\"=\"Value ;comment6\"\n"
579 "\"Wine21\"=#dword:00000001\n"
580 "\"Wine22\"=;dword:00000002\n"
581 "\"Wine23\"=dword:00000003#comment\n"
582 "\"Wine24\"=dword:00000004;comment\n\n");
583 verify_reg_nonexist(hkey, "Wine13");
584 verify_reg_nonexist(hkey, "Wine14");
585 verify_reg(hkey, "Wine15", REG_SZ, "#comment1", 10, 0);
586 verify_reg(hkey, "Wine16", REG_SZ, ";comment2", 10, 0);
587 verify_reg(hkey, "Wine17", REG_SZ, "Value#comment3", 15, 0);
588 verify_reg(hkey, "Wine18", REG_SZ, "Value;comment4", 15, 0);
589 verify_reg(hkey, "Wine19", REG_SZ, "Value #comment5", 16, 0);
590 verify_reg(hkey, "Wine20", REG_SZ, "Value ;comment6", 16, 0);
591 verify_reg_nonexist(hkey, "Wine21");
592 verify_reg_nonexist(hkey, "Wine22");
593 verify_reg_nonexist(hkey, "Wine23");
594 dword = 0x00000004;
595 todo_wine verify_reg(hkey, "Wine24", REG_DWORD, &dword, sizeof(dword), 0);
597 exec_import_str("REGEDIT4\n\n"
598 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
599 "\"Multi-Line1\"=hex(7):4c,69,6e,65,20,\\\n"
600 " 63,6f,6e,\\;comment\n"
601 " 63,61,74,\\;comment\n"
602 " 65,6e,61,74,69,6f,6e,00,00\n\n");
603 todo_wine verify_reg(hkey, "Multi-Line1", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
605 exec_import_str("REGEDIT4\n\n"
606 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
607 "\"Multi-Line2\"=hex(7):4c,69,6e,65,20,\\\n"
608 " 63,6f,6e,\\;comment\n"
609 " 63,61,74,;comment\n"
610 " 65,6e,61,74,69,6f,6e,00,00\n\n");
611 todo_wine verify_reg(hkey, "Multi-Line2", REG_MULTI_SZ, "Line concat", 12, 0);
613 RegCloseKey(hkey);
615 lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
616 ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
619 START_TEST(regedit)
621 WCHAR wchar_test[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
622 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
623 'i','o','n',' ','5','.','0','0','\n','\n',0};
625 if(!exec_import_str("REGEDIT4\r\n\r\n")){
626 win_skip("regedit not available, skipping regedit tests\n");
627 return;
630 supports_wchar = exec_import_wstr(wchar_test);
632 test_basic_import();
633 test_basic_import_31();
634 test_invalid_import();
635 test_comments();