[MSI_WINETEST] Sync with Wine 3.0. CORE-14225
[reactos.git] / modules / rostests / winetests / msi / format.c
1 /*
2 * Copyright (C) 2005 Mike McCormack for CodeWeavers
3 * Copyright (C) 2005 Aric Stewart for CodeWeavers
4 *
5 * A test program for MSI record formatting
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22 #include "precomp.h"
23
24 static const char msifile[] = "winetest-format.msi";
25
26 static UINT package_from_db(MSIHANDLE hdb, MSIHANDLE *handle)
27 {
28 UINT res;
29 CHAR szPackage[12];
30 MSIHANDLE hPackage;
31
32 sprintf(szPackage, "#%u", hdb);
33 res = MsiOpenPackageA(szPackage, &hPackage);
34 if (res != ERROR_SUCCESS)
35 return res;
36
37 res = MsiCloseHandle(hdb);
38 if (res != ERROR_SUCCESS)
39 {
40 MsiCloseHandle(hPackage);
41 return res;
42 }
43
44 *handle = hPackage;
45 return ERROR_SUCCESS;
46 }
47
48 static UINT helper_createpackage( const char *szName, MSIHANDLE *handle )
49 {
50 MSIHANDLE hPackage, suminfo, hdb = 0;
51 UINT res;
52 WCHAR *nameW;
53 int len;
54
55 DeleteFileA(szName);
56
57 len = MultiByteToWideChar( CP_ACP, 0, szName, -1, NULL, 0 );
58 if (!(nameW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
59 return ERROR_OUTOFMEMORY;
60 MultiByteToWideChar( CP_ACP, 0, szName, -1, nameW, len );
61
62 /* create an empty database */
63 res = MsiOpenDatabaseW( nameW, MSIDBOPEN_CREATEDIRECT, &hdb );
64 HeapFree( GetProcessHeap(), 0, nameW );
65 ok( res == ERROR_SUCCESS , "Failed to create database %u\n", res );
66 if (res != ERROR_SUCCESS)
67 return res;
68
69 res = MsiDatabaseCommit( hdb );
70 ok( res == ERROR_SUCCESS , "Failed to commit database %u\n", res );
71
72 /* build summary info */
73 res = MsiGetSummaryInformationA(hdb, NULL, 7, &suminfo);
74 ok( res == ERROR_SUCCESS , "Failed to open summaryinfo\n" );
75
76 res = MsiSummaryInfoSetPropertyA(suminfo,2, VT_LPSTR, 0,NULL,
77 "Installation Database");
78 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
79
80 res = MsiSummaryInfoSetPropertyA(suminfo,3, VT_LPSTR, 0,NULL,
81 "Installation Database");
82 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
83
84 res = MsiSummaryInfoSetPropertyA(suminfo,4, VT_LPSTR, 0,NULL,
85 "Wine Hackers");
86 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
87
88 res = MsiSummaryInfoSetPropertyA(suminfo,7, VT_LPSTR, 0,NULL,
89 ";1033");
90 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
91
92 res = MsiSummaryInfoSetPropertyA(suminfo,9, VT_LPSTR, 0,NULL,
93 "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}");
94 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
95
96 res = MsiSummaryInfoSetPropertyA(suminfo, 14, VT_I4, 100, NULL, NULL);
97 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
98
99 res = MsiSummaryInfoSetPropertyA(suminfo, 15, VT_I4, 0, NULL, NULL);
100 ok( res == ERROR_SUCCESS , "Failed to set summary info\n" );
101
102 res = MsiSummaryInfoPersist(suminfo);
103 ok( res == ERROR_SUCCESS , "Failed to make summary info persist\n" );
104
105 res = MsiCloseHandle( suminfo);
106 ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" );
107
108 res = package_from_db( hdb, &hPackage );
109 MsiCloseHandle(hdb);
110
111 if (res != ERROR_SUCCESS)
112 DeleteFileA( szName );
113 else
114 *handle = hPackage;
115
116 return res;
117 }
118
119 static void test_createpackage(void)
120 {
121 MSIHANDLE hPackage = 0;
122 UINT res;
123
124 res = helper_createpackage( msifile, &hPackage );
125 if (res == ERROR_INSTALL_PACKAGE_REJECTED)
126 {
127 skip("Not enough rights to perform tests\n");
128 return;
129 }
130 ok( res == ERROR_SUCCESS, "Failed to create package %u\n", res );
131
132 res = MsiCloseHandle( hPackage );
133 ok( res == ERROR_SUCCESS , "Failed to close package %u\n", res );
134
135 DeleteFileA( msifile );
136 }
137
138 static void test_formatrecord(void)
139 {
140 char buffer[100];
141 MSIHANDLE hrec;
142 UINT r;
143 DWORD sz;
144
145 r = MsiFormatRecordA(0, 0, NULL, NULL );
146 ok( r == ERROR_INVALID_HANDLE, "wrong error\n");
147
148 hrec = MsiCreateRecord(0);
149 ok( hrec, "failed to create record\n");
150
151 /* format an empty record on a record with no parameters */
152 sz = sizeof(buffer);
153 r = MsiFormatRecordA(0, hrec, buffer, &sz );
154 ok( r == ERROR_SUCCESS, "format failed\n");
155 ok( sz == 0, "size wrong\n");
156
157 MsiCloseHandle( hrec );
158
159 hrec = MsiCreateRecord(4);
160 ok( hrec, "failed to create record\n");
161
162 /* format an empty record */
163 r = MsiFormatRecordA(0, hrec, NULL, NULL );
164 ok( r == ERROR_SUCCESS, "format failed\n");
165 buffer[0] = 'x';
166 buffer[1] = 0;
167 sz=0;
168 r = MsiFormatRecordA(0, hrec, buffer+1, &sz);
169 ok( r == ERROR_MORE_DATA && buffer[0] == 'x', "format failed measuring with buffer\n");
170 ok( sz == 16, "size wrong\n");
171 sz=100;
172 r = MsiFormatRecordA(0, hrec, buffer, &sz);
173 ok( r == ERROR_SUCCESS, "format failed with empty buffer\n");
174 ok( sz == 16, "size wrong\n");
175 ok( 0 == strcmp(buffer,"1: 2: 3: 4: "), "wrong output\n");
176
177 r = MsiCloseHandle(hrec);
178 ok(r==ERROR_SUCCESS, "Unable to close record\n");
179
180 hrec = MsiCreateRecord(6);
181 ok( hrec, "failed to create record\n");
182
183 sz = 100;
184 buffer[0] = 'x';
185 buffer[1] = 0;
186 r = MsiFormatRecordA(0, hrec, buffer, &sz);
187 ok( r == ERROR_SUCCESS, "format failed with empty buffer\n");
188 ok( sz == 24, "size wrong\n");
189 ok( 0 == strcmp(buffer,"1: 2: 3: 4: 5: 6: "), "wrong output\n");
190
191
192 /* format a format string with everything else empty */
193 r = MsiRecordSetStringA(hrec, 0, "%1");
194 ok( r == ERROR_SUCCESS, "set string failed\n");
195 r = MsiFormatRecordA(0, hrec, NULL, NULL );
196 ok( r == ERROR_SUCCESS, "format failed\n");
197 r = MsiFormatRecordA(0, hrec, buffer, NULL);
198 ok( r == ERROR_INVALID_PARAMETER, "wrong error\n");
199
200 sz = 123;
201 r = MsiFormatRecordA(0, hrec, NULL, &sz);
202 ok( r == ERROR_SUCCESS, "format failed with empty buffer\n");
203 ok( sz == 2, "size wrong (%i)\n",sz);
204 sz = sizeof buffer;
205 buffer[0] = 'x';
206 buffer[1] = 0;
207 r = MsiFormatRecordA(0, hrec, buffer, &sz);
208 ok( r == ERROR_SUCCESS, "format failed with empty buffer\n");
209 ok( sz == 2, "size wrong\n");
210 ok( 0 == strcmp(buffer,"%1"), "wrong output\n");
211
212 /* make the buffer too small */
213 sz = 0;
214 buffer[0] = 'x';
215 buffer[1] = 0;
216 r = MsiFormatRecordA(0, hrec, buffer, &sz);
217 ok( r == ERROR_MORE_DATA, "format failed with empty buffer\n");
218 ok( sz == 2, "size wrong\n");
219 ok( 0 == strcmp(buffer,"x"), "wrong output\n");
220
221 /* make the buffer a little bit bigger */
222 sz = 1;
223 buffer[0] = 'x';
224 buffer[1] = 0;
225 r = MsiFormatRecordA(0, hrec, buffer, &sz);
226 ok( r == ERROR_MORE_DATA, "format failed with empty buffer\n");
227 ok( sz == 2, "size wrong\n");
228 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
229
230 /* and again */
231 sz = 2;
232 buffer[0] = 'x';
233 buffer[1] = 0;
234 r = MsiFormatRecordA(0, hrec, buffer, &sz);
235 ok( r == ERROR_MORE_DATA, "format failed with empty buffer\n");
236 ok( sz == 2, "size wrong\n");
237 ok( 0 == strcmp(buffer,"%"), "wrong output\n");
238
239 /* and again */
240 sz = 3;
241 buffer[0] = 'x';
242 buffer[1] = 0;
243 r = MsiFormatRecordA(0, hrec, buffer, &sz);
244 ok( r == ERROR_SUCCESS, "format failed with empty buffer\n");
245 ok( sz == 2, "size wrong\n");
246 ok( 0 == strcmp(buffer,"%1"), "wrong output\n");
247
248 /* now try a real format string */
249 r = MsiRecordSetStringA(hrec, 0, "[1]");
250 ok( r == ERROR_SUCCESS, "set string failed\n");
251 sz = sizeof buffer;
252 r = MsiFormatRecordA(0, hrec, buffer, &sz);
253 ok( r == ERROR_SUCCESS, "format failed\n");
254 ok( sz == 0, "size wrong\n");
255 ok( 0 == strcmp(buffer,""), "wrong output\n");
256
257 /* now put something in the first field */
258 r = MsiRecordSetStringA(hrec, 1, "boo hoo");
259 ok( r == ERROR_SUCCESS, "set string failed\n");
260 sz = sizeof buffer;
261 r = MsiFormatRecordA(0, hrec, buffer, &sz);
262 ok( r == ERROR_SUCCESS, "format failed\n");
263 ok( sz == 7, "size wrong\n");
264 ok( 0 == strcmp(buffer,"boo hoo"), "wrong output\n");
265
266 /* now put something in the first field */
267 r = MsiRecordSetStringA(hrec, 0, "[1] [2]");
268 ok( r == ERROR_SUCCESS, "set string failed\n");
269 r = MsiRecordSetStringA(hrec, 1, "boo");
270 ok( r == ERROR_SUCCESS, "set string failed\n");
271 r = MsiRecordSetStringA(hrec, 2, "hoo");
272 ok( r == ERROR_SUCCESS, "set string failed\n");
273 sz = sizeof buffer;
274 r = MsiFormatRecordA(0, hrec, buffer, &sz);
275 ok( r == ERROR_SUCCESS, "format failed\n");
276 ok( sz == 7, "size wrong\n");
277 ok( 0 == strcmp(buffer,"boo hoo"), "wrong output\n");
278
279 /* self-referential format field */
280 r = MsiRecordSetStringA(hrec, 0, "[1] test [0]");
281 ok( r == ERROR_SUCCESS, "set string failed\n");
282 sz = sizeof buffer;
283 r = MsiFormatRecordA(0, hrec, buffer, &sz);
284 ok( r == ERROR_SUCCESS, "format failed\n");
285 ok( sz == 21, "size wrong\n");
286 ok( 0 == strcmp(buffer,"boo test [1] test [0]"), "wrong output\n");
287
288 /* empty string */
289 r = MsiRecordSetStringA(hrec, 0, "");
290 ok( r == ERROR_SUCCESS, "set string failed\n");
291 sz = sizeof buffer;
292 r = MsiFormatRecordA(0, hrec, buffer, &sz);
293 ok( r == ERROR_SUCCESS, "format failed\n");
294 ok( sz == 30, "size wrong %i\n",sz);
295 ok( 0 == strcmp(buffer,"1: boo 2: hoo 3: 4: 5: 6: "),
296 "wrong output(%s)\n",buffer);
297
298 /* empty string with numbers */
299 r = MsiRecordSetStringA(hrec, 1, "123");
300 ok( r == ERROR_SUCCESS, "set string failed\n");
301 r = MsiRecordSetInteger(hrec, 2, 4567);
302 ok( r == ERROR_SUCCESS, "set string failed\n");
303 sz = sizeof buffer;
304 r = MsiFormatRecordA(0, hrec, buffer, &sz);
305 ok( r == ERROR_SUCCESS, "format failed\n");
306 ok( sz == 31, "size wrong %i\n",sz);
307 ok( 0 == strcmp(buffer,"1: 123 2: 4567 3: 4: 5: 6: "),
308 "wrong output(%s)\n",buffer);
309
310 /* play games with recursive lookups */
311 r = MsiRecordSetStringA(hrec, 0, "[[1]] [2]");
312 ok( r == ERROR_SUCCESS, "set string failed\n");
313 r = MsiRecordSetStringA(hrec, 1, "2");
314 ok( r == ERROR_SUCCESS, "set string failed\n");
315 r = MsiRecordSetStringA(hrec, 2, "hey");
316 ok( r == ERROR_SUCCESS, "set string failed\n");
317 sz = sizeof buffer;
318 r = MsiFormatRecordA(0, hrec, buffer, &sz);
319 ok( r == ERROR_SUCCESS, "format failed\n");
320 ok( sz == 7, "size wrong,(%i)\n",sz);
321 ok( 0 == strcmp(buffer,"hey hey"), "wrong output (%s)\n",buffer);
322
323 r = MsiRecordSetStringA(hrec, 0, "[[1]] [2]");
324 ok( r == ERROR_SUCCESS, "set string failed\n");
325 r = MsiRecordSetStringA(hrec, 1, "[2]");
326 ok( r == ERROR_SUCCESS, "set string failed\n");
327 r = MsiRecordSetStringA(hrec, 2, "hey");
328 ok( r == ERROR_SUCCESS, "set string failed\n");
329 sz = sizeof buffer;
330 r = MsiFormatRecordA(0, hrec, buffer, &sz);
331 ok( r == ERROR_SUCCESS, "format failed\n");
332 ok( sz == 9, "size wrong,(%i)\n",sz);
333 ok( 0 == strcmp(buffer,"[[2]] hey"), "wrong output (%s)\n",buffer);
334
335 r = MsiRecordSetStringA(hrec, 0, "[[[3]]] [2]");
336 ok( r == ERROR_SUCCESS, "set string failed\n");
337 r = MsiRecordSetStringA(hrec, 1, "2");
338 ok( r == ERROR_SUCCESS, "set string failed\n");
339 r = MsiRecordSetStringA(hrec, 2, "hey");
340 ok( r == ERROR_SUCCESS, "set string failed\n");
341 r = MsiRecordSetStringA(hrec, 3, "1");
342 ok( r == ERROR_SUCCESS, "set string failed\n");
343 sz = sizeof buffer;
344 r = MsiFormatRecordA(0, hrec, buffer, &sz);
345 ok( r == ERROR_SUCCESS, "format failed\n");
346 ok( sz == 7, "size wrong,(%i)\n",sz);
347 ok( 0 == strcmp(buffer,"hey hey"), "wrong output (%s)\n",buffer);
348
349 r = MsiCloseHandle(hrec);
350 ok(r==ERROR_SUCCESS, "Unable to close record\n");
351 hrec = MsiCreateRecord(12);
352 ok( hrec, "failed to create record\n");
353
354 r = MsiRecordSetStringA(hrec, 0, "[[3][1]] [2]");
355 ok( r == ERROR_SUCCESS, "set string failed\n");
356 r = MsiRecordSetStringA(hrec, 1, "2");
357 ok( r == ERROR_SUCCESS, "set string failed\n");
358 r = MsiRecordSetStringA(hrec, 2, "hey");
359 ok( r == ERROR_SUCCESS, "set string failed\n");
360 r = MsiRecordSetStringA(hrec, 3, "1");
361 ok( r == ERROR_SUCCESS, "set string failed\n");
362 r = MsiRecordSetStringA(hrec, 12, "big");
363 ok( r == ERROR_SUCCESS, "set string failed\n");
364 sz = sizeof buffer;
365 r = MsiFormatRecordA(0, hrec, buffer, &sz);
366 ok( r == ERROR_SUCCESS, "format failed\n");
367 ok( sz == 7, "size wrong,(%i)\n",sz);
368 ok( 0 == strcmp(buffer,"big hey"), "wrong output (%s)\n",buffer);
369
370 r = MsiRecordSetStringA(hrec, 0, "[[3][4][1]] [2]");
371 ok( r == ERROR_SUCCESS, "set string failed\n");
372 r = MsiRecordSetStringA(hrec, 1, "2");
373 ok( r == ERROR_SUCCESS, "set string failed\n");
374 r = MsiRecordSetStringA(hrec, 2, "hey");
375 ok( r == ERROR_SUCCESS, "set string failed\n");
376 r = MsiRecordSetStringA(hrec, 3, "1");
377 ok( r == ERROR_SUCCESS, "set string failed\n");
378 r = MsiRecordSetStringA(hrec, 4, NULL);
379 ok( r == ERROR_SUCCESS, "set string failed\n");
380 r = MsiRecordSetStringA(hrec, 12, "big");
381 ok( r == ERROR_SUCCESS, "set string failed\n");
382 sz = sizeof buffer;
383 r = MsiFormatRecordA(0, hrec, buffer, &sz);
384 ok( r == ERROR_SUCCESS, "format failed\n");
385 ok( sz == 7, "size wrong,(%i)\n",sz);
386 ok( 0 == strcmp(buffer,"big hey"), "wrong output (%s)\n",buffer);
387
388 r = MsiRecordSetStringA(hrec, 0, "[[3][[4]][1]] [2]");
389 ok( r == ERROR_SUCCESS, "set string failed\n");
390 r = MsiRecordSetStringA(hrec, 1, "2");
391 ok( r == ERROR_SUCCESS, "set string failed\n");
392 r = MsiRecordSetStringA(hrec, 2, "hey");
393 ok( r == ERROR_SUCCESS, "set string failed\n");
394 r = MsiRecordSetStringA(hrec, 3, "1");
395 ok( r == ERROR_SUCCESS, "set string failed\n");
396 r = MsiRecordSetStringA(hrec, 4, NULL);
397 ok( r == ERROR_SUCCESS, "set string failed\n");
398 r = MsiRecordSetStringA(hrec, 12, "big");
399 ok( r == ERROR_SUCCESS, "set string failed\n");
400 sz = sizeof buffer;
401 r = MsiFormatRecordA(0, hrec, buffer, &sz);
402 ok( r == ERROR_SUCCESS, "format failed\n");
403 ok( sz == 10, "size wrong,(%i)\n",sz);
404 ok( 0 == strcmp(buffer,"[1[]2] hey"), "wrong output (%s)\n",buffer);
405
406 /* incorrect formats */
407 r = MsiRecordSetStringA(hrec, 0, "[[[3][[4]][1]] [2]");
408 ok( r == ERROR_SUCCESS, "set string failed\n");
409 r = MsiRecordSetStringA(hrec, 1, "2");
410 ok( r == ERROR_SUCCESS, "set string failed\n");
411 r = MsiRecordSetStringA(hrec, 2, "hey");
412 ok( r == ERROR_SUCCESS, "set string failed\n");
413 r = MsiRecordSetStringA(hrec, 3, "1");
414 ok( r == ERROR_SUCCESS, "set string failed\n");
415 r = MsiRecordSetStringA(hrec, 4, NULL);
416 ok( r == ERROR_SUCCESS, "set string failed\n");
417 r = MsiRecordSetStringA(hrec, 12, "big");
418 ok( r == ERROR_SUCCESS, "set string failed\n");
419 sz = sizeof buffer;
420 r = MsiFormatRecordA(0, hrec, buffer, &sz);
421 ok( r == ERROR_SUCCESS, "format failed\n");
422 ok( sz == 18, "size wrong,(%i)\n",sz);
423 ok( 0 == strcmp(buffer,"[[[3][[4]][1]] [2]"), "wrong output (%s)\n",buffer);
424
425 r = MsiRecordSetStringA(hrec, 0, "[[3][[4]][1]] [2]]");
426 ok( r == ERROR_SUCCESS, "set string failed\n");
427 r = MsiRecordSetStringA(hrec, 1, "2");
428 ok( r == ERROR_SUCCESS, "set string failed\n");
429 r = MsiRecordSetStringA(hrec, 2, "hey");
430 ok( r == ERROR_SUCCESS, "set string failed\n");
431 r = MsiRecordSetStringA(hrec, 3, "1");
432 ok( r == ERROR_SUCCESS, "set string failed\n");
433 r = MsiRecordSetStringA(hrec, 4, NULL);
434 ok( r == ERROR_SUCCESS, "set string failed\n");
435 r = MsiRecordSetStringA(hrec, 12, "big");
436 ok( r == ERROR_SUCCESS, "set string failed\n");
437 sz = sizeof buffer;
438 r = MsiFormatRecordA(0, hrec, buffer, &sz);
439 ok( r == ERROR_SUCCESS, "format failed\n");
440 ok( sz == 11, "size wrong,(%i)\n",sz);
441 ok( 0 == strcmp(buffer,"[1[]2] hey]"), "wrong output (%s)\n",buffer);
442
443
444 /* play games with {} */
445
446 r = MsiRecordSetStringA(hrec, 0, "{[3][1]} [2]");
447 ok( r == ERROR_SUCCESS, "set string failed\n");
448 r = MsiRecordSetStringA(hrec, 1, "2");
449 ok( r == ERROR_SUCCESS, "set string failed\n");
450 r = MsiRecordSetStringA(hrec, 2, "hey");
451 ok( r == ERROR_SUCCESS, "set string failed\n");
452 r = MsiRecordSetStringA(hrec, 3, "1");
453 ok( r == ERROR_SUCCESS, "set string failed\n");
454 r = MsiRecordSetStringA(hrec, 4, NULL);
455 ok( r == ERROR_SUCCESS, "set string failed\n");
456 r = MsiRecordSetStringA(hrec, 12, "big");
457 ok( r == ERROR_SUCCESS, "set string failed\n");
458 sz = sizeof buffer;
459 r = MsiFormatRecordA(0, hrec, buffer, &sz);
460 ok( r == ERROR_SUCCESS, "format failed\n");
461 ok( sz == 6, "size wrong,(%i)\n",sz);
462 ok( 0 == strcmp(buffer,"12 hey"), "wrong output (%s)\n",buffer);
463
464 r = MsiRecordSetStringA(hrec, 0, "[{[3][1]}] [2]");
465 ok( r == ERROR_SUCCESS, "set string failed\n");
466 r = MsiRecordSetStringA(hrec, 1, "2");
467 ok( r == ERROR_SUCCESS, "set string failed\n");
468 r = MsiRecordSetStringA(hrec, 2, "hey");
469 ok( r == ERROR_SUCCESS, "set string failed\n");
470 r = MsiRecordSetStringA(hrec, 3, "1");
471 ok( r == ERROR_SUCCESS, "set string failed\n");
472 r = MsiRecordSetStringA(hrec, 4, NULL);
473 ok( r == ERROR_SUCCESS, "set string failed\n");
474 r = MsiRecordSetStringA(hrec, 12, "big");
475 ok( r == ERROR_SUCCESS, "set string failed\n");
476 sz = sizeof buffer;
477 r = MsiFormatRecordA(0, hrec, buffer, &sz);
478 ok( r == ERROR_SUCCESS, "format failed\n");
479 ok( sz == 8, "size wrong,(%i)\n",sz);
480 ok( 0 == strcmp(buffer,"[12] hey"), "wrong output (%s)\n",buffer);
481
482
483 r = MsiRecordSetStringA(hrec, 0, "{test} [2]");
484 ok( r == ERROR_SUCCESS, "set string failed\n");
485 r = MsiRecordSetStringA(hrec, 1, "2");
486 ok( r == ERROR_SUCCESS, "set string failed\n");
487 r = MsiRecordSetStringA(hrec, 2, "hey");
488 ok( r == ERROR_SUCCESS, "set string failed\n");
489 r = MsiRecordSetStringA(hrec, 3, "1");
490 ok( r == ERROR_SUCCESS, "set string failed\n");
491 r = MsiRecordSetStringA(hrec, 4, NULL);
492 ok( r == ERROR_SUCCESS, "set string failed\n");
493 r = MsiRecordSetStringA(hrec, 12, "big");
494 ok( r == ERROR_SUCCESS, "set string failed\n");
495 sz = sizeof buffer;
496 r = MsiFormatRecordA(0, hrec, buffer, &sz);
497 ok( r == ERROR_SUCCESS, "format failed\n");
498 ok( sz == 10, "size wrong,(%i)\n",sz);
499 ok( 0 == strcmp(buffer,"{test} hey"), "wrong output (%s)\n",buffer);
500
501 r = MsiRecordSetStringA(hrec, 0, "{[test]} [2]");
502 ok( r == ERROR_SUCCESS, "set string failed\n");
503 r = MsiRecordSetStringA(hrec, 1, "2");
504 ok( r == ERROR_SUCCESS, "set string failed\n");
505 r = MsiRecordSetStringA(hrec, 2, "hey");
506 ok( r == ERROR_SUCCESS, "set string failed\n");
507 r = MsiRecordSetStringA(hrec, 3, "1");
508 ok( r == ERROR_SUCCESS, "set string failed\n");
509 r = MsiRecordSetStringA(hrec, 4, NULL);
510 ok( r == ERROR_SUCCESS, "set string failed\n");
511 r = MsiRecordSetStringA(hrec, 12, "big");
512 ok( r == ERROR_SUCCESS, "set string failed\n");
513 sz = sizeof buffer;
514 r = MsiFormatRecordA(0, hrec, buffer, &sz);
515 ok( r == ERROR_SUCCESS, "format failed\n");
516 ok( sz == 12, "size wrong,(%i)\n",sz);
517 ok( 0 == strcmp(buffer,"{[test]} hey"), "wrong output (%s)\n",buffer);
518
519 r = MsiRecordSetStringA(hrec, 0, "{[1][2][3][4]} [2]");
520 ok( r == ERROR_SUCCESS, "set string failed\n");
521 r = MsiRecordSetStringA(hrec, 1, "2");
522 ok( r == ERROR_SUCCESS, "set string failed\n");
523 r = MsiRecordSetStringA(hrec, 2, "hey");
524 ok( r == ERROR_SUCCESS, "set string failed\n");
525 r = MsiRecordSetStringA(hrec, 3, "1");
526 ok( r == ERROR_SUCCESS, "set string failed\n");
527 r = MsiRecordSetStringA(hrec, 4, NULL);
528 ok( r == ERROR_SUCCESS, "set string failed\n");
529 r = MsiRecordSetStringA(hrec, 12, "big");
530 ok( r == ERROR_SUCCESS, "set string failed\n");
531 sz = sizeof buffer;
532 r = MsiFormatRecordA(0, hrec, buffer, &sz);
533 ok( r == ERROR_SUCCESS, "format failed\n");
534 ok( sz == 4, "size wrong,(%i)\n",sz);
535 ok( 0 == strcmp(buffer," hey"), "wrong output (%s)\n",buffer);
536
537 r = MsiRecordSetStringA(hrec, 0, "{[1][2][3][dummy]} [2]");
538 ok( r == ERROR_SUCCESS, "set string failed\n");
539 r = MsiRecordSetStringA(hrec, 1, "2");
540 ok( r == ERROR_SUCCESS, "set string failed\n");
541 r = MsiRecordSetStringA(hrec, 2, "hey");
542 ok( r == ERROR_SUCCESS, "set string failed\n");
543 r = MsiRecordSetStringA(hrec, 3, "1");
544 ok( r == ERROR_SUCCESS, "set string failed\n");
545 r = MsiRecordSetStringA(hrec, 4, NULL);
546 ok( r == ERROR_SUCCESS, "set string failed\n");
547 r = MsiRecordSetStringA(hrec, 12, "big");
548 ok( r == ERROR_SUCCESS, "set string failed\n");
549 sz = sizeof buffer;
550 r = MsiFormatRecordA(0, hrec, buffer, &sz);
551 ok( r == ERROR_SUCCESS, "format failed\n");
552 ok( sz == 18, "size wrong,(%i)\n",sz);
553 ok( 0 == strcmp(buffer,"{2hey1[dummy]} hey"), "wrong output (%s)\n",buffer);
554
555 r = MsiRecordSetStringA(hrec, 0, "{[1][2][3][4][dummy]} [2]");
556 ok( r == ERROR_SUCCESS, "set string failed\n");
557 r = MsiRecordSetStringA(hrec, 1, "2");
558 ok( r == ERROR_SUCCESS, "set string failed\n");
559 r = MsiRecordSetStringA(hrec, 2, "hey");
560 ok( r == ERROR_SUCCESS, "set string failed\n");
561 r = MsiRecordSetStringA(hrec, 3, "1");
562 ok( r == ERROR_SUCCESS, "set string failed\n");
563 r = MsiRecordSetStringA(hrec, 4, NULL);
564 ok( r == ERROR_SUCCESS, "set string failed\n");
565 r = MsiRecordSetStringA(hrec, 12, "big");
566 ok( r == ERROR_SUCCESS, "set string failed\n");
567 sz = sizeof buffer;
568 r = MsiFormatRecordA(0, hrec, buffer, &sz);
569 ok( r == ERROR_SUCCESS, "format failed\n");
570 ok( sz == 18, "size wrong,(%i)\n",sz);
571 ok( 0 == strcmp(buffer,"{2hey1[dummy]} hey"), "wrong output (%s)\n",buffer);
572
573 r = MsiRecordSetStringA(hrec, 0, "{{[1][2]}[3][4][dummy]}");
574 ok( r == ERROR_SUCCESS, "set string failed\n");
575 r = MsiRecordSetStringA(hrec, 1, "2");
576 ok( r == ERROR_SUCCESS, "set string failed\n");
577 r = MsiRecordSetStringA(hrec, 2, "hey");
578 ok( r == ERROR_SUCCESS, "set string failed\n");
579 r = MsiRecordSetStringA(hrec, 3, "1");
580 ok( r == ERROR_SUCCESS, "set string failed\n");
581 r = MsiRecordSetStringA(hrec, 4, NULL);
582 ok( r == ERROR_SUCCESS, "set string failed\n");
583 r = MsiRecordSetStringA(hrec, 12, "big");
584 ok( r == ERROR_SUCCESS, "set string failed\n");
585 sz = sizeof buffer;
586 r = MsiFormatRecordA(0, hrec, buffer, &sz);
587 ok( r == ERROR_SUCCESS, "format failed\n");
588 ok( sz == 16, "size wrong,(%i)\n",sz);
589 ok( 0 == strcmp(buffer,"{{2hey}1[dummy]}"), "wrong output (%s)\n",buffer);
590
591 r = MsiRecordSetStringA(hrec, 0, "{{[1][2]}[3]{[4][dummy]}}");
592 ok( r == ERROR_SUCCESS, "set string failed\n");
593 r = MsiRecordSetStringA(hrec, 1, "2");
594 ok( r == ERROR_SUCCESS, "set string failed\n");
595 r = MsiRecordSetStringA(hrec, 2, "hey");
596 ok( r == ERROR_SUCCESS, "set string failed\n");
597 r = MsiRecordSetStringA(hrec, 3, "1");
598 ok( r == ERROR_SUCCESS, "set string failed\n");
599 r = MsiRecordSetStringA(hrec, 4, NULL);
600 ok( r == ERROR_SUCCESS, "set string failed\n");
601 r = MsiRecordSetStringA(hrec, 12, "big");
602 ok( r == ERROR_SUCCESS, "set string failed\n");
603 sz = sizeof buffer;
604 r = MsiFormatRecordA(0, hrec, buffer, &sz);
605 ok( r == ERROR_SUCCESS, "format failed\n");
606 ok( sz == 0, "size wrong,(%i)\n",sz);
607 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
608
609 r = MsiRecordSetStringA(hrec, 0, "{{[1][2]}[3]} {[1][2]}");
610 ok( r == ERROR_SUCCESS, "set string failed\n");
611 r = MsiRecordSetStringA(hrec, 1, "1");
612 ok( r == ERROR_SUCCESS, "set string failed\n");
613 r = MsiRecordSetStringA(hrec, 2, "2");
614 ok( r == ERROR_SUCCESS, "set string failed\n");
615 r = MsiRecordSetStringA(hrec, 3, "3");
616 ok( r == ERROR_SUCCESS, "set string failed\n");
617 r = MsiRecordSetStringA(hrec, 4, NULL);
618 ok( r == ERROR_SUCCESS, "set string failed\n");
619 r = MsiRecordSetStringA(hrec, 12, "big");
620 ok( r == ERROR_SUCCESS, "set string failed\n");
621 sz = sizeof buffer;
622 r = MsiFormatRecordA(0, hrec, buffer, &sz);
623 ok( r == ERROR_SUCCESS, "format failed\n");
624 ok( sz == 12, "size wrong,(%i)\n",sz);
625 ok( 0 == strcmp(buffer,"{{12}3} {12}"), "wrong output (%s)\n",buffer);
626
627 r = MsiRecordSetStringA(hrec, 0, "{[1][2]} {{[1][2]}[3]} {[1][2]}");
628 ok( r == ERROR_SUCCESS, "set string failed\n");
629 r = MsiRecordSetStringA(hrec, 1, "1");
630 ok( r == ERROR_SUCCESS, "set string failed\n");
631 r = MsiRecordSetStringA(hrec, 2, "2");
632 ok( r == ERROR_SUCCESS, "set string failed\n");
633 r = MsiRecordSetStringA(hrec, 3, "3");
634 ok( r == ERROR_SUCCESS, "set string failed\n");
635 r = MsiRecordSetStringA(hrec, 4, NULL);
636 ok( r == ERROR_SUCCESS, "set string failed\n");
637 r = MsiRecordSetStringA(hrec, 12, "big");
638 ok( r == ERROR_SUCCESS, "set string failed\n");
639 sz = sizeof buffer;
640 r = MsiFormatRecordA(0, hrec, buffer, &sz);
641 ok( r == ERROR_SUCCESS, "format failed\n");
642 ok( sz == 15, "size wrong,(%i)\n",sz);
643 ok( 0 == strcmp(buffer,"12 {{12}3} {12}"), "wrong output (%s)\n",buffer);
644
645 r = MsiRecordSetStringA(hrec, 0, "{[4]}{[1][2]} {{[1][2]}[3]} {[1][2]}");
646 ok( r == ERROR_SUCCESS, "set string failed\n");
647 r = MsiRecordSetStringA(hrec, 1, "1");
648 ok( r == ERROR_SUCCESS, "set string failed\n");
649 r = MsiRecordSetStringA(hrec, 2, "2");
650 ok( r == ERROR_SUCCESS, "set string failed\n");
651 r = MsiRecordSetStringA(hrec, 3, "3");
652 ok( r == ERROR_SUCCESS, "set string failed\n");
653 r = MsiRecordSetStringA(hrec, 4, NULL);
654 ok( r == ERROR_SUCCESS, "set string failed\n");
655 r = MsiRecordSetStringA(hrec, 12, "big");
656 ok( r == ERROR_SUCCESS, "set string failed\n");
657 sz = sizeof buffer;
658 r = MsiFormatRecordA(0, hrec, buffer, &sz);
659 ok( r == ERROR_SUCCESS, "format failed\n");
660 ok( sz == 15, "size wrong,(%i)\n",sz);
661 ok( 0 == strcmp(buffer,"12 {{12}3} {12}"), "wrong output (%s)\n",buffer);
662
663 r = MsiRecordSetStringA(hrec, 0, "{blah} {[4]}{[1][2]} {{[1][2]}[3]} {[1][2]}");
664 ok( r == ERROR_SUCCESS, "set string failed\n");
665 r = MsiRecordSetStringA(hrec, 1, "1");
666 ok( r == ERROR_SUCCESS, "set string failed\n");
667 r = MsiRecordSetStringA(hrec, 2, "2");
668 ok( r == ERROR_SUCCESS, "set string failed\n");
669 r = MsiRecordSetStringA(hrec, 3, "3");
670 ok( r == ERROR_SUCCESS, "set string failed\n");
671 r = MsiRecordSetStringA(hrec, 4, NULL);
672 ok( r == ERROR_SUCCESS, "set string failed\n");
673 r = MsiRecordSetStringA(hrec, 12, "big");
674 ok( r == ERROR_SUCCESS, "set string failed\n");
675 sz = sizeof buffer;
676 r = MsiFormatRecordA(0, hrec, buffer, &sz);
677 ok( r == ERROR_SUCCESS, "format failed\n");
678 ok( sz == 22, "size wrong,(%i)\n",sz);
679 ok( 0 == strcmp(buffer,"{blah} 12 {{12}3} {12}"), "wrong output (%s)\n",buffer);
680
681 r = MsiRecordSetStringA(hrec, 0, "{{[1]}[2]} {[4]}{[1][2]}");
682 ok( r == ERROR_SUCCESS, "set string failed\n");
683 r = MsiRecordSetStringA(hrec, 1, "1");
684 ok( r == ERROR_SUCCESS, "set string failed\n");
685 r = MsiRecordSetStringA(hrec, 2, "2");
686 ok( r == ERROR_SUCCESS, "set string failed\n");
687 r = MsiRecordSetStringA(hrec, 3, "3");
688 ok( r == ERROR_SUCCESS, "set string failed\n");
689 r = MsiRecordSetStringA(hrec, 4, NULL);
690 ok( r == ERROR_SUCCESS, "set string failed\n");
691 r = MsiRecordSetStringA(hrec, 12, "big");
692 ok( r == ERROR_SUCCESS, "set string failed\n");
693 sz = sizeof buffer;
694 r = MsiFormatRecordA(0, hrec, buffer, &sz);
695 ok( r == ERROR_SUCCESS, "format failed\n");
696 ok( sz == 13, "size wrong,(%i)\n",sz);
697 ok( 0 == strcmp(buffer,"{{1}2} {}{12}"), "wrong output (%s)\n",buffer);
698
699 r = MsiRecordSetStringA(hrec, 0, "{{[1]}} {[4]}{[1][2]}");
700 ok( r == ERROR_SUCCESS, "set string failed\n");
701 r = MsiRecordSetStringA(hrec, 1, "1");
702 ok( r == ERROR_SUCCESS, "set string failed\n");
703 r = MsiRecordSetStringA(hrec, 2, "2");
704 ok( r == ERROR_SUCCESS, "set string failed\n");
705 r = MsiRecordSetStringA(hrec, 3, "3");
706 ok( r == ERROR_SUCCESS, "set string failed\n");
707 r = MsiRecordSetStringA(hrec, 4, NULL);
708 ok( r == ERROR_SUCCESS, "set string failed\n");
709 r = MsiRecordSetStringA(hrec, 12, "big");
710 ok( r == ERROR_SUCCESS, "set string failed\n");
711 sz = sizeof buffer;
712 r = MsiFormatRecordA(0, hrec, buffer, &sz);
713 ok( r == ERROR_SUCCESS, "format failed\n");
714 ok( sz == 3, "size wrong,(%i)\n",sz);
715 ok( 0 == strcmp(buffer," 12"), "wrong output (%s)\n",buffer);
716
717 r = MsiRecordSetStringA(hrec, 0, "{{{[1]}} {[4]}{[1][2]}");
718 ok( r == ERROR_SUCCESS, "set string failed\n");
719 r = MsiRecordSetStringA(hrec, 1, "1");
720 ok( r == ERROR_SUCCESS, "set string failed\n");
721 r = MsiRecordSetStringA(hrec, 2, "2");
722 ok( r == ERROR_SUCCESS, "set string failed\n");
723 r = MsiRecordSetStringA(hrec, 3, "3");
724 ok( r == ERROR_SUCCESS, "set string failed\n");
725 r = MsiRecordSetStringA(hrec, 4, NULL);
726 ok( r == ERROR_SUCCESS, "set string failed\n");
727 r = MsiRecordSetStringA(hrec, 12, "big");
728 ok( r == ERROR_SUCCESS, "set string failed\n");
729 sz = sizeof buffer;
730 r = MsiFormatRecordA(0, hrec, buffer, &sz);
731 ok( r == ERROR_SUCCESS, "format failed\n");
732 todo_wine{
733 ok( sz == 3, "size wrong,(%i)\n",sz);
734 ok( 0 == strcmp(buffer," 12"), "wrong output (%s)\n",buffer);
735 }
736
737 /* now put play games with escaping */
738 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [\\3asdf]");
739 ok( r == ERROR_SUCCESS, "set string failed\n");
740 r = MsiRecordSetStringA(hrec, 1, "boo");
741 ok( r == ERROR_SUCCESS, "set string failed\n");
742 r = MsiRecordSetStringA(hrec, 2, "hoo");
743 ok( r == ERROR_SUCCESS, "set string failed\n");
744 sz = sizeof buffer;
745 r = MsiFormatRecordA(0, hrec, buffer, &sz);
746 ok( r == ERROR_SUCCESS, "format failed\n");
747 ok( sz == 16, "size wrong\n");
748 ok( 0 == strcmp(buffer,"boo hoo [\\3asdf]"), "wrong output\n");
749
750 /* now put play games with escaping */
751 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [\\x]");
752 ok( r == ERROR_SUCCESS, "set string failed\n");
753 r = MsiRecordSetStringA(hrec, 1, "boo");
754 ok( r == ERROR_SUCCESS, "set string failed\n");
755 r = MsiRecordSetStringA(hrec, 2, "hoo");
756 ok( r == ERROR_SUCCESS, "set string failed\n");
757 sz = sizeof buffer;
758 r = MsiFormatRecordA(0, hrec, buffer, &sz);
759 ok( r == ERROR_SUCCESS, "format failed\n");
760 ok( sz == 12, "size wrong\n");
761 ok( 0 == strcmp(buffer,"boo hoo [\\x]"), "wrong output\n");
762
763 r = MsiRecordSetStringA(hrec, 0, "[\\x]");
764 ok( r == ERROR_SUCCESS, "set string failed\n");
765 sz = sizeof buffer;
766 r = MsiFormatRecordA(0, hrec, buffer, &sz);
767 ok( r == ERROR_SUCCESS, "format failed\n");
768 ok( sz == 4, "size wrong: %d\n", sz);
769 ok( 0 == strcmp(buffer,"[\\x]"), "wrong output: %s\n", buffer);
770
771 r = MsiRecordSetStringA(hrec, 0, "{\\x}");
772 ok( r == ERROR_SUCCESS, "set string failed\n");
773 sz = sizeof buffer;
774 r = MsiFormatRecordA(0, hrec, buffer, &sz);
775 ok( r == ERROR_SUCCESS, "format failed\n");
776 ok( sz == 4, "size wrong: %d\n", sz);
777 ok( 0 == strcmp(buffer,"{\\x}"), "wrong output: %s\n", buffer);
778
779 r = MsiRecordSetStringA(hrec, 0, "[abc\\x]");
780 ok( r == ERROR_SUCCESS, "set string failed\n");
781 sz = sizeof buffer;
782 r = MsiFormatRecordA(0, hrec, buffer, &sz);
783 ok( r == ERROR_SUCCESS, "format failed\n");
784 ok( sz == 7, "size wrong: %d\n", sz);
785 ok( 0 == strcmp(buffer,"[abc\\x]"), "wrong output: %s\n", buffer);
786
787 r = MsiRecordSetStringA(hrec, 0, "[\\[]Bracket Text[\\]]");
788 ok( r == ERROR_SUCCESS, "set string failed\n");
789 sz = sizeof buffer;
790 r = MsiFormatRecordA(0, hrec, buffer, &sz);
791 ok( r == ERROR_SUCCESS, "format failed\n");
792 ok( sz == 20, "size wrong: %d\n", sz);
793 ok( 0 == strcmp(buffer,"[\\[]Bracket Text[\\]]"), "wrong output: %s\n", buffer);
794
795 /* now try other formats without a package */
796 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [property]");
797 ok( r == ERROR_SUCCESS, "set string failed\n");
798 r = MsiRecordSetStringA(hrec, 1, "boo");
799 ok( r == ERROR_SUCCESS, "set string failed\n");
800 r = MsiRecordSetStringA(hrec, 2, "hoo");
801 ok( r == ERROR_SUCCESS, "set string failed\n");
802 sz = sizeof buffer;
803 r = MsiFormatRecordA(0, hrec, buffer, &sz);
804 ok( r == ERROR_SUCCESS, "format failed\n");
805 ok( sz == 18, "size wrong\n");
806 ok( 0 == strcmp(buffer,"boo hoo [property]"), "wrong output\n");
807
808 r = MsiRecordSetStringA(hrec, 0, "[1] [~] [2]");
809 ok( r == ERROR_SUCCESS, "set string failed\n");
810 r = MsiRecordSetStringA(hrec, 1, "boo");
811 ok( r == ERROR_SUCCESS, "set string failed\n");
812 r = MsiRecordSetStringA(hrec, 2, "hoo");
813 ok( r == ERROR_SUCCESS, "set string failed\n");
814 sz = sizeof buffer;
815 r = MsiFormatRecordA(0, hrec, buffer, &sz);
816 ok( r == ERROR_SUCCESS, "format failed\n");
817 ok( sz == 11, "size wrong\n");
818 ok( 0 == strcmp(buffer,"boo [~] hoo"), "wrong output (%s)\n",buffer);
819
820 r = MsiRecordSetStringA(hrec, 0, "[1]");
821 ok( r == ERROR_SUCCESS, "set string failed\n");
822 r = MsiRecordSetInteger(hrec, 1, 123456);
823 ok( r == ERROR_SUCCESS, "set integer failed\n");
824 sz = sizeof buffer;
825 r = MsiFormatRecordA(0, hrec, buffer, &sz);
826 ok( r == ERROR_SUCCESS, "format failed\n");
827 ok( sz == 6, "size wrong\n");
828 ok( 0 == strcmp(buffer,"123456"), "wrong output (%s)\n",buffer);
829
830 r = MsiRecordSetStringA(hrec, 0, "[~]");
831 ok( r == ERROR_SUCCESS, "set string failed\n");
832 sz = sizeof buffer;
833 r = MsiFormatRecordA(0, hrec, buffer, &sz);
834 ok( sz == 3, "size wrong\n");
835 ok( 0 == strcmp(buffer,"[~]"), "wrong output\n");
836 ok( r == ERROR_SUCCESS, "format failed\n");
837
838 r = MsiRecordSetStringA(hrec, 0, "[]");
839 ok( r == ERROR_SUCCESS, "set string failed\n");
840 sz = sizeof buffer;
841 r = MsiFormatRecordA(0, hrec, buffer, &sz);
842 ok( sz == 2, "size wrong\n");
843 ok( 0 == strcmp(buffer,"[]"), "wrong output\n");
844 ok( r == ERROR_SUCCESS, "format failed\n");
845
846 /* MsiFormatRecordA doesn't seem to handle a negative too well */
847 r = MsiRecordSetStringA(hrec, 0, "[-1]");
848 ok( r == ERROR_SUCCESS, "set string failed\n");
849 sz = sizeof buffer;
850 r = MsiFormatRecordA(0, hrec, buffer, &sz);
851 ok( sz == 4, "size wrong\n");
852 ok( 0 == strcmp(buffer,"[-1]"), "wrong output\n");
853 ok( r == ERROR_SUCCESS, "format failed\n");
854
855 r = MsiRecordSetStringA(hrec, 0, "{[]}");
856 ok( r == ERROR_SUCCESS, "set string failed\n");
857 sz = sizeof buffer;
858 r = MsiFormatRecordA(0, hrec, buffer, &sz);
859 ok( sz == 4, "size wrong\n");
860 ok( 0 == strcmp(buffer,"{[]}"), "wrong output\n");
861 ok( r == ERROR_SUCCESS, "format failed\n");
862
863 r = MsiRecordSetStringA(hrec, 0, "[0]");
864 ok( r == ERROR_SUCCESS, "set string failed\n");
865 sz = sizeof buffer;
866 r = MsiFormatRecordA(0, hrec, buffer, &sz);
867 ok( sz == 3, "size wrong\n");
868 ok( 0 == strcmp(buffer,"[0]"), "wrong output\n");
869 ok( r == ERROR_SUCCESS, "format failed\n");
870
871 r = MsiRecordSetStringA(hrec, 0, "[100]");
872 ok( r == ERROR_SUCCESS, "set string failed\n");
873 sz = sizeof buffer;
874 r = MsiFormatRecordA(0, hrec, buffer, &sz);
875 ok( sz == 0, "size wrong\n");
876 ok( 0 == strcmp(buffer,""), "wrong output\n");
877 ok( r == ERROR_SUCCESS, "format failed\n");
878
879 r = MsiRecordSetStringA(hrec, 0, "{[1] [2]}");
880 ok( r == ERROR_SUCCESS, "set string failed\n");
881 r = MsiRecordSetStringA(hrec, 1, "boo");
882 ok( r == ERROR_SUCCESS, "set string failed\n");
883 r = MsiRecordSetStringA(hrec, 2, "hoo");
884 ok( r == ERROR_SUCCESS, "set string failed\n");
885 sz = sizeof buffer;
886 r = MsiFormatRecordA(0, hrec, buffer, &sz);
887 ok( sz == 7, "size wrong\n");
888 ok( 0 == strcmp(buffer,"boo hoo"), "wrong output\n");
889 ok( r == ERROR_SUCCESS, "format failed\n");
890
891 r = MsiRecordSetStringA(hrec, 0, "{}");
892 ok( r == ERROR_SUCCESS, "set string failed\n");
893 sz = sizeof buffer;
894 r = MsiFormatRecordA(0, hrec, buffer, &sz);
895 ok( sz == 0, "size wrong\n");
896 ok( 0 == strcmp(buffer,""), "wrong output\n");
897 ok( r == ERROR_SUCCESS, "format failed\n");
898
899 r = MsiRecordSetStringA(hrec, 0, "{foo}");
900 ok( r == ERROR_SUCCESS, "set string failed\n");
901 sz = sizeof buffer;
902 r = MsiFormatRecordA(0, hrec, buffer, &sz);
903 ok( sz == 5, "size wrong\n");
904 ok( 0 == strcmp(buffer,"{foo}"), "wrong output\n");
905 ok( r == ERROR_SUCCESS, "format failed\n");
906
907 r = MsiRecordSetStringA(hrec, 0, "{boo [1]}");
908 ok( r == ERROR_SUCCESS, "set string failed\n");
909 r = MsiRecordSetStringA(hrec, 1, "hoo");
910 ok( r == ERROR_SUCCESS, "set string failed\n");
911 sz = sizeof buffer;
912 r = MsiFormatRecordA(0, hrec, buffer, &sz);
913 ok( sz == 7, "size wrong\n");
914 ok( 0 == strcmp(buffer,"boo hoo"), "wrong output\n");
915 ok( r == ERROR_SUCCESS, "format failed\n");
916
917 r = MsiRecordSetStringA(hrec, 0, "{{[1]}}");
918 ok( r == ERROR_SUCCESS, "set string failed\n");
919 r = MsiRecordSetStringA(hrec, 1, "hoo");
920 ok( r == ERROR_SUCCESS, "set string failed\n");
921 sz = sizeof buffer;
922 r = MsiFormatRecordA(0, hrec, buffer, &sz);
923 ok( sz == 0, "size wrong\n");
924 ok( 0 == strcmp(buffer,""), "wrong output\n");
925 ok( r == ERROR_SUCCESS, "format failed\n");
926
927 r = MsiRecordSetStringA(hrec, 0, "{ {[1]}}");
928 ok( r == ERROR_SUCCESS, "set string failed\n");
929 r = MsiRecordSetStringA(hrec, 1, "hoo");
930 ok( r == ERROR_SUCCESS, "set string failed\n");
931 sz = sizeof buffer;
932 r = MsiFormatRecordA(0, hrec, buffer, &sz);
933 todo_wine
934 {
935 ok( 0 == strcmp(buffer," {hoo}"), "wrong output\n");
936 ok( sz == 6, "size wrong\n");
937 }
938 ok( r == ERROR_SUCCESS, "format failed\n");
939
940 r = MsiRecordSetStringA(hrec, 0, "{{[1]} }");
941 ok( r == ERROR_SUCCESS, "set string failed\n");
942 r = MsiRecordSetStringA(hrec, 1, "hoo");
943 ok( r == ERROR_SUCCESS, "set string failed\n");
944 sz = sizeof buffer;
945 r = MsiFormatRecordA(0, hrec, buffer, &sz);
946 ok( sz == 8, "size wrong\n");
947 ok( 0 == strcmp(buffer,"{{hoo} }"), "wrong output\n");
948 ok( r == ERROR_SUCCESS, "format failed\n");
949
950 r = MsiRecordSetStringA(hrec, 0, "{{ [1]}}");
951 ok( r == ERROR_SUCCESS, "set string failed\n");
952 r = MsiRecordSetStringA(hrec, 1, "hoo");
953 ok( r == ERROR_SUCCESS, "set string failed\n");
954 sz = sizeof buffer;
955 r = MsiFormatRecordA(0, hrec, buffer, &sz);
956 ok( sz == 0, "size wrong\n");
957 ok( 0 == strcmp(buffer,""), "wrong output\n");
958 ok( r == ERROR_SUCCESS, "format failed\n");
959
960 r = MsiRecordSetStringA(hrec, 0, "{{[1] }}");
961 ok( r == ERROR_SUCCESS, "set string failed\n");
962 r = MsiRecordSetStringA(hrec, 1, "hoo");
963 ok( r == ERROR_SUCCESS, "set string failed\n");
964 sz = sizeof buffer;
965 r = MsiFormatRecordA(0, hrec, buffer, &sz);
966 ok( sz == 0, "size wrong\n");
967 ok( 0 == strcmp(buffer,""), "wrong output\n");
968 ok( r == ERROR_SUCCESS, "format failed\n");
969
970 r = MsiRecordSetStringA(hrec, 0, "{{a}{b}{c }{ d}{any text}}");
971 ok( r == ERROR_SUCCESS, "set string failed\n");
972 sz = sizeof buffer;
973 r = MsiFormatRecordA(0, hrec, buffer, &sz);
974 ok( sz == 0, "size wrong\n");
975 ok( 0 == strcmp(buffer,""), "wrong output\n");
976 ok( r == ERROR_SUCCESS, "format failed\n");
977
978 r = MsiRecordSetStringA(hrec, 0, "{{a} }");
979 ok( r == ERROR_SUCCESS, "set string failed\n");
980 sz = sizeof buffer;
981 r = MsiFormatRecordA(0, hrec, buffer, &sz);
982 ok( sz == 6, "size wrong\n");
983 ok( 0 == strcmp(buffer,"{{a} }"), "wrong output\n");
984 ok( r == ERROR_SUCCESS, "format failed\n");
985
986 r = MsiRecordSetStringA(hrec, 0, "{{a} {b}}");
987 ok( r == ERROR_SUCCESS, "set string failed\n");
988 sz = sizeof buffer;
989 r = MsiFormatRecordA(0, hrec, buffer, &sz);
990 ok( sz == 0, "size wrong\n");
991 ok( 0 == strcmp(buffer,""), "wrong output\n");
992 ok( r == ERROR_SUCCESS, "format failed\n");
993
994 r = MsiRecordSetStringA(hrec, 0, "{{a} b}}");
995 ok( r == ERROR_SUCCESS, "set string failed\n");
996 sz = sizeof buffer;
997 r = MsiFormatRecordA(0, hrec, buffer, &sz);
998 todo_wine ok( sz == 0, "size wrong\n");
999 todo_wine ok( 0 == strcmp(buffer,""), "wrong output\n");
1000 ok( r == ERROR_SUCCESS, "format failed\n");
1001
1002 r = MsiRecordSetStringA(hrec, 0, "{{a b}}");
1003 ok( r == ERROR_SUCCESS, "set string failed\n");
1004 sz = sizeof buffer;
1005 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1006 ok( sz == 0, "size wrong\n");
1007 ok( 0 == strcmp(buffer,""), "wrong output\n");
1008 ok( r == ERROR_SUCCESS, "format failed\n");
1009
1010 r = MsiRecordSetStringA(hrec, 0, "{ }");
1011 ok( r == ERROR_SUCCESS, "set string failed\n");
1012 sz = sizeof buffer;
1013 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1014 ok( sz == 3, "size wrong\n");
1015 ok( 0 == strcmp(buffer,"{ }"), "wrong output\n");
1016 ok( r == ERROR_SUCCESS, "format failed\n");
1017
1018 r = MsiRecordSetStringA(hrec, 0, " {{a}}}");
1019 ok( r == ERROR_SUCCESS, "set string failed\n");
1020 sz = sizeof buffer;
1021 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1022 ok( sz == 2, "size wrong\n");
1023 ok( 0 == strcmp(buffer," }"), "wrong output\n");
1024 ok( r == ERROR_SUCCESS, "format failed\n");
1025
1026 r = MsiRecordSetStringA(hrec, 0, "{{ almost {{ any }} text }}");
1027 ok( r == ERROR_SUCCESS, "set string failed\n");
1028 sz = sizeof buffer;
1029 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1030 todo_wine ok( sz == 8, "size wrong\n");
1031 todo_wine ok( 0 == strcmp(buffer," text }}"), "wrong output\n");
1032 ok( r == ERROR_SUCCESS, "format failed\n");
1033
1034 r = MsiRecordSetStringA(hrec, 0, "{{ } { hidden ][ [ }}");
1035 ok( r == ERROR_SUCCESS, "set string failed\n");
1036 sz = sizeof buffer;
1037 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1038 todo_wine ok( sz == 0, "size wrong\n");
1039 todo_wine ok( 0 == strcmp(buffer,""), "wrong output\n");
1040 ok( r == ERROR_SUCCESS, "format failed\n");
1041
1042 r = MsiRecordSetStringA(hrec, 0, "[ 1]");
1043 ok( r == ERROR_SUCCESS, "set string failed\n");
1044 r = MsiRecordSetStringA(hrec, 1, "hoo");
1045 ok( r == ERROR_SUCCESS, "set string failed\n");
1046 sz = sizeof buffer;
1047 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1048 ok( sz == 4, "size wrong\n");
1049 ok( 0 == strcmp(buffer,"[ 1]"), "wrong output\n");
1050 ok( r == ERROR_SUCCESS, "format failed\n");
1051
1052 r = MsiRecordSetStringA(hrec, 0, "[01]");
1053 ok( r == ERROR_SUCCESS, "set string failed\n");
1054 r = MsiRecordSetStringA(hrec, 1, "hoo");
1055 ok( r == ERROR_SUCCESS, "set string failed\n");
1056 sz = sizeof buffer;
1057 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1058 ok( sz == 3, "size wrong\n");
1059 ok( 0 == strcmp(buffer,"hoo"), "wrong output\n");
1060 ok( r == ERROR_SUCCESS, "format failed\n");
1061
1062 r = MsiRecordSetStringA(hrec, 0, "{{test}} [01");
1063 ok( r == ERROR_SUCCESS, "set string failed\n");
1064 r = MsiRecordSetStringA(hrec, 1, "hoo");
1065 ok( r == ERROR_SUCCESS, "set string failed\n");
1066 sz = sizeof buffer;
1067 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1068 todo_wine ok( sz == 4, "size wrong\n");
1069 todo_wine ok( 0 == strcmp(buffer," [01"), "wrong output\n");
1070 ok( r == ERROR_SUCCESS, "format failed\n");
1071
1072 r = MsiRecordSetStringA(hrec, 0, "[\\[]");
1073 ok( r == ERROR_SUCCESS, "set string failed\n");
1074 r = MsiRecordSetStringA(hrec, 1, "hoo");
1075 ok( r == ERROR_SUCCESS, "set string failed\n");
1076 sz = sizeof buffer;
1077 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1078 ok( sz == 4, "size wrong\n");
1079 ok( 0 == strcmp(buffer,"[\\[]"), "wrong output\n");
1080 ok( r == ERROR_SUCCESS, "format failed\n");
1081
1082 r = MsiRecordSetStringA(hrec, 0, "[\\[]");
1083 ok( r == ERROR_SUCCESS, "set string failed\n");
1084 r = MsiRecordSetStringA(hrec, 1, "hoo");
1085 ok( r == ERROR_SUCCESS, "set string failed\n");
1086 sz = sizeof(buffer);
1087 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1088 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1089 ok(sz == 4, "Expected 4, got %d\n", sz);
1090 ok(!lstrcmpA(buffer, "[\\[]"), "Expected \"[\\[]\", got \"%s\"\n", buffer);
1091
1092 r = MsiRecordSetStringA(hrec, 0, "[foo]");
1093 ok( r == ERROR_SUCCESS, "set string failed\n");
1094 r = MsiRecordSetStringA(hrec, 1, "hoo");
1095 ok( r == ERROR_SUCCESS, "set string failed\n");
1096 sz = sizeof buffer;
1097 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1098 ok( sz == 5, "size wrong\n");
1099 ok( 0 == strcmp(buffer,"[foo]"), "wrong output\n");
1100 ok( r == ERROR_SUCCESS, "format failed\n");
1101
1102 r = MsiRecordSetStringA(hrec, 0, "[01.]");
1103 ok( r == ERROR_SUCCESS, "set string failed\n");
1104 r = MsiRecordSetStringA(hrec, 1, "hoo");
1105 ok( r == ERROR_SUCCESS, "set string failed\n");
1106 sz = sizeof buffer;
1107 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1108 ok( sz == 5, "size wrong\n");
1109 ok( 0 == strcmp(buffer,"[01.]"), "wrong output\n");
1110 ok( r == ERROR_SUCCESS, "format failed\n");
1111
1112 SetEnvironmentVariableA("FOO", "BAR");
1113 r = MsiRecordSetStringA(hrec, 0, "[%FOO]");
1114 ok( r == ERROR_SUCCESS, "set string failed\n");
1115 sz = sizeof buffer;
1116 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1117 ok( sz == 6, "size wrong\n");
1118 ok( 0 == strcmp(buffer,"[%FOO]"), "wrong output\n");
1119 ok( r == ERROR_SUCCESS, "format failed\n");
1120
1121 r = MsiRecordSetStringA(hrec, 0, "{{[1]}");
1122 ok( r == ERROR_SUCCESS, "set string failed\n");
1123 r = MsiRecordSetStringA(hrec, 1, "hoo");
1124 ok( r == ERROR_SUCCESS, "set string failed\n");
1125 sz = sizeof buffer;
1126 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1127 ok( sz == 6, "size wrong\n");
1128 ok( 0 == strcmp(buffer,"{{hoo}"), "wrong output\n");
1129 ok( r == ERROR_SUCCESS, "format failed\n");
1130
1131 r = MsiRecordSetStringA(hrec, 0, "{{ {[1]}");
1132 ok( r == ERROR_SUCCESS, "set string failed\n");
1133 r = MsiRecordSetStringA(hrec, 1, "hoo");
1134 ok( r == ERROR_SUCCESS, "set string failed\n");
1135 sz = sizeof buffer;
1136 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1137 ok( sz == 8, "size wrong\n");
1138 ok( 0 == strcmp(buffer,"{{ {hoo}"), "wrong output\n");
1139 ok( r == ERROR_SUCCESS, "format failed\n");
1140
1141 r = MsiRecordSetStringA(hrec, 0, "{{ {[1]}");
1142 ok( r == ERROR_SUCCESS, "set string failed\n");
1143 r = MsiRecordSetStringA(hrec, 1, "hoo");
1144 ok( r == ERROR_SUCCESS, "set string failed\n");
1145 sz = sizeof buffer;
1146 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1147 ok( sz == 8, "size wrong\n");
1148 ok( 0 == strcmp(buffer,"{{ {hoo}"), "wrong output\n");
1149 ok( r == ERROR_SUCCESS, "format failed\n");
1150
1151 r = MsiRecordSetStringA(hrec, 0, "{{ {{[1]}");
1152 ok( r == ERROR_SUCCESS, "set string failed\n");
1153 r = MsiRecordSetStringA(hrec, 1, "hoo");
1154 ok( r == ERROR_SUCCESS, "set string failed\n");
1155 sz = sizeof buffer;
1156 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1157 ok( sz == 9, "size wrong\n");
1158 ok( 0 == strcmp(buffer,"{{ {{hoo}"), "wrong output\n");
1159 ok( r == ERROR_SUCCESS, "format failed\n");
1160
1161 r = MsiRecordSetStringA(hrec, 0, "[1]}");
1162 ok( r == ERROR_SUCCESS, "set string failed\n");
1163 r = MsiRecordSetStringA(hrec, 1, "hoo");
1164 ok( r == ERROR_SUCCESS, "set string failed\n");
1165 sz = sizeof buffer;
1166 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1167 ok( sz == 4, "size wrong\n");
1168 ok( 0 == strcmp(buffer,"hoo}"), "wrong output\n");
1169 ok( r == ERROR_SUCCESS, "format failed\n");
1170
1171 r = MsiRecordSetStringA(hrec, 0, "{{ {{a}");
1172 ok( r == ERROR_SUCCESS, "set string failed\n");
1173 sz = sizeof buffer;
1174 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1175 ok( sz == 7, "size wrong\n");
1176 ok( 0 == strcmp(buffer,"{{ {{a}"), "wrong output\n");
1177 ok( r == ERROR_SUCCESS, "format failed\n");
1178
1179 r = MsiRecordSetStringA(hrec, 0, "{{ {{a}");
1180 ok( r == ERROR_SUCCESS, "set string failed\n");
1181 sz = sizeof buffer;
1182 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1183 ok( sz == 7, "size wrong\n");
1184 ok( 0 == strcmp(buffer,"{{ {{a}"), "wrong output\n");
1185 ok( r == ERROR_SUCCESS, "format failed\n");
1186
1187 r = MsiRecordSetStringA(hrec, 0, "0{1{2{3{4[1]5}6}7}8}9");
1188 ok( r == ERROR_SUCCESS, "set string failed\n");
1189 r = MsiRecordSetStringA(hrec, 1, "hoo");
1190 ok( r == ERROR_SUCCESS, "set string failed\n");
1191 sz = sizeof buffer;
1192 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1193 todo_wine
1194 {
1195 ok( sz == 19, "size wrong\n");
1196 ok( 0 == strcmp(buffer,"01{2{3{4hoo56}7}8}9"), "wrong output\n");
1197 }
1198 ok( r == ERROR_SUCCESS, "format failed\n");
1199
1200 r = MsiRecordSetStringA(hrec, 0, "0{1{2[1]3}4");
1201 ok( r == ERROR_SUCCESS, "set string failed\n");
1202 r = MsiRecordSetStringA(hrec, 1, "hoo");
1203 ok( r == ERROR_SUCCESS, "set string failed\n");
1204 sz = sizeof buffer;
1205 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1206 todo_wine
1207 {
1208 ok( sz == 9, "size wrong\n");
1209 ok( 0 == strcmp(buffer,"01{2hoo34"), "wrong output\n");
1210 }
1211 ok( r == ERROR_SUCCESS, "format failed\n");
1212
1213 r = MsiRecordSetStringA(hrec, 0, "0{1{2[1]3}4");
1214 ok( r == ERROR_SUCCESS, "set string failed\n");
1215 r = MsiRecordSetStringA(hrec, 1, "hoo");
1216 ok( r == ERROR_SUCCESS, "set string failed\n");
1217 sz = sizeof buffer;
1218 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1219 todo_wine
1220 {
1221 ok( sz == 9, "size wrong\n");
1222 ok( 0 == strcmp(buffer,"01{2hoo34"), "wrong output\n");
1223 }
1224 ok( r == ERROR_SUCCESS, "format failed\n");
1225
1226 r = MsiRecordSetStringA(hrec, 0, "{[1.} [1]");
1227 ok( r == ERROR_SUCCESS, "set string failed\n");
1228 r = MsiRecordSetStringA(hrec, 1, "hoo");
1229 ok( r == ERROR_SUCCESS, "set string failed\n");
1230 sz = sizeof buffer;
1231 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1232 ok( sz == 9, "size wrong\n");
1233 todo_wine
1234 {
1235 ok( 0 == strcmp(buffer,"{[1.} hoo"), "wrong output\n");
1236 }
1237 ok( r == ERROR_SUCCESS, "format failed\n");
1238
1239 r = MsiRecordSetStringA(hrec, 0, "{[{[1]}]}");
1240 ok( r == ERROR_SUCCESS, "set string failed\n");
1241 r = MsiRecordSetStringA(hrec, 1, "2");
1242 ok( r == ERROR_SUCCESS, "set string failed\n");
1243 r = MsiRecordSetStringA(hrec, 2, "foo");
1244 ok( r == ERROR_SUCCESS, "set string failed\n");
1245 sz = sizeof buffer;
1246 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1247 todo_wine
1248 {
1249 ok( sz == 9, "size wrong\n");
1250 ok( 0 == strcmp(buffer,"{[{[1]}]}"), "wrong output\n");
1251 }
1252 ok( r == ERROR_SUCCESS, "format failed\n");
1253
1254 r = MsiRecordSetStringA(hrec, 0, "{[1][}");
1255 ok( r == ERROR_SUCCESS, "set string failed\n");
1256 r = MsiRecordSetStringA(hrec, 1, "2");
1257 ok( r == ERROR_SUCCESS, "set string failed\n");
1258 r = MsiRecordSetStringA(hrec, 2, "foo");
1259 ok( r == ERROR_SUCCESS, "set string failed\n");
1260 sz = sizeof buffer;
1261 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1262 todo_wine
1263 {
1264 ok( sz == 2, "size wrong\n");
1265 ok( 0 == strcmp(buffer,"2["), "wrong output\n");
1266 }
1267 ok( r == ERROR_SUCCESS, "format failed\n");
1268
1269 r = MsiRecordSetStringA(hrec, 0, "[1]");
1270 ok( r == ERROR_SUCCESS, "set string failed\n");
1271 r = MsiRecordSetStringA(hrec, 1, "[2]");
1272 ok( r == ERROR_SUCCESS, "set string failed\n");
1273 r = MsiRecordSetStringA(hrec, 2, "foo");
1274 ok( r == ERROR_SUCCESS, "set string failed\n");
1275 sz = sizeof buffer;
1276 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1277 ok( sz == 3, "size wrong\n");
1278 ok( 0 == strcmp(buffer,"[2]"), "wrong output\n");
1279 ok( r == ERROR_SUCCESS, "format failed\n");
1280
1281 r = MsiRecordSetStringA(hrec, 0, "[{{boo}}1]");
1282 ok( r == ERROR_SUCCESS, "set string failed\n");
1283 r = MsiRecordSetStringA(hrec, 1, "hoo");
1284 ok( r == ERROR_SUCCESS, "set string failed\n");
1285 sz = sizeof buffer;
1286 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1287 ok( r == ERROR_SUCCESS, "format failed\n");
1288 ok( sz == 3, "size wrong\n");
1289 todo_wine
1290 {
1291 ok( 0 == strcmp(buffer,"[1]"), "wrong output: %s\n", buffer);
1292 }
1293
1294 r = MsiRecordSetStringA(hrec, 0, "[{{boo}}1]");
1295 ok( r == ERROR_SUCCESS, "set string failed\n");
1296 r = MsiRecordSetStringA(hrec, 0, "[1{{boo}}]");
1297 ok( r == ERROR_SUCCESS, "set string failed\n");
1298 r = MsiRecordSetStringA(hrec, 1, "hoo");
1299 ok( r == ERROR_SUCCESS, "set string failed\n");
1300 sz = sizeof buffer;
1301 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1302 ok( sz == 3, "size wrong\n");
1303 ok( 0 == strcmp(buffer,"[1]"), "wrong output\n");
1304 ok( r == ERROR_SUCCESS, "format failed\n");
1305
1306 r = MsiRecordSetStringA(hrec, 0, "{[1]{{boo} }}");
1307 ok( r == ERROR_SUCCESS, "set string failed\n");
1308 r = MsiRecordSetStringA(hrec, 1, "hoo");
1309 ok( r == ERROR_SUCCESS, "set string failed\n");
1310 sz = sizeof buffer;
1311 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1312 todo_wine
1313 {
1314 ok( sz == 11, "size wrong\n");
1315 ok( 0 == strcmp(buffer,"hoo{{boo }}"), "wrong output\n");
1316 }
1317 ok( r == ERROR_SUCCESS, "format failed\n");
1318
1319 r = MsiRecordSetStringA(hrec, 0, "{[1{{boo}}]}");
1320 ok( r == ERROR_SUCCESS, "set string failed\n");
1321 r = MsiRecordSetStringA(hrec, 1, "hoo");
1322 ok( r == ERROR_SUCCESS, "set string failed\n");
1323 sz = sizeof buffer;
1324 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1325 todo_wine
1326 {
1327 ok( sz == 12, "size wrong: got %u, expected 12\n", sz);
1328 ok( 0 == strcmp(buffer,"{[1{{boo}}]}"), "wrong output: got %s, expected [1]\n", buffer);
1329 }
1330 ok( r == ERROR_SUCCESS, "format failed\n");
1331
1332 r = MsiRecordSetStringA(hrec, 0, "{{[1]}");
1333 ok( r == ERROR_SUCCESS, "set string failed\n");
1334 r = MsiRecordSetStringA(hrec, 1, "hoo");
1335 ok( r == ERROR_SUCCESS, "set string failed\n");
1336 sz = sizeof buffer;
1337 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1338 ok( sz == 6, "size wrong: got %u, expected 3\n", sz);
1339 ok( 0 == strcmp(buffer,"{{hoo}"), "wrong output: got %s, expected [1]\n", buffer);
1340 ok( r == ERROR_SUCCESS, "format failed\n");
1341
1342 r = MsiRecordSetStringA(hrec, 0, "{[1{{bo}o}}]}");
1343 ok( r == ERROR_SUCCESS, "set string failed\n");
1344 r = MsiRecordSetStringA(hrec, 1, "hoo");
1345 ok( r == ERROR_SUCCESS, "set string failed\n");
1346 sz = sizeof buffer;
1347 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1348 ok( sz == 13, "size wrong\n");
1349 ok( 0 == strcmp(buffer,"{[1{{bo}o}}]}"), "wrong output %s\n",buffer);
1350 ok( r == ERROR_SUCCESS, "format failed\n");
1351
1352 r = MsiRecordSetStringA(hrec, 0, "{[1{{b{o}o}}]}");
1353 ok( r == ERROR_SUCCESS, "set string failed\n");
1354 sz = sizeof buffer;
1355 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1356 todo_wine
1357 {
1358 ok( sz == 14, "size wrong\n");
1359 ok( 0 == strcmp(buffer,"{[1{{b{o}o}}]}"), "wrong output %s\n",buffer);
1360 }
1361 ok( r == ERROR_SUCCESS, "format failed\n");
1362
1363 r = MsiRecordSetStringA(hrec, 0, "{ {[1]}");
1364 ok( r == ERROR_SUCCESS, "set string failed\n");
1365 r = MsiRecordSetStringA(hrec, 1, "hoo");
1366 ok( r == ERROR_SUCCESS, "set string failed\n");
1367 sz = sizeof buffer;
1368 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1369 todo_wine
1370 {
1371 ok( sz == 5, "size wrong\n");
1372 ok( 0 == strcmp(buffer," {hoo"), "wrong output %s\n",buffer);
1373 }
1374 ok( r == ERROR_SUCCESS, "format failed\n");
1375
1376 /* {} inside a substitution does strange things... */
1377 r = MsiRecordSetStringA(hrec, 0, "[[1]{}]");
1378 ok( r == ERROR_SUCCESS, "set string failed\n");
1379 r = MsiRecordSetStringA(hrec, 1, "2");
1380 ok( r == ERROR_SUCCESS, "set string failed\n");
1381 sz = sizeof buffer;
1382 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1383 todo_wine
1384 {
1385 ok( sz == 5, "size wrong\n");
1386 ok( 0 == strcmp(buffer,"[[1]]"), "wrong output %s\n",buffer);
1387 }
1388 ok( r == ERROR_SUCCESS, "format failed\n");
1389
1390 r = MsiRecordSetStringA(hrec, 0, "[[1]{}[1]]");
1391 ok( r == ERROR_SUCCESS, "set string failed\n");
1392 r = MsiRecordSetStringA(hrec, 1, "2");
1393 ok( r == ERROR_SUCCESS, "set string failed\n");
1394 sz = sizeof buffer;
1395 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1396 todo_wine
1397 {
1398 ok( sz == 6, "size wrong\n");
1399 ok( 0 == strcmp(buffer,"[[1]2]"), "wrong output %s\n",buffer);
1400 }
1401 ok( r == ERROR_SUCCESS, "format failed\n");
1402
1403 r = MsiRecordSetStringA(hrec, 0, "[a[1]b[1]c{}d[1]e]");
1404 ok( r == ERROR_SUCCESS, "set string failed\n");
1405 r = MsiRecordSetStringA(hrec, 1, "2");
1406 ok( r == ERROR_SUCCESS, "set string failed\n");
1407 sz = sizeof buffer;
1408 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1409 todo_wine
1410 {
1411 ok( sz == 14, "size wrong\n");
1412 ok( 0 == strcmp(buffer,"[a[1]b[1]cd2e]"), "wrong output %s\n",buffer);
1413 }
1414 ok( r == ERROR_SUCCESS, "format failed\n");
1415
1416 r = MsiRecordSetStringA(hrec, 0, "[a[1]b");
1417 ok( r == ERROR_SUCCESS, "set string failed\n");
1418 r = MsiRecordSetStringA(hrec, 1, "2");
1419 ok( r == ERROR_SUCCESS, "set string failed\n");
1420 sz = sizeof buffer;
1421 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1422 ok( sz == 6, "size wrong\n");
1423 ok( 0 == strcmp(buffer,"[a[1]b"), "wrong output %s\n",buffer);
1424 ok( r == ERROR_SUCCESS, "format failed\n");
1425
1426 r = MsiRecordSetStringA(hrec, 0, "a[1]b]");
1427 ok( r == ERROR_SUCCESS, "set string failed\n");
1428 r = MsiRecordSetStringA(hrec, 1, "2");
1429 ok( r == ERROR_SUCCESS, "set string failed\n");
1430 sz = sizeof buffer;
1431 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1432 ok( sz == 4, "size wrong\n");
1433 ok( 0 == strcmp(buffer,"a2b]"), "wrong output %s\n",buffer);
1434 ok( r == ERROR_SUCCESS, "format failed\n");
1435
1436 r = MsiRecordSetStringA(hrec, 0, "]a[1]b");
1437 ok( r == ERROR_SUCCESS, "set string failed\n");
1438 r = MsiRecordSetStringA(hrec, 1, "2");
1439 ok( r == ERROR_SUCCESS, "set string failed\n");
1440 sz = sizeof buffer;
1441 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1442 ok( sz == 4, "size wrong\n");
1443 ok( 0 == strcmp(buffer,"]a2b"), "wrong output %s\n",buffer);
1444 ok( r == ERROR_SUCCESS, "format failed\n");
1445
1446 r = MsiRecordSetStringA(hrec, 0, "]a[1]b");
1447 ok( r == ERROR_SUCCESS, "set string failed\n");
1448 r = MsiRecordSetStringA(hrec, 1, "2");
1449 ok( r == ERROR_SUCCESS, "set string failed\n");
1450 sz = sizeof buffer;
1451 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1452 ok( sz == 4, "size wrong\n");
1453 ok( 0 == strcmp(buffer,"]a2b"), "wrong output %s\n",buffer);
1454 ok( r == ERROR_SUCCESS, "format failed\n");
1455
1456 r = MsiRecordSetStringA(hrec, 0, "\\[1]");
1457 ok( r == ERROR_SUCCESS, "set string failed\n");
1458 r = MsiRecordSetStringA(hrec, 1, "2");
1459 ok( r == ERROR_SUCCESS, "set string failed\n");
1460 sz = sizeof buffer;
1461 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1462 ok( sz == 2, "size wrong\n");
1463 ok( 0 == strcmp(buffer,"\\2"), "wrong output %s\n",buffer);
1464 ok( r == ERROR_SUCCESS, "format failed\n");
1465
1466 r = MsiRecordSetStringA(hrec, 0, "\\{[1]}");
1467 ok( r == ERROR_SUCCESS, "set string failed\n");
1468 r = MsiRecordSetStringA(hrec, 1, "2");
1469 ok( r == ERROR_SUCCESS, "set string failed\n");
1470 sz = sizeof buffer;
1471 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1472 ok( sz == 2, "size wrong\n");
1473 ok( 0 == strcmp(buffer,"\\2"), "wrong output %s\n",buffer);
1474 ok( r == ERROR_SUCCESS, "format failed\n");
1475
1476 r = MsiRecordSetStringA(hrec, 0, "a{b[1]c}d");
1477 ok( r == ERROR_SUCCESS, "set string failed\n");
1478 r = MsiRecordSetStringA(hrec, 1, NULL);
1479 ok( r == ERROR_SUCCESS, "set string failed\n");
1480 sz = sizeof buffer;
1481 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1482 ok( sz == 2, "size wrong\n");
1483 ok( 0 == strcmp(buffer,"ad"), "wrong output %s\n",buffer);
1484 ok( r == ERROR_SUCCESS, "format failed\n");
1485
1486 r = MsiRecordSetStringA(hrec, 0, "{a[0]b}");
1487 ok( r == ERROR_SUCCESS, "set string failed\n");
1488 r = MsiRecordSetStringA(hrec, 1, "foo");
1489 ok( r == ERROR_SUCCESS, "set string failed\n");
1490 sz = sizeof buffer;
1491 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1492 ok( sz == 9, "size wrong\n");
1493 ok( 0 == strcmp(buffer,"a{a[0]b}b"), "wrong output %s\n",buffer);
1494 ok( r == ERROR_SUCCESS, "format failed\n");
1495
1496 r = MsiRecordSetStringA(hrec, 0, "[foo]");
1497 ok( r == ERROR_SUCCESS, "set string failed\n");
1498 sz = sizeof buffer;
1499 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1500 ok( sz == 5, "size wrong\n");
1501 ok( 0 == strcmp(buffer,"[foo]"), "wrong output %s\n",buffer);
1502 ok( r == ERROR_SUCCESS, "format failed\n");
1503
1504 r = MsiRecordSetStringA(hrec, 0, "{[1][-1][1]}");
1505 ok( r == ERROR_SUCCESS, "set string failed\n");
1506 r = MsiRecordSetStringA(hrec, 1, "foo");
1507 ok( r == ERROR_SUCCESS, "set string failed\n");
1508 sz = sizeof buffer;
1509 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1510 todo_wine
1511 {
1512 ok( sz == 12, "size wrong\n");
1513 ok( 0 == strcmp(buffer,"{foo[-1]foo}"), "wrong output %s\n",buffer);
1514 }
1515 ok( r == ERROR_SUCCESS, "format failed\n");
1516
1517 /* nested braces */
1518 sz = sizeof buffer;
1519 r = MsiRecordSetStringA(hrec, 0, "{abcd}");
1520 ok( r == ERROR_SUCCESS, "set string failed\n");
1521 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1522 ok( r == ERROR_SUCCESS, "format failed\n");
1523 ok( sz == 6, "size wrong(%i)\n",sz);
1524 ok( 0 == strcmp(buffer,"{abcd}"), "wrong output (%s)\n",buffer);
1525
1526 sz = sizeof buffer;
1527 r = MsiRecordSetStringA(hrec, 0, "{a[one]bc[two]de[one]f}");
1528 ok( r == ERROR_SUCCESS, "set string failed\n");
1529 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1530 ok( r == ERROR_SUCCESS, "format failed\n");
1531 ok( sz == 23, "size wrong(%i)\n",sz);
1532 ok( 0 == strcmp(buffer,"{a[one]bc[two]de[one]f}"), "wrong output (%s)\n",buffer);
1533
1534 sz = sizeof buffer;
1535 r = MsiRecordSetStringA(hrec, 0, "{a[one]bc[bad]de[two]f}");
1536 ok( r == ERROR_SUCCESS, "set string failed\n");
1537 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1538 ok( r == ERROR_SUCCESS, "format failed\n");
1539 ok( sz == 23, "size wrong(%i)\n",sz);
1540 ok( 0 == strcmp(buffer,"{a[one]bc[bad]de[two]f}"), "wrong output (%s)\n",buffer);
1541
1542 sz = sizeof buffer;
1543 r = MsiRecordSetStringA(hrec, 0, "{[bad]}");
1544 ok( r == ERROR_SUCCESS, "set string failed\n");
1545 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1546 ok( r == ERROR_SUCCESS, "format failed\n");
1547 ok( sz == 7, "size wrong(%i)\n",sz);
1548 ok( 0 == strcmp(buffer,"{[bad]}"), "wrong output (%s)\n",buffer);
1549
1550 sz = sizeof buffer;
1551 r = MsiRecordSetStringA(hrec, 0, "{abc{d[one]ef}"); /* missing final brace */
1552 ok( r == ERROR_SUCCESS, "set string failed\n");
1553 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1554 ok( r == ERROR_SUCCESS, "format failed\n");
1555 ok( sz == 14, "size wrong(%i)\n",sz);
1556 ok( 0 == strcmp(buffer,"{abc{d[one]ef}"), "wrong output (%s)\n",buffer);
1557
1558 sz = sizeof buffer;
1559 r = MsiRecordSetStringA(hrec, 0, "{abc{d[one]ef}}");
1560 ok( r == ERROR_SUCCESS, "set string failed\n");
1561 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1562 ok( r == ERROR_SUCCESS, "format failed\n");
1563 ok( sz == 15, "size wrong(%i)\n",sz);
1564 ok( 0 == strcmp(buffer,"{abc{d[one]ef}}"), "wrong output (%s)\n",buffer);
1565
1566 sz = sizeof buffer;
1567 r = MsiRecordSetStringA(hrec, 0, "{abc}{{def}hi{j[one]k}}");
1568 ok( r == ERROR_SUCCESS, "set string failed\n");
1569 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1570 ok( r == ERROR_SUCCESS, "format failed\n");
1571 ok( sz == 5, "size wrong(%i)\n",sz);
1572 ok( 0 == strcmp(buffer,"{abc}"), "wrong output (%s)\n",buffer);
1573
1574 sz = sizeof buffer;
1575 r = MsiRecordSetStringA(hrec, 0, "{{def}hi{j[one]k}}");
1576 ok( r == ERROR_SUCCESS, "set string failed\n");
1577 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1578 ok( r == ERROR_SUCCESS, "format failed\n");
1579 ok( sz == 0, "size wrong(%i)\n",sz);
1580 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
1581
1582 sz = sizeof buffer;
1583 r = MsiRecordSetStringA(hrec, 0, "{{def}hi{jk}}");
1584 ok( r == ERROR_SUCCESS, "set string failed\n");
1585 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1586 ok( r == ERROR_SUCCESS, "format failed\n");
1587 ok( sz == 0, "size wrong(%i)\n",sz);
1588 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
1589
1590 sz = sizeof buffer;
1591 r = MsiRecordSetStringA(hrec, 0, "{{{def}}hi{jk}}");
1592 ok( r == ERROR_SUCCESS, "set string failed\n");
1593 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1594 ok( r == ERROR_SUCCESS, "format failed\n");
1595 todo_wine
1596 {
1597 ok( sz == 7, "size wrong(%i)\n",sz);
1598 ok( 0 == strcmp(buffer,"hi{jk}}"), "wrong output (%s)\n",buffer);
1599 }
1600
1601 sz = sizeof buffer;
1602 r = MsiRecordSetStringA(hrec, 0, "{{def}hi{{jk}}}");
1603 ok( r == ERROR_SUCCESS, "set string failed\n");
1604 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1605 ok( r == ERROR_SUCCESS, "format failed\n");
1606 todo_wine
1607 {
1608 ok( sz == 1, "size wrong(%i)\n",sz);
1609 ok( 0 == strcmp(buffer,"}"), "wrong output (%s)\n",buffer);
1610 }
1611
1612 sz = sizeof buffer;
1613 r = MsiRecordSetStringA(hrec, 0, "{{def}{jk}}");
1614 ok( r == ERROR_SUCCESS, "set string failed\n");
1615 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1616 ok( r == ERROR_SUCCESS, "format failed\n");
1617 ok( sz == 0, "size wrong(%i)\n",sz);
1618 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
1619
1620 sz = sizeof buffer;
1621 r = MsiRecordSetStringA(hrec, 0, "{{def}}");
1622 ok( r == ERROR_SUCCESS, "set string failed\n");
1623 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1624 ok( r == ERROR_SUCCESS, "format failed\n");
1625 ok( sz == 0, "size wrong(%i)\n",sz);
1626 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
1627
1628 sz = sizeof buffer;
1629 r = MsiRecordSetStringA(hrec, 0, "{a{b}c}");
1630 ok( r == ERROR_SUCCESS, "set string failed\n");
1631 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1632 ok( r == ERROR_SUCCESS, "format failed\n");
1633 ok( sz == 7, "size wrong(%i)\n",sz);
1634 ok( 0 == strcmp(buffer,"{a{b}c}"), "wrong output (%s)\n",buffer);
1635
1636 sz = sizeof buffer;
1637 r = MsiRecordSetStringA(hrec, 0, "{a{b}}");
1638 ok( r == ERROR_SUCCESS, "set string failed\n");
1639 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1640 ok( r == ERROR_SUCCESS, "format failed\n");
1641 ok( sz == 6, "size wrong(%i)\n",sz);
1642 ok( 0 == strcmp(buffer,"{a{b}}"), "wrong output (%s)\n",buffer);
1643
1644 sz = sizeof buffer;
1645 r = MsiRecordSetStringA(hrec, 0, "{{b}c}");
1646 ok( r == ERROR_SUCCESS, "set string failed\n");
1647 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1648 ok( r == ERROR_SUCCESS, "format failed\n");
1649 ok( sz == 6, "size wrong(%i)\n",sz);
1650 ok( 0 == strcmp(buffer,"{{b}c}"), "wrong output (%s)\n",buffer);
1651
1652 sz = sizeof buffer;
1653 r = MsiRecordSetStringA(hrec, 0, "{{{{}}}}");
1654 ok( r == ERROR_SUCCESS, "set string failed\n");
1655 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1656 ok( r == ERROR_SUCCESS, "format failed\n");
1657 todo_wine
1658 {
1659 ok( sz == 2, "size wrong(%i)\n",sz);
1660 ok( 0 == strcmp(buffer,"}}"), "wrong output (%s)\n",buffer);
1661 }
1662
1663 sz = sizeof buffer;
1664 MsiRecordSetInteger(hrec, 1, 100);
1665 MsiRecordSetInteger(hrec, 2, -100);
1666 r = MsiRecordSetStringA(hrec, 0, "[1] [2]");
1667 ok( r == ERROR_SUCCESS, "set string failed\n");
1668 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1669 ok( r == ERROR_SUCCESS, "format failed\n");
1670 ok( sz == 8, "size wrong(%i)\n",sz);
1671 ok( 0 == strcmp(buffer,"100 -100"), "wrong output (%s)\n",buffer);
1672
1673 sz = sizeof(buffer);
1674 r = MsiRecordSetStringA(hrec, 0, "[1] {[noprop] [twoprop]} {abcdef}");
1675 ok( r == ERROR_SUCCESS, "set string failed\n");
1676 r = MsiRecordSetStringA(hrec, 1, "one");
1677 ok( r == ERROR_SUCCESS, "set string failed\n");
1678 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1679 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1680 ok(sz == 33, "Expected 33, got %d\n",sz);
1681 ok(!lstrcmpA(buffer, "one {[noprop] [twoprop]} {abcdef}"),
1682 "Expected \"one {[noprop] [twoprop]} {abcdef}\", got \"%s\"\n", buffer);
1683
1684 sz = sizeof(buffer);
1685 r = MsiRecordSetStringA(hrec, 0, "[1] {[noprop] [one]} {abcdef}");
1686 ok( r == ERROR_SUCCESS, "set string failed\n");
1687 r = MsiRecordSetStringA(hrec, 1, "one");
1688 ok( r == ERROR_SUCCESS, "set string failed\n");
1689 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1690 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1691 ok(sz == 29, "Expected 29, got %d\n",sz);
1692 ok(!lstrcmpA(buffer, "one {[noprop] [one]} {abcdef}"),
1693 "Expected \"one {[noprop] [one]} {abcdef}\", got \"%s\"\n", buffer);
1694
1695 sz = sizeof(buffer);
1696 r = MsiRecordSetStringA(hrec, 0, "[1] {[one]} {abcdef}");
1697 ok( r == ERROR_SUCCESS, "set string failed\n");
1698 r = MsiRecordSetStringA(hrec, 1, "one");
1699 ok( r == ERROR_SUCCESS, "set string failed\n");
1700 r = MsiFormatRecordA(0, hrec, buffer, &sz);
1701 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1702 ok(sz == 20, "Expected 20, got %d\n",sz);
1703 ok(!lstrcmpA(buffer, "one {[one]} {abcdef}"),
1704 "Expected \"one {[one]} {abcdef}\", got \"%s\"\n", buffer);
1705
1706 MsiCloseHandle( hrec );
1707 }
1708
1709 static void test_formatrecord_package(void)
1710 {
1711 char buffer[100];
1712 MSIHANDLE hrec;
1713 MSIHANDLE package;
1714 UINT r;
1715 DWORD sz=100;
1716
1717 r = helper_createpackage( msifile, &package );
1718 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
1719 {
1720 skip("Not enough rights to perform tests\n");
1721 return;
1722 }
1723 ok( r == ERROR_SUCCESS, "Unable to create package %u\n", r );
1724
1725 hrec = MsiCreateRecord(12);
1726 ok( hrec, "failed to create record\n");
1727
1728 r = MsiFormatRecordA(package, 0, NULL, NULL );
1729 ok( r == ERROR_INVALID_HANDLE, "wrong error\n");
1730
1731 r = MsiFormatRecordA(package, hrec, NULL, NULL );
1732 ok( r == ERROR_SUCCESS, "format failed\n");
1733
1734 r = MsiRecordSetStringA(hrec,0,NULL);
1735 ok( r == ERROR_SUCCESS, "set string failed\n");
1736 r = MsiRecordSetStringA(hrec,1,NULL);
1737 ok( r == ERROR_SUCCESS, "set string failed\n");
1738 r = MsiRecordSetStringA(hrec,2,NULL);
1739 ok( r == ERROR_SUCCESS, "set string failed\n");
1740 r = MsiRecordSetStringA(hrec,3,NULL);
1741 ok( r == ERROR_SUCCESS, "set string failed\n");
1742 r = MsiRecordSetStringA(hrec,4,NULL);
1743 ok( r == ERROR_SUCCESS, "set string failed\n");
1744 r = MsiRecordSetStringA(hrec,5,NULL);
1745 ok( r == ERROR_SUCCESS, "set string failed\n");
1746 r = MsiRecordSetStringA(hrec,6,NULL);
1747 ok( r == ERROR_SUCCESS, "set string failed\n");
1748 r = MsiRecordSetStringA(hrec,7,NULL);
1749 ok( r == ERROR_SUCCESS, "set string failed\n");
1750 r = MsiRecordSetStringA(hrec,8,NULL);
1751 ok( r == ERROR_SUCCESS, "set string failed\n");
1752 r = MsiRecordSetStringA(hrec,9,NULL);
1753 ok( r == ERROR_SUCCESS, "set string failed\n");
1754 r = MsiRecordSetStringA(hrec,10,NULL);
1755 ok( r == ERROR_SUCCESS, "set string failed\n");
1756 r = MsiRecordSetStringA(hrec,11,NULL);
1757 ok( r == ERROR_SUCCESS, "set string failed\n");
1758 r = MsiRecordSetStringA(hrec,12,NULL);
1759 ok( r == ERROR_SUCCESS, "set string failed\n");
1760
1761 sz = sizeof buffer;
1762 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1763 ok( r == ERROR_SUCCESS, "format failed with empty buffer (%i)\n",r);
1764 ok( sz == 51, "size wrong (%i)\n",sz);
1765 ok( 0 == strcmp(buffer,"1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: "), "wrong output(%s)\n",buffer);
1766
1767 r = MsiSetPropertyA(package, "prop", "val");
1768 ok( r == ERROR_SUCCESS, "failed to set propertY: %d\n", r);
1769
1770 r = MsiRecordSetStringA(hrec, 0, NULL);
1771 ok( r == ERROR_SUCCESS, "set string failed\n");
1772 r = MsiRecordSetStringA(hrec, 1, "[2]");
1773 ok( r == ERROR_SUCCESS, "set string failed\n");
1774 r = MsiRecordSetStringA(hrec, 2, "stuff");
1775 ok( r == ERROR_SUCCESS, "set string failed\n");
1776 r = MsiRecordSetStringA(hrec, 3, "prop");
1777 ok( r == ERROR_SUCCESS, "set string failed\n");
1778 r = MsiRecordSetStringA(hrec, 4, "[prop]");
1779 ok( r == ERROR_SUCCESS, "set string failed\n");
1780 r = MsiRecordSetStringA(hrec, 5, "[noprop]");
1781 ok( r == ERROR_SUCCESS, "set string failed\n");
1782 sz = sizeof buffer;
1783 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1784 ok( r == ERROR_SUCCESS, "format failed with empty buffer (%i)\n",r);
1785 todo_wine
1786 {
1787 ok( sz == 66, "size wrong (%i)\n",sz);
1788 ok( !lstrcmpA(buffer,
1789 "1: [2] 2: stuff 3: prop 4: val 5: 6: 7: 8: 9: 10: 11: 12: "),
1790 "wrong output(%s)\n",buffer);
1791 }
1792
1793 /* now put play games with escaping */
1794 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [\\3asdf]");
1795 ok( r == ERROR_SUCCESS, "set string failed\n");
1796 r = MsiRecordSetStringA(hrec, 1, "boo");
1797 ok( r == ERROR_SUCCESS, "set string failed\n");
1798 r = MsiRecordSetStringA(hrec, 2, "hoo");
1799 ok( r == ERROR_SUCCESS, "set string failed\n");
1800 sz = sizeof buffer;
1801 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1802 ok( r == ERROR_SUCCESS, "format failed\n");
1803 ok( sz == 9, "size wrong(%i)\n",sz);
1804 ok( 0 == strcmp(buffer,"boo hoo 3"), "wrong output (%s)\n",buffer);
1805
1806 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [\\x]");
1807 ok( r == ERROR_SUCCESS, "set string failed\n");
1808 r = MsiRecordSetStringA(hrec, 1, "boo");
1809 ok( r == ERROR_SUCCESS, "set string failed\n");
1810 r = MsiRecordSetStringA(hrec, 2, "hoo");
1811 ok( r == ERROR_SUCCESS, "set string failed\n");
1812 sz = sizeof buffer;
1813 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1814 ok( r == ERROR_SUCCESS, "format failed\n");
1815 ok( sz == 9, "size wrong(%i)\n",sz);
1816 ok( 0 == strcmp(buffer,"boo hoo x"), "wrong output (%s)\n",buffer);
1817
1818 MsiRecordSetStringA(hrec, 0, "[\\x]");
1819 sz = sizeof buffer;
1820 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1821 ok( r == ERROR_SUCCESS, "format failed\n");
1822 ok( sz == 1, "size wrong: %d\n", sz);
1823 ok( 0 == strcmp(buffer,"x"), "wrong output: %s\n", buffer);
1824
1825 MsiRecordSetStringA(hrec, 0, "{\\x}");
1826 sz = sizeof buffer;
1827 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1828 ok( r == ERROR_SUCCESS, "format failed\n");
1829 ok( sz == 4, "size wrong: %d\n", sz);
1830 ok( 0 == strcmp(buffer,"{\\x}"), "wrong output: %s\n", buffer);
1831
1832 MsiRecordSetStringA(hrec, 0, "[abc\\x]");
1833 sz = sizeof buffer;
1834 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1835 ok( r == ERROR_SUCCESS, "format failed\n");
1836 ok( sz == 0, "size wrong: %d\n", sz);
1837 ok( 0 == strcmp(buffer,""), "wrong output: %s\n", buffer);
1838
1839 MsiRecordSetStringA(hrec, 0, "[abc\\xdef]");
1840 sz = sizeof buffer;
1841 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1842 ok( r == ERROR_SUCCESS, "format failed\n");
1843 ok( sz == 0, "size wrong: %d\n", sz);
1844 ok( 0 == strcmp(buffer,""), "wrong output: %s\n", buffer);
1845
1846 MsiRecordSetStringA(hrec, 0, "\\x");
1847 sz = sizeof(buffer);
1848 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1849 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1850 ok(sz == 2, "Expected 2, got %d\n", sz);
1851 ok(!lstrcmpA(buffer, "\\x"), "Expected \"\\x\", got \"%s\"\n", buffer);
1852
1853 MsiRecordSetStringA(hrec, 0, "[\\[");
1854 sz = sizeof(buffer);
1855 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1856 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1857 ok(sz == 3, "Expected 3, got %d\n", sz);
1858 ok(!lstrcmpA(buffer, "[\\["), "Expected \"[\\[\", got \"%s\"\n", buffer);
1859
1860 MsiRecordSetStringA(hrec, 0, "[\\[]");
1861 sz = sizeof(buffer);
1862 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1863 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1864 ok(sz == 1, "Expected 1, got %d\n", sz);
1865 ok(!lstrcmpA(buffer, "["), "Expected \"[\", got \"%s\"\n", buffer);
1866
1867 MsiRecordSetStringA(hrec, 0, "[[]");
1868 sz = sizeof(buffer);
1869 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1870 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1871 ok(sz == 3, "Expected 3, got %d\n", sz);
1872 ok(!lstrcmpA(buffer, "[[]"), "Expected \"[]\", got \"%s\"\n", buffer);
1873
1874 MsiRecordSetStringA(hrec, 0, "[\\[]]");
1875 sz = sizeof(buffer);
1876 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1877 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1878 ok(sz == 2, "Expected 2, got %d\n", sz);
1879 ok(!lstrcmpA(buffer, "[]"), "Expected \"[]\", got \"%s\"\n", buffer);
1880
1881 MsiRecordSetStringA(hrec, 0, "[\\[a]");
1882 sz = sizeof(buffer);
1883 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1884 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1885 ok(sz == 1, "Expected 1, got %d\n", sz);
1886 ok(!lstrcmpA(buffer, "["), "Expected \"[\", got \"%s\"\n", buffer);
1887
1888 MsiRecordSetStringA(hrec, 0, "[\\a[]");
1889 sz = sizeof(buffer);
1890 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1891 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1892 todo_wine
1893 {
1894 ok(sz == 1, "Expected 1, got %d\n", sz);
1895 ok(!lstrcmpA(buffer, "a"), "Expected \"a\", got \"%s\"\n", buffer);
1896 }
1897
1898 MsiRecordSetStringA(hrec, 0, "[prop]");
1899 sz = sizeof(buffer);
1900 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1901 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1902 ok(sz == 3, "Expected 3, got %d\n", sz);
1903 ok(!lstrcmpA(buffer, "val"), "Expected \"val\", got \"%s\"\n", buffer);
1904
1905 MsiRecordSetStringA(hrec, 0, "[prop] [pro\\pblah] [prop]");
1906 sz = sizeof(buffer);
1907 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1908 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1909 ok(sz == 8, "Expected 8, got %d\n", sz);
1910 ok(!lstrcmpA(buffer, "val val"), "Expected \"val val\", got \"%s\"\n", buffer);
1911
1912 MsiSetPropertyA(package, "b", "ball");
1913 MsiRecordSetStringA(hrec, 0, "[\\b]");
1914 sz = sizeof(buffer);
1915 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1916 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1917 ok(sz == 1, "Expected 1, got %d\n", sz);
1918 ok(!lstrcmpA(buffer, "b"), "Expected \"b\", got \"%s\"\n", buffer);
1919
1920 MsiRecordSetStringA(hrec, 0, "[\\c]");
1921 sz = sizeof(buffer);
1922 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1923 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1924 ok(sz == 1, "Expected 1, got %d\n", sz);
1925 ok(!lstrcmpA(buffer, "c"), "Expected \"c\", got \"%s\"\n", buffer);
1926
1927 MsiRecordSetStringA(hrec, 0, "[\\[]prop]");
1928 sz = sizeof(buffer);
1929 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1930 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1931 ok(sz == 6, "Expected 6, got %d\n", sz);
1932 ok(!lstrcmpA(buffer, "[prop]"), "Expected \"[prop]\", got \"%s\"\n", buffer);
1933
1934 MsiRecordSetStringA(hrec, 0, "[\\a]prop]");
1935 sz = sizeof(buffer);
1936 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1937 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1938 ok(sz == 6, "Expected 6, got %d\n", sz);
1939 ok(!lstrcmpA(buffer, "aprop]"), "Expected \"aprop]\", got \"%s\"\n", buffer);
1940
1941 MsiRecordSetStringA(hrec, 0, "[\\[]Bracket Text[\\]]");
1942 sz = sizeof buffer;
1943 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1944 ok( r == ERROR_SUCCESS, "format failed\n");
1945 ok( sz == 14, "size wrong: %d\n", sz);
1946 ok( 0 == strcmp(buffer,"[Bracket Text]"), "wrong output: %s\n", buffer);
1947
1948 /* null characters */
1949 r = MsiRecordSetStringA(hrec, 0, "[1] [~] [2]");
1950 ok( r == ERROR_SUCCESS, "set string failed\n");
1951 r = MsiRecordSetStringA(hrec, 1, "boo");
1952 ok( r == ERROR_SUCCESS, "set string failed\n");
1953 r = MsiRecordSetStringA(hrec, 2, "hoo");
1954 ok( r == ERROR_SUCCESS, "set string failed\n");
1955 sz = sizeof buffer;
1956 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1957 ok( r == ERROR_SUCCESS, "format failed\n");
1958 ok( sz == 9, "size wrong: %d\n", sz);
1959 ok( 0 == strcmp(buffer,"boo "), "wrong output: %s\n", buffer);
1960 ok(!lstrcmpA(&buffer[5], " hoo"),
1961 "Expected \" hoo\", got \"%s\"\n", &buffer[5]);
1962
1963 r = MsiRecordSetStringA(hrec, 0, "[1] [~abc] [2]");
1964 ok( r == ERROR_SUCCESS, "set string failed\n");
1965 r = MsiRecordSetStringA(hrec, 1, "boo");
1966 ok( r == ERROR_SUCCESS, "set string failed\n");
1967 r = MsiRecordSetStringA(hrec, 2, "hoo");
1968 ok( r == ERROR_SUCCESS, "set string failed\n");
1969 sz = sizeof(buffer);
1970 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1971 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
1972 ok(sz == 8, "Expected 8, got %d\n", sz);
1973 ok(!lstrcmpA(buffer, "boo hoo"), "Expected \"boo hoo\", got \"%s\"\n", buffer);
1974
1975 /* properties */
1976 r = MsiSetPropertyA(package,"dummy","Bork");
1977 ok( r == ERROR_SUCCESS, "set property failed\n");
1978 r = MsiRecordSetStringA(hrec, 0, "[1] [dummy] [2]");
1979 ok( r == ERROR_SUCCESS, "set string failed\n");
1980 r = MsiRecordSetStringA(hrec, 1, "boo");
1981 ok( r == ERROR_SUCCESS, "set string failed\n");
1982 r = MsiRecordSetStringA(hrec, 2, "hoo");
1983 ok( r == ERROR_SUCCESS, "set string failed\n");
1984 sz = sizeof buffer;
1985 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1986 ok( r == ERROR_SUCCESS, "format failed\n");
1987 ok( sz == 12, "size wrong\n");
1988 ok( 0 == strcmp(buffer,"boo Bork hoo"), "wrong output\n");
1989
1990 r = MsiRecordSetStringA(hrec, 0, "[1] [invalid] [2]");
1991 ok( r == ERROR_SUCCESS, "set string failed\n");
1992 r = MsiRecordSetStringA(hrec, 1, "boo");
1993 ok( r == ERROR_SUCCESS, "set string failed\n");
1994 r = MsiRecordSetStringA(hrec, 2, "hoo");
1995 ok( r == ERROR_SUCCESS, "set string failed\n");
1996 sz = sizeof buffer;
1997 r = MsiFormatRecordA(package, hrec, buffer, &sz);
1998 ok( r == ERROR_SUCCESS, "format failed\n");
1999 ok( sz == 8, "size wrong\n");
2000 ok( 0 == strcmp(buffer,"boo hoo"), "wrong output\n");
2001
2002 /* nesting tests */
2003 r = MsiSetPropertyA(package,"dummya","foo");
2004 ok( r == ERROR_SUCCESS, "set string failed\n");
2005 r = MsiSetPropertyA(package,"dummyb","baa");
2006 ok( r == ERROR_SUCCESS, "set string failed\n");
2007 r = MsiSetPropertyA(package,"adummyc","whoa");
2008 ok( r == ERROR_SUCCESS, "set property failed\n");
2009 r = MsiRecordSetStringA(hrec, 0, "[dummy[1]] [dummy[2]] [[1]dummy[3]]");
2010 ok( r == ERROR_SUCCESS, "set string failed\n");
2011 r = MsiRecordSetStringA(hrec, 1, "a");
2012 ok( r == ERROR_SUCCESS, "set string failed\n");
2013 r = MsiRecordSetStringA(hrec, 2, "b");
2014 ok( r == ERROR_SUCCESS, "set string failed\n");
2015 r = MsiRecordSetStringA(hrec, 3, "c");
2016 ok( r == ERROR_SUCCESS, "set string failed\n");
2017 sz = sizeof buffer;
2018 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2019 ok( r == ERROR_SUCCESS, "format failed\n");
2020 ok( sz == 12, "size wrong(%i)\n",sz);
2021 ok( 0 == strcmp(buffer,"foo baa whoa"), "wrong output (%s)\n",buffer);
2022
2023 r = MsiSetPropertyA(package,"dummya","1");
2024 ok( r == ERROR_SUCCESS, "set property failed\n");
2025 r = MsiSetPropertyA(package,"dummyb","[2]");
2026 ok( r == ERROR_SUCCESS, "set property failed\n");
2027 r = MsiRecordSetStringA(hrec, 0, "[dummya] [[dummya]] [dummyb]");
2028 ok( r == ERROR_SUCCESS, "set string failed\n");
2029 r = MsiRecordSetStringA(hrec, 1, "aaa");
2030 ok( r == ERROR_SUCCESS, "set string failed\n");
2031 r = MsiRecordSetStringA(hrec, 2, "bbb");
2032 ok( r == ERROR_SUCCESS, "set string failed\n");
2033 r = MsiRecordSetStringA(hrec, 3, "ccc");
2034 ok( r == ERROR_SUCCESS, "set string failed\n");
2035 sz = sizeof buffer;
2036 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2037 ok( r == ERROR_SUCCESS, "format failed\n");
2038 todo_wine
2039 {
2040 ok( sz == 9, "size wrong(%i)\n",sz);
2041 ok( 0 == strcmp(buffer,"1 [1] [2]"), "wrong output (%s)\n",buffer);
2042 }
2043
2044 r = MsiSetPropertyA(package,"dummya","1");
2045 ok( r == ERROR_SUCCESS, "set property failed\n");
2046 r = MsiSetPropertyA(package,"dummyb","a");
2047 ok( r == ERROR_SUCCESS, "set property failed\n");
2048 r = MsiSetPropertyA(package,"dummyc","\\blath");
2049 ok( r == ERROR_SUCCESS, "set property failed\n");
2050 r = MsiSetPropertyA(package,"dummyd","[\\blath]");
2051 ok( r == ERROR_SUCCESS, "set property failed\n");
2052 r = MsiRecordSetStringA(hrec, 0, "[dummyc] [[dummyc]] [dummy[dummyb]]");
2053 ok( r == ERROR_SUCCESS, "set string failed\n");
2054 r = MsiRecordSetStringA(hrec, 1, "aaa");
2055 ok( r == ERROR_SUCCESS, "set string failed\n");
2056 r = MsiRecordSetStringA(hrec, 2, "bbb");
2057 ok( r == ERROR_SUCCESS, "set string failed\n");
2058 r = MsiRecordSetStringA(hrec, 3, "ccc");
2059 ok( r == ERROR_SUCCESS, "set string failed\n");
2060 sz = sizeof buffer;
2061 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2062 ok( r == ERROR_SUCCESS, "format failed\n");
2063 ok( sz == 10, "size wrong(%i)\n",sz);
2064 ok( 0 == strcmp(buffer,"\\blath b 1"), "wrong output (%s)\n",buffer);
2065
2066 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [[\\3asdf]]");
2067 ok( r == ERROR_SUCCESS, "set string failed\n");
2068 r = MsiRecordSetStringA(hrec, 1, "boo");
2069 ok( r == ERROR_SUCCESS, "set string failed\n");
2070 r = MsiRecordSetStringA(hrec, 2, "hoo");
2071 ok( r == ERROR_SUCCESS, "set string failed\n");
2072 r = MsiRecordSetStringA(hrec, 3, "yeah");
2073 ok( r == ERROR_SUCCESS, "set string failed\n");
2074 sz = sizeof buffer;
2075 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2076 ok( r == ERROR_SUCCESS, "format failed\n");
2077 todo_wine
2078 {
2079 ok( sz == 11, "size wrong(%i)\n",sz);
2080 ok( 0 == strcmp(buffer,"boo hoo [3]"), "wrong output (%s)\n",buffer);
2081 }
2082
2083 r = MsiRecordSetStringA(hrec, 0, "[1] [2] [[3]]");
2084 ok( r == ERROR_SUCCESS, "set string failed\n");
2085 r = MsiRecordSetStringA(hrec, 1, "boo");
2086 ok( r == ERROR_SUCCESS, "set string failed\n");
2087 r = MsiRecordSetStringA(hrec, 2, "hoo");
2088 ok( r == ERROR_SUCCESS, "set string failed\n");
2089 r = MsiRecordSetStringA(hrec, 3, "\\help");
2090 ok( r == ERROR_SUCCESS, "set string failed\n");
2091 sz = sizeof buffer;
2092 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2093 ok( r == ERROR_SUCCESS, "format failed\n");
2094 ok( sz == 9, "size wrong(%i)\n",sz);
2095 ok( 0 == strcmp(buffer,"boo hoo h"), "wrong output (%s)\n",buffer);
2096
2097 /* nested properties */
2098 MsiSetPropertyA(package, "PropA", "surprise");
2099 MsiSetPropertyA(package, "PropB", "[PropA]");
2100 MsiSetPropertyA(package, "PropC", "[PropB]");
2101 sz = sizeof buffer;
2102 MsiRecordSetStringA(hrec, 0, "[PropC]");
2103 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2104 ok( r == ERROR_SUCCESS, "format failed\n");
2105 ok( sz == 7, "size wrong(%i)\n",sz);
2106 ok( 0 == strcmp(buffer,"[PropB]"), "wrong output (%s)\n",buffer);
2107
2108 MsiSetPropertyA(package, "PropA", "surprise");
2109 MsiSetPropertyA(package, "PropB", "PropA");
2110 MsiSetPropertyA(package, "PropC", "PropB");
2111 sz = sizeof buffer;
2112 MsiRecordSetStringA(hrec, 0, "[PropC]");
2113 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2114 ok( r == ERROR_SUCCESS, "format failed\n");
2115 ok( sz == 5, "size wrong(%i)\n",sz);
2116 ok( 0 == strcmp(buffer,"PropB"), "wrong output (%s)\n",buffer);
2117
2118 MsiSetPropertyA(package, "PropA", "surprise");
2119 MsiSetPropertyA(package, "PropB", "[PropA]");
2120 MsiSetPropertyA(package, "PropC", "[PropB]");
2121 sz = sizeof buffer;
2122 MsiRecordSetStringA(hrec, 0, "[[PropC]]");
2123 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2124 ok( r == ERROR_SUCCESS, "format failed\n");
2125 ok( sz == 0, "size wrong(%i)\n",sz);
2126 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
2127
2128 MsiSetPropertyA(package, "PropA", "surprise");
2129 MsiSetPropertyA(package, "PropB", "[PropA]");
2130 MsiSetPropertyA(package, "PropC", "PropB");
2131 sz = sizeof buffer;
2132 MsiRecordSetStringA(hrec, 0, "[[PropC]]");
2133 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2134 ok( r == ERROR_SUCCESS, "format failed\n");
2135 ok( sz == 7, "size wrong(%i)\n",sz);
2136 ok( 0 == strcmp(buffer,"[PropA]"), "wrong output (%s)\n",buffer);
2137
2138 MsiSetPropertyA(package, "PropA", "surprise");
2139 MsiSetPropertyA(package, "PropB", "PropA");
2140 MsiSetPropertyA(package, "PropC", "PropB");
2141 sz = sizeof buffer;
2142 MsiRecordSetStringA(hrec, 0, "[[PropC]]");
2143 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2144 ok( r == ERROR_SUCCESS, "format failed\n");
2145 ok( sz == 5, "size wrong(%i)\n",sz);
2146 ok( 0 == strcmp(buffer,"PropA"), "wrong output (%s)\n",buffer);
2147
2148 MsiSetPropertyA(package, "PropA", "surprise");
2149 MsiSetPropertyA(package, "PropB", "PropA");
2150 MsiSetPropertyA(package, "PropC", "PropB");
2151 sz = sizeof buffer;
2152 MsiRecordSetStringA(hrec, 0, "[[[PropC]]]");
2153 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2154 ok( r == ERROR_SUCCESS, "format failed\n");
2155 ok( sz == 8, "size wrong(%i)\n",sz);
2156 ok( 0 == strcmp(buffer,"surprise"), "wrong output (%s)\n",buffer);
2157
2158 /* properties inside braces */
2159 sz = sizeof buffer;
2160 MsiRecordSetStringA(hrec, 0, "{abcd}");
2161 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2162 ok( r == ERROR_SUCCESS, "format failed\n");
2163 ok( sz == 6, "size wrong(%i)\n",sz);
2164 ok( 0 == strcmp(buffer,"{abcd}"), "wrong output (%s)\n",buffer);
2165
2166 MsiSetPropertyA(package, "one", "mercury");
2167 MsiSetPropertyA(package, "two", "venus");
2168 sz = sizeof buffer;
2169 MsiRecordSetStringA(hrec, 0, "{a[one]bc[two]de[one]f}");
2170 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2171 ok( r == ERROR_SUCCESS, "format failed: %d\n", r);
2172 ok( sz == 25, "size wrong(%i)\n",sz);
2173 ok( 0 == strcmp(buffer,"amercurybcvenusdemercuryf"), "wrong output (%s)\n",buffer);
2174
2175 MsiSetPropertyA(package, "one", "mercury");
2176 MsiSetPropertyA(package, "two", "venus");
2177 MsiSetPropertyA(package, "bad", "");
2178 sz = sizeof buffer;
2179 MsiRecordSetStringA(hrec, 0, "{a[one]bc[bad]de[two]f}");
2180 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2181 ok( r == ERROR_SUCCESS, "format failed\n");
2182 ok( sz == 0, "size wrong(%i)\n",sz);
2183 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
2184
2185 MsiSetPropertyA(package, "bad", "");
2186 sz = sizeof buffer;
2187 MsiRecordSetStringA(hrec, 0, "{[bad]}");
2188 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2189 ok( r == ERROR_SUCCESS, "format failed\n");
2190 ok( sz == 0, "size wrong(%i)\n",sz);
2191 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
2192
2193 MsiSetPropertyA(package, "one", "mercury");
2194 sz = sizeof buffer;
2195 MsiRecordSetStringA(hrec, 0, "{abc{d[one]ef}"); /* missing final brace */
2196 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2197 ok( r == ERROR_SUCCESS, "format failed\n");
2198 todo_wine
2199 {
2200 ok( sz == 14, "size wrong(%i)\n",sz);
2201 ok( 0 == strcmp(buffer,"abc{dmercuryef"), "wrong output (%s)\n",buffer);
2202 }
2203
2204 MsiSetPropertyA(package, "one", "mercury");
2205 sz = sizeof buffer;
2206 MsiRecordSetStringA(hrec, 0, "{abc{d[one]ef}}");
2207 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2208 ok( r == ERROR_SUCCESS, "format failed\n");
2209 todo_wine
2210 {
2211 ok( sz == 15, "size wrong(%i)\n",sz);
2212 ok( 0 == strcmp(buffer,"abc{dmercuryef}"), "wrong output (%s)\n",buffer);
2213 }
2214
2215 MsiSetPropertyA(package, "one", "mercury");
2216 sz = sizeof buffer;
2217 MsiRecordSetStringA(hrec, 0, "{abc}{{def}hi{j[one]k}}");
2218 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2219 ok( r == ERROR_SUCCESS, "format failed\n");
2220 ok( sz == 5, "size wrong(%i)\n",sz);
2221 ok( 0 == strcmp(buffer,"{abc}"), "wrong output (%s)\n",buffer);
2222
2223 MsiSetPropertyA(package, "one", "mercury");
2224
2225 sz = sizeof buffer;
2226 MsiRecordSetStringA(hrec, 0, "{{def}hi{j[one]k}}");
2227 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2228 ok( r == ERROR_SUCCESS, "format failed\n");
2229 ok( sz == 0, "size wrong(%i)\n",sz);
2230 ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer);
2231
2232 sz = sizeof(buffer);
2233 MsiRecordSetStringA(hrec, 0, "[1] {[noprop] [twoprop]} {abcdef}");
2234 MsiRecordSetStringA(hrec, 1, "one");
2235 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2236 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2237 ok(sz == 13, "Expected 13, got %d\n",sz);
2238 ok(!lstrcmpA(buffer, "one {abcdef}"),
2239 "Expected \"one {abcdef}\", got \"%s\"\n", buffer);
2240
2241 sz = sizeof(buffer);
2242 MsiRecordSetStringA(hrec, 0, "[1] {[noprop] [one]} {abcdef}");
2243 MsiRecordSetStringA(hrec, 1, "one");
2244 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2245 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2246 ok(sz == 13, "Expected 13, got %d\n",sz);
2247 ok(!lstrcmpA(buffer, "one {abcdef}"),
2248 "Expected \"one {abcdef}\", got \"%s\"\n", buffer);
2249
2250 sz = sizeof(buffer);
2251 MsiRecordSetStringA(hrec, 0, "[1] {[one]} {abcdef}");
2252 MsiRecordSetStringA(hrec, 1, "one");
2253 r = MsiFormatRecordA(package, hrec, buffer, &sz);
2254 ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
2255 ok(sz == 20, "Expected 20, got %d\n",sz);
2256 ok(!lstrcmpA(buffer, "one mercury {abcdef}"),
2257 "Expected \"one mercury {abcdef}\", got \"%s\"\n", buffer);
2258
2259 MsiCloseHandle(hrec);
2260
2261 r = MsiCloseHandle(package);
2262 ok(r==ERROR_SUCCESS, "Unable to close package\n");
2263
2264 DeleteFileA( msifile );
2265 }
2266
2267 static void test_processmessage(void)
2268 {
2269 MSIHANDLE hrec, package;
2270 UINT r;
2271
2272 MsiSetInternalUI(INSTALLUILEVEL_BASIC, NULL);
2273
2274 r = helper_createpackage( msifile, &package );
2275 if (r == ERROR_INSTALL_PACKAGE_REJECTED)
2276 {
2277 skip("Not enough rights to perform tests\n");
2278 return;
2279 }
2280 ok( r == ERROR_SUCCESS, "Unable to create package %u\n", r );
2281
2282 hrec = MsiCreateRecord(3);
2283 ok( hrec, "failed to create record\n");
2284
2285 r = MsiRecordSetStringA(hrec, 1, "");
2286 ok( r == ERROR_SUCCESS, "set string failed\n");
2287
2288 r = MsiProcessMessage(package, INSTALLMESSAGE_ACTIONSTART, hrec);
2289 ok( r == IDOK, "expected IDOK, got %i\n", r);
2290
2291 r = MsiProcessMessage(package, INSTALLMESSAGE_PROGRESS, hrec);
2292 ok( r == IDOK, "expected IDOK, got %i\n", r);
2293
2294 r = MsiProcessMessage(package, INSTALLMESSAGE_INFO, hrec);
2295 ok( r == 0, "expected 0, got %i\n", r);
2296
2297 r = MsiProcessMessage(package, INSTALLMESSAGE_INITIALIZE, hrec);
2298 ok( r == -1, "expected -1, got %i\n", r);
2299
2300 r = MsiRecordSetInteger(hrec, 1, 2);
2301 ok( r == ERROR_SUCCESS, "set integer failed\n");
2302 r = MsiRecordSetInteger(hrec, 2, 1);
2303 ok( r == ERROR_SUCCESS, "set integer failed\n");
2304 r = MsiProcessMessage(package, INSTALLMESSAGE_COMMONDATA, hrec);
2305 todo_wine
2306 ok( r == IDOK, "expected IDOK, got %i\n", r);
2307
2308 r = MsiRecordSetInteger(hrec, 2, 2);
2309 ok( r == ERROR_SUCCESS, "set integer failed\n");
2310 r = MsiProcessMessage(package, INSTALLMESSAGE_COMMONDATA, hrec);
2311 todo_wine
2312 ok( r == IDOK, "expected IDOK, got %i\n", r);
2313
2314 r = MsiRecordSetInteger(hrec, 1, 1);
2315 ok( r == ERROR_SUCCESS, "set integer failed\n");
2316 r = MsiProcessMessage(package, INSTALLMESSAGE_COMMONDATA, hrec);
2317 ok( r == -1, "expected -1, got %i\n", r);
2318
2319 MsiCloseHandle(package);
2320
2321 MsiSetInternalUI(INSTALLUILEVEL_BASIC|INSTALLUILEVEL_PROGRESSONLY, NULL);
2322 helper_createpackage(msifile, &package);
2323
2324 r = MsiProcessMessage(package, INSTALLMESSAGE_ERROR, hrec);
2325 ok( r == 0, "expected 0, got %i\n", r);
2326
2327 MsiCloseHandle(hrec);
2328 MsiCloseHandle(package);
2329
2330 DeleteFileA(msifile);
2331 }
2332
2333 START_TEST(format)
2334 {
2335 test_createpackage();
2336 test_formatrecord();
2337 test_formatrecord_package();
2338 test_processmessage();
2339 }