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