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