From 7183be3ead44577f2032383c1a336a9e24f48300 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Thu, 26 Feb 2009 13:26:26 +0000 Subject: [PATCH] - Sync winetests with Wine head (comcat, crypt32, gdiplus, lz32, mapi32, mlang, msacm32, mshtml, msvcrt, netapi32, riched20, riched32, rsaenh, schannel, setupapi, shdocvw, urlmon, user32, usp10, uxtheme, version, winhttp, wininet, wintrust, ws2_32) svn path=/trunk/; revision=39773 --- rostests/winetests/comcat/comcat.c | 47 +- rostests/winetests/crypt32/base64.c | 4 +- rostests/winetests/crypt32/cert.c | 50 +- rostests/winetests/crypt32/chain.c | 203 +- rostests/winetests/crypt32/crl.c | 4 +- rostests/winetests/crypt32/ctl.c | 50 +- rostests/winetests/crypt32/encode.c | 4 +- rostests/winetests/crypt32/msg.c | 277 +- rostests/winetests/crypt32/oid.c | 123 +- rostests/winetests/crypt32/protectdata.c | 2 +- rostests/winetests/crypt32/sip.c | 32 +- rostests/winetests/crypt32/store.c | 14 +- rostests/winetests/crypt32/str.c | 10 +- rostests/winetests/gdiplus/brush.c | 62 + rostests/winetests/gdiplus/gdiplus.rbuild | 1 + rostests/winetests/gdiplus/graphics.c | 14 +- rostests/winetests/gdiplus/graphicspath.c | 74 +- rostests/winetests/gdiplus/image.c | 243 +- rostests/winetests/gdiplus/region.c | 282 +- rostests/winetests/gdiplus/stringformat.c | 62 + rostests/winetests/lz32/lzexpand_main.c | 14 +- rostests/winetests/mapi32/imalloc.c | 4 +- rostests/winetests/mapi32/prop.c | 53 +- rostests/winetests/mapi32/util.c | 13 +- rostests/winetests/mlang/mlang.c | 984 +++++-- rostests/winetests/msacm32/msacm.c | 6 +- rostests/winetests/mshtml/dom.c | 160 +- rostests/winetests/msvcrt/file.c | 217 +- rostests/winetests/msvcrt/headers.c | 14 +- rostests/winetests/msvcrt/heap.c | 31 +- rostests/winetests/msvcrt/printf.c | 104 +- rostests/winetests/msvcrt/scanf.c | 5 +- rostests/winetests/msvcrt/string.c | 100 +- rostests/winetests/msxml3/domdoc.c | 29 + rostests/winetests/netapi32/access.c | 12 +- rostests/winetests/netapi32/apibuf.c | 2 +- rostests/winetests/netapi32/ds.c | 2 +- rostests/winetests/netapi32/wksta.c | 4 +- rostests/winetests/psapi/psapi_main.c | 2 +- rostests/winetests/riched20/editor.c | 102 +- rostests/winetests/riched20/txtsrv.c | 84 +- rostests/winetests/riched32/editor.c | 470 ++- rostests/winetests/rsaenh/rsaenh.c | 242 +- rostests/winetests/schannel/main.c | 14 +- rostests/winetests/setupapi/devinst.c | 646 ++-- rostests/winetests/setupapi/install.c | 133 +- rostests/winetests/setupapi/misc.c | 59 +- rostests/winetests/setupapi/parser.c | 99 +- rostests/winetests/setupapi/query.c | 249 +- rostests/winetests/setupapi/stringtable.c | 199 +- rostests/winetests/shdocvw/webbrowser.c | 181 +- rostests/winetests/urlmon/generated.c | 232 +- rostests/winetests/urlmon/misc.c | 47 +- rostests/winetests/urlmon/protocol.c | 100 +- rostests/winetests/urlmon/url.c | 282 +- rostests/winetests/user32/broadcast.c | 19 +- rostests/winetests/user32/class.c | 21 +- rostests/winetests/user32/combo.c | 21 +- rostests/winetests/user32/cursoricon.c | 8 +- rostests/winetests/user32/dce.c | 2 +- rostests/winetests/user32/dde.c | 185 +- rostests/winetests/user32/dialog.c | 16 +- rostests/winetests/user32/edit.c | 4 +- rostests/winetests/user32/generated.c | 3246 +++++++++++++++------ rostests/winetests/user32/input.c | 188 +- rostests/winetests/user32/listbox.c | 42 +- rostests/winetests/user32/menu.c | 1084 +++---- rostests/winetests/user32/monitor.c | 18 +- rostests/winetests/user32/msg.c | 1364 +++++---- rostests/winetests/user32/resource.c | 30 +- rostests/winetests/user32/sysparams.c | 89 +- rostests/winetests/user32/text.c | 17 + rostests/winetests/user32/win.c | 828 ++++-- rostests/winetests/user32/winstation.c | 2 +- rostests/winetests/user32/wsprintf.c | 14 +- rostests/winetests/usp10/usp10.c | 83 + rostests/winetests/uxtheme/system.c | 17 +- rostests/winetests/version/info.c | 2 +- rostests/winetests/winhttp/notification.c | 175 +- rostests/winetests/winhttp/testlist.c | 4 + rostests/winetests/winhttp/url.c | 581 ++++ rostests/winetests/winhttp/winhttp.c | 174 +- rostests/winetests/winhttp/winhttp.rbuild | 1 + rostests/winetests/wininet/ftp.c | 114 +- rostests/winetests/wininet/generated.c | 1112 ++++--- rostests/winetests/wininet/http.c | 892 ++++-- rostests/winetests/wininet/internet.c | 478 ++- rostests/winetests/wininet/url.c | 51 + rostests/winetests/wininet/urlcache.c | 66 +- rostests/winetests/wintrust/crypt.c | 24 +- rostests/winetests/wintrust/register.c | 62 +- rostests/winetests/wintrust/softpub.c | 25 +- rostests/winetests/ws2_32/sock.c | 3 +- 93 files changed, 12627 insertions(+), 4888 deletions(-) create mode 100644 rostests/winetests/winhttp/url.c diff --git a/rostests/winetests/comcat/comcat.c b/rostests/winetests/comcat/comcat.c index 95e05ba69c9..49e5afe7c41 100644 --- a/rostests/winetests/comcat/comcat.c +++ b/rostests/winetests/comcat/comcat.c @@ -31,19 +31,19 @@ #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x \n", hr) -static void register_testentry(void) +static BOOL register_testentry(void) { - HKEY hkey,hkey2; - - RegCreateKeyA(HKEY_CLASSES_ROOT,"CLSID\\{deadcafe-beed-bead-dead-cafebeaddead}", - &hkey); - RegSetValueA(hkey,NULL,REG_SZ,"ComCat Test key",16); - RegCreateKeyA(hkey, - "Implemented Categories\\{deadcafe-0000-0000-0000-000000000000}", - &hkey2); + HKEY hkey = 0, hkey2 = 0; + DWORD ret; + ret = RegCreateKeyA(HKEY_CLASSES_ROOT,"CLSID\\{deadcafe-beed-bead-dead-cafebeaddead}", &hkey); + if (!ret) ret = RegSetValueA(hkey,NULL,REG_SZ,"ComCat Test key",16); + if (!ret) ret = RegCreateKeyA(hkey, + "Implemented Categories\\{deadcafe-0000-0000-0000-000000000000}", + &hkey2); RegCloseKey(hkey); RegCloseKey(hkey2); + return !ret; } static void unregister_testentry(void) @@ -84,9 +84,9 @@ static void do_enum(void) IEnumCLSID *pIEnum =(IEnumCLSID*)0xdeadcafe; - CLSIDFromString((LPOLESTR)szCatID,the_cat); - CLSIDFromString((LPOLESTR)szGuid,&wanted_guid); - + CLSIDFromString(szCatID,the_cat); + CLSIDFromString(szGuid,&wanted_guid); + OleInitialize(NULL); hr = CoCreateInstance(rclsid,NULL,CLSCTX_INPROC_SERVER, @@ -106,19 +106,22 @@ static void do_enum(void) hr = IEnumGUID_Next(pIEnum,1,the_guid, &fetched); ok (fetched == 0,"Fetched wrong number of guids %u\n",fetched); IEnumGUID_Release(pIEnum); - - register_testentry(); - hr = ICatInformation_EnumClassesOfCategories(pICat, 1, the_cat, -1, NULL, - &pIEnum); - ok_ole_success(hr,"ICatInformation_EnumClassesOfCategories"); - hr = IEnumGUID_Next(pIEnum,1,the_guid, &fetched); - ok (fetched == 1,"Fetched wrong number of guids %u\n",fetched); - ok (IsEqualGUID(the_guid,&wanted_guid),"Guids do not match\n"); + if (register_testentry()) + { + hr = ICatInformation_EnumClassesOfCategories(pICat, 1, the_cat, -1, NULL, &pIEnum); + ok_ole_success(hr,"ICatInformation_EnumClassesOfCategories"); + + hr = IEnumGUID_Next(pIEnum,1,the_guid, &fetched); + ok (fetched == 1,"Fetched wrong number of guids %u\n",fetched); + ok (IsEqualGUID(the_guid,&wanted_guid),"Guids do not match\n"); + + IEnumGUID_Release(pIEnum); + unregister_testentry(); + } + else skip( "Could not register the test category\n" ); - IEnumGUID_Release(pIEnum); ICatInformation_Release(pICat); - unregister_testentry(); OleUninitialize(); } diff --git a/rostests/winetests/crypt32/base64.c b/rostests/winetests/crypt32/base64.c index 15f41c88c1e..5a260edfd6e 100644 --- a/rostests/winetests/crypt32/base64.c +++ b/rostests/winetests/crypt32/base64.c @@ -449,10 +449,10 @@ START_TEST(base64) if (pCryptBinaryToStringA) testBinaryToStringA(); else - skip("CryptBinaryToStringA is not available\n"); + win_skip("CryptBinaryToStringA is not available\n"); if (pCryptStringToBinaryA) testStringToBinaryA(); else - skip("CryptStringToBinaryA is not available\n"); + win_skip("CryptStringToBinaryA is not available\n"); } diff --git a/rostests/winetests/crypt32/cert.c b/rostests/winetests/crypt32/cert.c index a22ec7cf1f7..322fa2f92d9 100644 --- a/rostests/winetests/crypt32/cert.c +++ b/rostests/winetests/crypt32/cert.c @@ -181,10 +181,15 @@ static void testAddCert(void) context = NULL; ret = CertAddEncodedCertificateToStore(0, X509_ASN_ENCODING, bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, &context); - ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", - GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* win98 */), + "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); if (context) CertFreeCertificateContext(context); + if (!ret && GetLastError() == OSS_DATA_ERROR) + { + skip("bigCert can't be decoded, skipping tests\n"); + return; + } ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL); @@ -409,8 +414,8 @@ static void testCertProperties(void) CRYPT_DATA_BLOB blob; CERT_KEY_CONTEXT keyContext; - ok(context != NULL, "CertCreateCertificateContext failed: %08x\n", - GetLastError()); + ok(context != NULL || broken(GetLastError() == OSS_DATA_ERROR /* win98 */), + "CertCreateCertificateContext failed: %08x\n", GetLastError()); if (!context) return; @@ -641,8 +646,13 @@ static void testDupCert(void) ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, &context); - ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", - GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* win98 */), + "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); + if (!ret && GetLastError() == OSS_DATA_ERROR) + { + skip("bigCert can't be decoded, skipping tests\n"); + return; + } ok(context != NULL, "Expected a valid cert context\n"); if (context) { @@ -1014,8 +1024,13 @@ static void testFindCert(void) ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, bigCert, sizeof(bigCert), CERT_STORE_ADD_NEW, NULL); - ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", - GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* win98 */), + "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); + if (!ret && GetLastError() == OSS_DATA_ERROR) + { + skip("bigCert can't be decoded, skipping tests\n"); + return; + } ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, bigCert2, sizeof(bigCert2), CERT_STORE_ADD_NEW, NULL); ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", @@ -1199,8 +1214,13 @@ static void testGetSubjectCert(void) ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL); - ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", - GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* win98 */), + "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); + if (!ret && GetLastError() == OSS_DATA_ERROR) + { + skip("bigCert can't be decoded, skipping tests\n"); + return; + } ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, bigCert2, sizeof(bigCert2), CERT_STORE_ADD_NEW, &context1); ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", @@ -1652,12 +1672,12 @@ static void testVerifyCertSig(HCRYPTPROV csp, const CRYPT_DATA_BLOB *toBeSigned, if (!pCryptVerifyCertificateSignatureEx) { - skip("no CryptVerifyCertificateSignatureEx support\n"); + win_skip("no CryptVerifyCertificateSignatureEx support\n"); return; } if (!pCryptEncodeObjectEx) { - skip("no CryptEncodeObjectEx support\n"); + win_skip("no CryptEncodeObjectEx support\n"); return; } ret = pCryptVerifyCertificateSignatureEx(0, 0, 0, NULL, 0, NULL, 0, NULL); @@ -1877,7 +1897,7 @@ static void testCreateSelfSignCert(void) if (!pCertCreateSelfSignCertificate) { - skip("CertCreateSelfSignCertificate() is not available\n"); + win_skip("CertCreateSelfSignCertificate() is not available\n"); return; } @@ -2314,7 +2334,7 @@ static void testGetValidUsages(void) if (!pCertGetValidUsages) { - skip("CertGetValidUsages() is not available\n"); + win_skip("CertGetValidUsages() is not available\n"); return; } @@ -2855,7 +2875,7 @@ static void testAcquireCertPrivateKey(void) if (!pCryptAcquireCertificatePrivateKey) { - skip("CryptAcquireCertificatePrivateKey() is not available\n"); + win_skip("CryptAcquireCertificatePrivateKey() is not available\n"); return; } diff --git a/rostests/winetests/crypt32/chain.c b/rostests/winetests/crypt32/chain.c index 34dfb6a33ad..f7efe64eec3 100644 --- a/rostests/winetests/crypt32/chain.c +++ b/rostests/winetests/crypt32/chain.c @@ -68,7 +68,7 @@ static void testCreateCertChainEngine(void) if (!pCertCreateCertificateChainEngine || !pCertFreeCertificateChainEngine) { - skip("Cert*CertificateChainEngine() functions are not available\n"); + win_skip("Cert*CertificateChainEngine() functions are not available\n"); return; } @@ -1176,14 +1176,14 @@ static void checkElementStatus(const CERT_TRUST_STATUS *expected, todo_wine ok(got->dwErrorStatus == expected->dwErrorStatus || broken((got->dwErrorStatus & ~ignore->dwErrorStatus) == - expected->dwErrorStatus), + (expected->dwErrorStatus & ~ignore->dwErrorStatus)), "Chain %d, element [%d,%d]: expected error %08x, got %08x\n", testIndex, chainIndex, elementIndex, expected->dwErrorStatus, got->dwErrorStatus); else ok(got->dwErrorStatus == expected->dwErrorStatus || broken((got->dwErrorStatus & ~ignore->dwErrorStatus) == - expected->dwErrorStatus), + (expected->dwErrorStatus & ~ignore->dwErrorStatus)), "Chain %d, element [%d,%d]: expected error %08x, got %08x\n", testIndex, chainIndex, elementIndex, expected->dwErrorStatus, got->dwErrorStatus); @@ -1196,14 +1196,14 @@ static void checkElementStatus(const CERT_TRUST_STATUS *expected, todo_wine ok(got->dwInfoStatus == expected->dwInfoStatus || broken((got->dwInfoStatus & ~ignore->dwInfoStatus) == - expected->dwInfoStatus), + (expected->dwInfoStatus & ~ignore->dwInfoStatus)), "Chain %d, element [%d,%d]: expected info %08x, got %08x\n", testIndex, chainIndex, elementIndex, expected->dwInfoStatus, got->dwInfoStatus); else ok(got->dwInfoStatus == expected->dwInfoStatus || broken((got->dwInfoStatus & ~ignore->dwInfoStatus) == - expected->dwInfoStatus), + (expected->dwInfoStatus & ~ignore->dwInfoStatus)), "Chain %d, element [%d,%d]: expected info %08x, got %08x\n", testIndex, chainIndex, elementIndex, expected->dwInfoStatus, got->dwInfoStatus); @@ -1249,7 +1249,11 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, if (todo & TODO_ERROR && chain->TrustStatus.dwErrorStatus != chainStatus->status.dwErrorStatus) todo_wine ok(chain->TrustStatus.dwErrorStatus == - chainStatus->status.dwErrorStatus, + chainStatus->status.dwErrorStatus || + broken((chain->TrustStatus.dwErrorStatus & + ~chainStatus->statusToIgnore.dwErrorStatus) == + (chainStatus->status.dwErrorStatus & + ~chainStatus->statusToIgnore.dwErrorStatus)), "Chain %d: expected error %08x, got %08x\n", testIndex, chainStatus->status.dwErrorStatus, chain->TrustStatus.dwErrorStatus); @@ -1258,14 +1262,19 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, chainStatus->status.dwErrorStatus || broken((chain->TrustStatus.dwErrorStatus & ~chainStatus->statusToIgnore.dwErrorStatus) == - chainStatus->status.dwErrorStatus), + (chainStatus->status.dwErrorStatus & + ~chainStatus->statusToIgnore.dwErrorStatus)), "Chain %d: expected error %08x, got %08x\n", testIndex, chainStatus->status.dwErrorStatus, chain->TrustStatus.dwErrorStatus); if (todo & TODO_INFO && chain->TrustStatus.dwInfoStatus != chainStatus->status.dwInfoStatus) todo_wine ok(chain->TrustStatus.dwInfoStatus == - chainStatus->status.dwInfoStatus, + chainStatus->status.dwInfoStatus || + broken((chain->TrustStatus.dwInfoStatus & + ~chainStatus->statusToIgnore.dwInfoStatus) == + (chainStatus->status.dwInfoStatus & + ~chainStatus->statusToIgnore.dwInfoStatus)), "Chain %d: expected info %08x, got %08x\n", testIndex, chainStatus->status.dwInfoStatus, chain->TrustStatus.dwInfoStatus); @@ -1274,7 +1283,8 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, chainStatus->status.dwInfoStatus || broken((chain->TrustStatus.dwInfoStatus & ~chainStatus->statusToIgnore.dwInfoStatus) == - chainStatus->status.dwInfoStatus), + (chainStatus->status.dwInfoStatus & + ~chainStatus->statusToIgnore.dwInfoStatus)), "Chain %d: expected info %08x, got %08x\n", testIndex, chainStatus->status.dwInfoStatus, chain->TrustStatus.dwInfoStatus); @@ -1416,10 +1426,8 @@ static CONST_DATA_BLOB chain9[] = { { sizeof(chain7_1), chain7_1 }, }; static const CERT_TRUST_STATUS elementStatus9[] = { - { CERT_TRUST_NO_ERROR, - CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_HAS_PREFERRED_ISSUER }, - { CERT_TRUST_INVALID_BASIC_CONSTRAINTS, - CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_HAS_PREFERRED_ISSUER }, + { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_NAME_MATCH_ISSUER }, + { CERT_TRUST_INVALID_BASIC_CONSTRAINTS, CERT_TRUST_HAS_NAME_MATCH_ISSUER }, { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_CYCLIC, CERT_TRUST_HAS_NAME_MATCH_ISSUER }, }; @@ -1515,21 +1523,32 @@ static ChainCheck chainCheck[] = { { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_VALID, 0 }, 1, simpleStatus2 }, 0 }, + /* Earlier versions of Windows incorrectly don't set + * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain. + */ { { sizeof(chain3) / sizeof(chain3[0]), chain3 }, - { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS, + CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_VALID, 0 }, 1, simpleStatus3 }, 0 }, + /* Earlier versions of Windows incorrectly don't set + * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain. + */ { { sizeof(chain4) / sizeof(chain4[0]), chain4 }, - { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS, + CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_VALID, 0 }, 1, simpleStatus4 }, 0 }, /* Windows versions prior to Vista/2008 incorrectly set * CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT on this chain, so ignore it. + * Similarly, some older versions of Windows incorrectly set + * CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, ignore that too. */ { { sizeof(chain5) / sizeof(chain5[0]), chain5 }, - { { CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT, + { { CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT | + CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT | CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus5 }, 0 }, @@ -1539,18 +1558,24 @@ static ChainCheck chainCheck[] = { { { sizeof(chain7) / sizeof(chain7[0]), chain7 }, { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus7 }, 0 }, + /* Earlier versions of Windows incorrectly don't set + * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain. + */ { { sizeof(chain8) / sizeof(chain8[0]), chain8 }, - { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS, + CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_VALID, 0 }, - 1, simpleStatus8 }, - TODO_ERROR }, + 1, simpleStatus8 }, 0 }, + /* Earlier versions of Windows incorrectly don't set + * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain. + */ { { sizeof(chain9) / sizeof(chain9[0]), chain9 }, - { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS, + CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_PARTIAL_CHAIN | CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_CYCLIC, 0 }, - 1, simpleStatus9 }, - TODO_INFO }, + 1, simpleStatus9 }, 0 }, { { sizeof(chain10) / sizeof(chain10[0]), chain10 }, { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus10 }, 0 }, @@ -1595,7 +1620,7 @@ static ChainCheck chainCheckNoStore[] = { { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_PARTIAL_CHAIN, 0 }, 1, simpleStatus8NoStore }, - TODO_INFO }, + 0 }, }; /* Wednesday, Oct 1, 2007 */ @@ -1684,103 +1709,110 @@ static void testGetCertChain(void) typedef struct _ChainPolicyCheck { - CONST_BLOB_ARRAY certs; - CERT_CHAIN_POLICY_STATUS status; - DWORD todo; + CONST_BLOB_ARRAY certs; + CERT_CHAIN_POLICY_STATUS status; + const CERT_CHAIN_POLICY_STATUS *brokenStatus; + DWORD todo; } ChainPolicyCheck; static const ChainPolicyCheck basePolicyCheck[] = { { { sizeof(chain0) / sizeof(chain0[0]), chain0 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain1) / sizeof(chain1[0]), chain1 }, - { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, 0 }, + { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, NULL, 0 }, { { sizeof(chain2) / sizeof(chain2[0]), chain2 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain3) / sizeof(chain3[0]), chain3 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain4) / sizeof(chain4[0]), chain4 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 }, { { sizeof(chain5) / sizeof(chain5[0]), chain5 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain6) / sizeof(chain6[0]), chain6 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain7) / sizeof(chain7[0]), chain7 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain8) / sizeof(chain8[0]), chain8 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 }, { { sizeof(chain9) / sizeof(chain9[0]), chain9 }, - { 0, CERT_E_CHAINING, 0, -1, NULL }, 0 }, + { 0, CERT_E_CHAINING, 0, -1, NULL }, NULL, 0 }, { { sizeof(chain10) / sizeof(chain10[0]), chain10 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain11) / sizeof(chain11[0]), chain11 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain12) / sizeof(chain12[0]), chain12 }, - { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, 0 }, + { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, NULL, 0 }, { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 }, }; static const ChainPolicyCheck authenticodePolicyCheck[] = { { { sizeof(chain0) / sizeof(chain0[0]), chain0 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain1) / sizeof(chain1[0]), chain1 }, - { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, 0 }, + { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, NULL, 0 }, { { sizeof(chain2) / sizeof(chain2[0]), chain2 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain3) / sizeof(chain3[0]), chain3 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain4) / sizeof(chain4[0]), chain4 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 }, { { sizeof(chain5) / sizeof(chain5[0]), chain5 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain6) / sizeof(chain6[0]), chain6 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain7) / sizeof(chain7[0]), chain7 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain8) / sizeof(chain8[0]), chain8 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 }, { { sizeof(chain9) / sizeof(chain9[0]), chain9 }, - { 0, CERT_E_CHAINING, 0, -1, NULL }, 0 }, + { 0, CERT_E_CHAINING, 0, -1, NULL }, NULL, 0 }, { { sizeof(chain10) / sizeof(chain10[0]), chain10 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain11) / sizeof(chain11[0]), chain11 }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain12) / sizeof(chain12[0]), chain12 }, - { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, 0 }, + { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, NULL, 0 }, { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain }, - { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, 0 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 }, }; +/* On some older systems, the element index is set to 2 rather than 1 for + * chain 4, because they do not catch the basic constraints error in the + * chain, which occurs at element 1. + */ +static const CERT_CHAIN_POLICY_STATUS chain4BrokenStatus = + { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 2, NULL }; + static const ChainPolicyCheck basicConstraintsPolicyCheck[] = { { { sizeof(chain0) / sizeof(chain0[0]), chain0 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain1) / sizeof(chain1[0]), chain1 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain2) / sizeof(chain2[0]), chain2 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain3) / sizeof(chain3[0]), chain3 }, - { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, 0 }, + { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain4) / sizeof(chain4[0]), chain4 }, - { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, 0 }, + { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, &chain4BrokenStatus, 0 }, { { sizeof(chain5) / sizeof(chain5[0]), chain5 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain6) / sizeof(chain6[0]), chain6 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain7) / sizeof(chain7[0]), chain7 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain8) / sizeof(chain8[0]), chain8 }, - { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, - TODO_ERROR | TODO_CHAINS | TODO_ELEMENTS }, + { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain9) / sizeof(chain9[0]), chain9 }, - { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, 0 }, + { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, NULL, 0 }, { { sizeof(chain10) / sizeof(chain10[0]), chain10 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain11) / sizeof(chain11[0]), chain11 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(chain12) / sizeof(chain12[0]), chain12 }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain }, - { 0, 0, -1, -1, NULL }, 0 }, + { 0, 0, -1, -1, NULL }, NULL, 0 }, }; static const char *num_to_str(WORD num) @@ -1825,43 +1857,58 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, { if (check->todo & TODO_ERROR) todo_wine ok(policyStatus.dwError == check->status.dwError || - broken(policyStatus.dwError == CERT_TRUST_NO_ERROR), + broken(policyStatus.dwError == CERT_TRUST_NO_ERROR) || + (check->brokenStatus && broken(policyStatus.dwError == + check->brokenStatus->dwError)), "%s[%d]: expected %08x, got %08x\n", HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, check->status.dwError, policyStatus.dwError); else ok(policyStatus.dwError == check->status.dwError || - broken(policyStatus.dwError == CERT_TRUST_NO_ERROR), + broken(policyStatus.dwError == CERT_TRUST_NO_ERROR) || + (check->brokenStatus && broken(policyStatus.dwError == + check->brokenStatus->dwError)), "%s[%d]: expected %08x, got %08x\n", HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, check->status.dwError, policyStatus.dwError); if (policyStatus.dwError != check->status.dwError) { - skip("error doesn't match, not checking indexes\n"); + skip("%s[%d]: error %08x doesn't match expected %08x, not checking indexes\n", + HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + testIndex, policyStatus.dwError, check->status.dwError); pCertFreeCertificateChain(chain); return; } if (check->todo & TODO_CHAINS) todo_wine ok(policyStatus.lChainIndex == - check->status.lChainIndex, "%s[%d]: expected %d, got %d\n", + check->status.lChainIndex || + (check->brokenStatus && broken(policyStatus.lChainIndex == + check->brokenStatus->lChainIndex)), + "%s[%d]: expected %d, got %d\n", HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, check->status.lChainIndex, policyStatus.lChainIndex); else - ok(policyStatus.lChainIndex == check->status.lChainIndex, + ok(policyStatus.lChainIndex == check->status.lChainIndex || + (check->brokenStatus && broken(policyStatus.lChainIndex == + check->brokenStatus->lChainIndex)), "%s[%d]: expected %d, got %d\n", HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, check->status.lChainIndex, policyStatus.lChainIndex); if (check->todo & TODO_ELEMENTS) todo_wine ok(policyStatus.lElementIndex == - check->status.lElementIndex, + check->status.lElementIndex || + (check->brokenStatus && broken(policyStatus.lElementIndex == + check->brokenStatus->lElementIndex)), "%s[%d]: expected %d, got %d\n", HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, check->status.lElementIndex, policyStatus.lElementIndex); else - ok(policyStatus.lElementIndex == check->status.lElementIndex, + ok(policyStatus.lElementIndex == check->status.lElementIndex || + (check->brokenStatus && broken(policyStatus.lElementIndex == + check->brokenStatus->lElementIndex)), "%s[%d]: expected %d, got %d\n", HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, @@ -1883,7 +1930,7 @@ static void testVerifyCertChainPolicy(void) if (!pCertVerifyCertificateChainPolicy) { - skip("CertVerifyCertificateChainPolicy() is not available\n"); + win_skip("CertVerifyCertificateChainPolicy() is not available\n"); return; } @@ -1963,7 +2010,7 @@ START_TEST(chain) testCreateCertChainEngine(); if (!pCertGetCertificateChain) { - skip("CertGetCertificateChain() is not available\n"); + win_skip("CertGetCertificateChain() is not available\n"); } else { diff --git a/rostests/winetests/crypt32/crl.c b/rostests/winetests/crypt32/crl.c index 0bd0e5c13b0..abd8491df90 100644 --- a/rostests/winetests/crypt32/crl.c +++ b/rostests/winetests/crypt32/crl.c @@ -219,7 +219,7 @@ static void testFindCRL(void) if (!store) return; if (!pCertFindCRLInStore) { - skip("CertFindCRLInStore() is not available\n"); + win_skip("CertFindCRLInStore() is not available\n"); return; } @@ -619,7 +619,7 @@ static void testFindCertInCRL(void) if (!pCertFindCertificateInCRL) { - skip("CertFindCertificateInCRL() is not available\n"); + win_skip("CertFindCertificateInCRL() is not available\n"); return; } diff --git a/rostests/winetests/crypt32/ctl.c b/rostests/winetests/crypt32/ctl.c index 5ed4381d48c..f09420c8a21 100644 --- a/rostests/winetests/crypt32/ctl.c +++ b/rostests/winetests/crypt32/ctl.c @@ -137,23 +137,27 @@ static void testCreateCTL(void) ctl = CertCreateCTLContext(X509_ASN_ENCODING, signedCTL, sizeof(signedCTL)); ok(!ctl && (GetLastError() == ERROR_INVALID_DATA || - GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE), /* win9x */ - "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE /* win9x */ || + GetLastError() == ERROR_SUCCESS /* some win98 */), + "expected ERROR_INVALID_DATA, CRYPT_E_UNEXPECTED_MSG_TYPE, or ERROR_SUCCESS, got %d (0x%08x)\n", GetLastError(), GetLastError()); SetLastError(0xdeadbeef); ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctlWithOneEntry, sizeof(ctlWithOneEntry)); ok(!ctl && (GetLastError() == ERROR_INVALID_DATA || - GetLastError() == OSS_DATA_ERROR), /* win9x */ - "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE /* win9x */ || + GetLastError() == OSS_DATA_ERROR /* some win98 */ || + GetLastError() == ERROR_SUCCESS /* some win98 */), + "expected ERROR_INVALID_DATA, CRYPT_E_UNEXPECTED_MSG_TYPE, OSS_DATA_ERROR, or ERROR_SUCCESS, got %d (0x%08x)\n", GetLastError(), GetLastError()); SetLastError(0xdeadbeef); ctl = CertCreateCTLContext(X509_ASN_ENCODING, signedCTLWithSubjectAlgorithm, sizeof(signedCTLWithSubjectAlgorithm)); ok(!ctl && (GetLastError() == ERROR_INVALID_DATA || - GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE), /* win9x */ + GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE /* win9x */ || + GetLastError() == ERROR_SUCCESS /* some win98 */), "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), GetLastError()); /* This signed CTL with the appropriate inner content type can be decoded. @@ -228,12 +232,15 @@ static void testCTLProperties(void) /* An implicit property */ ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, NULL, &size); - ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == CRYPT_E_NOT_FOUND /* some win98 */), + "CertGetCTLContextProperty failed: %08x\n", GetLastError()); ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, &access, &size); - ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); - ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG), - "Didn't expect a persisted cert\n"); + ok(ret || broken(GetLastError() == CRYPT_E_NOT_FOUND /* some win98 */), + "CertGetCTLContextProperty failed: %08x\n", GetLastError()); + if (ret) + ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG), + "Didn't expect a persisted cert\n"); checkHash(signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), CALG_SHA1, ctl, CERT_HASH_PROP_ID); @@ -320,7 +327,7 @@ static void testAddCTLToStore(void) { HCERTSTORE store; BOOL ret; - DWORD numCTLs; + DWORD numCTLs, expectedCTLs; PCCTL_CONTEXT ctl; store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, @@ -362,13 +369,16 @@ static void testAddCTLToStore(void) if (ret) { /* win9x */ - ok(GetLastError() == CRYPT_E_NOT_FOUND, + ok(GetLastError() == CRYPT_E_NOT_FOUND || + GetLastError() == OSS_DATA_ERROR /* some win98 */, "Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); } else { - ok(!ret && GetLastError() == CRYPT_E_EXISTS, - "expected CRYPT_E_EXISTS, got %d %08x\n", ret, GetLastError()); + ok(!ret && (GetLastError() == CRYPT_E_EXISTS || + GetLastError() == OSS_DATA_ERROR), + "expected CRYPT_E_EXISTS or OSS_DATA_ERROR, got %d %08x\n", ret, + GetLastError()); } CertCloseStore(store, 0); @@ -381,10 +391,14 @@ static void testAddCTLToStore(void) signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), CERT_STORE_ADD_NEW, NULL); ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + expectedCTLs = 1; ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, signedCTLWithUsage, sizeof(signedCTLWithUsage), CERT_STORE_ADD_NEW, NULL); - ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* some win98 */), + "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + if (ret) + expectedCTLs++; /* Check that two exist */ numCTLs = 0; ctl = NULL; @@ -393,7 +407,8 @@ static void testAddCTLToStore(void) if (ctl) numCTLs++; } while (ctl); - ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); + ok(numCTLs == expectedCTLs, "expected %d CTLs, got %d\n", expectedCTLs, + numCTLs); CertCloseStore(store, 0); store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, @@ -404,6 +419,11 @@ static void testAddCTLToStore(void) ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, signedCTLWithListID1, sizeof(signedCTLWithListID1), CERT_STORE_ADD_NEW, NULL); + if (!ret) + { + skip("adding a CTL with an empty usage not supported\n"); + return; + } ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, signedCTLWithListID2, sizeof(signedCTLWithListID2), CERT_STORE_ADD_NEW, diff --git a/rostests/winetests/crypt32/encode.c b/rostests/winetests/crypt32/encode.c index 5c681b638cc..e40619492a7 100644 --- a/rostests/winetests/crypt32/encode.c +++ b/rostests/winetests/crypt32/encode.c @@ -1960,8 +1960,6 @@ static const struct encodedBits bits[] = { { 1, bin54, 2, bin55 }, /* strange test case, showing cUnusedBits >= 8 is allowed */ { 9, bin56, 1, bin57 }, - /* even stranger test case, showing cUnusedBits > cbData * 8 is allowed */ - { 17, bin58, 0, NULL }, }; static void test_encodeBits(DWORD dwEncoding) @@ -7499,7 +7497,7 @@ START_TEST(encode) pCryptEncodeObjectEx = (void*)GetProcAddress(hCrypt32, "CryptEncodeObjectEx"); if (!pCryptDecodeObjectEx || !pCryptEncodeObjectEx) { - skip("CryptDecodeObjectEx() is not available\n"); + win_skip("CryptDecodeObjectEx() is not available\n"); return; } diff --git a/rostests/winetests/crypt32/msg.c b/rostests/winetests/crypt32/msg.c index 495f2f07216..7794f359f61 100644 --- a/rostests/winetests/crypt32/msg.c +++ b/rostests/winetests/crypt32/msg.c @@ -196,7 +196,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_DATA, "Expected CMSG_DATA, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; i <= CMSG_CMS_SIGNER_INFO_PARAM; i++) + for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -211,7 +211,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_ENVELOPED, "Expected CMSG_ENVELOPED, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; i <= CMSG_CMS_SIGNER_INFO_PARAM; i++) + for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -226,7 +226,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_HASHED, "Expected CMSG_HASHED, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; i <= CMSG_CMS_SIGNER_INFO_PARAM; i++) + for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -241,7 +241,7 @@ static void test_msg_get_param(void) ret = CryptMsgGetParam(msg, CMSG_TYPE_PARAM, 0, &value, &size); ok(ret, "CryptMsgGetParam failed: %x\n", GetLastError()); ok(value == CMSG_SIGNED, "Expected CMSG_SIGNED, got %d\n", value); - for (i = CMSG_CONTENT_PARAM; i <= CMSG_CMS_SIGNER_INFO_PARAM; i++) + for (i = CMSG_CONTENT_PARAM; have_nt && (i <= CMSG_CMS_SIGNER_INFO_PARAM); i++) { size = 0; ret = CryptMsgGetParam(msg, i, 0, NULL, &size); @@ -413,18 +413,22 @@ static void test_data_msg_update(void) ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError()); CryptMsgClose(msg); - /* Calling update after opening with an empty stream info (with a bogus - * output function) yields an error: - */ - msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL, NULL, - &streamInfo); - SetLastError(0xdeadbeef); - ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); - ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || - GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */), - "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n", - GetLastError()); - CryptMsgClose(msg); + if (have_nt) + { + /* Calling update after opening with an empty stream info (with a bogus + * output function) yields an error: + */ + /* Crashes on some Win9x */ + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL, NULL, + &streamInfo); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); + ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || + GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */), + "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n", + GetLastError()); + CryptMsgClose(msg); + } /* Calling update with a valid output function succeeds, even if the data * exceeds the size specified in the stream info. */ @@ -2022,29 +2026,33 @@ static void test_decode_msg_update(void) ok(ret, "CryptMsgUpdate failed: %x\n", GetLastError()); CryptMsgClose(msg); - msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo); - /* Updating a message that has a NULL stream callback fails */ - SetLastError(0xdeadbeef); - ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent), - FALSE); - todo_wine - ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || - GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */), - "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n", - GetLastError()); - /* Changing the callback pointer after the fact yields the same error (so - * the message must copy the stream info, not just store a pointer to it) - */ - streamInfo.pfnStreamOutput = nop_stream_output; - SetLastError(0xdeadbeef); - ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent), - FALSE); - todo_wine - ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || - GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */), - "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n", - GetLastError()); - CryptMsgClose(msg); + if (have_nt) + { + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo); + /* Updating a message that has a NULL stream callback fails */ + SetLastError(0xdeadbeef); + /* Crashes on some Win9x */ + ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent), + FALSE); + todo_wine + ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || + GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */), + "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n", + GetLastError()); + /* Changing the callback pointer after the fact yields the same error (so + * the message must copy the stream info, not just store a pointer to it) + */ + streamInfo.pfnStreamOutput = nop_stream_output; + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, dataEmptyContent, sizeof(dataEmptyContent), + FALSE); + todo_wine + ok(!ret && (GetLastError() == STATUS_ACCESS_VIOLATION || + GetLastError() == STATUS_ILLEGAL_INSTRUCTION /* WinME */), + "Expected STATUS_ACCESS_VIOLATION or STATUS_ILLEGAL_INSTRUCTION, got %x\n", + GetLastError()); + CryptMsgClose(msg); + } /* Empty non-final updates are allowed when streaming.. */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, &streamInfo); @@ -2353,10 +2361,14 @@ static void test_decode_msg_get_param(void) msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); ret = CryptMsgUpdate(msg, hashEmptyContent, sizeof(hashEmptyContent), TRUE); - check_param("empty hash content", msg, CMSG_CONTENT_PARAM, NULL, 0); - check_param("empty hash hash data", msg, CMSG_HASH_DATA_PARAM, NULL, 0); - check_param("empty hash computed hash", msg, CMSG_COMPUTED_HASH_PARAM, - emptyHashParam, sizeof(emptyHashParam)); + if (ret) + { + /* Crashes on some Win9x */ + check_param("empty hash content", msg, CMSG_CONTENT_PARAM, NULL, 0); + check_param("empty hash hash data", msg, CMSG_HASH_DATA_PARAM, NULL, 0); + check_param("empty hash computed hash", msg, CMSG_COMPUTED_HASH_PARAM, + emptyHashParam, sizeof(emptyHashParam)); + } CryptMsgClose(msg); msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); ret = CryptMsgUpdate(msg, hashContent, sizeof(hashContent), TRUE); @@ -2477,6 +2489,12 @@ static void test_decode_msg_get_param(void) msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); ret = CryptMsgUpdate(msg, signedKeyIdEmptyContent, sizeof(signedKeyIdEmptyContent), TRUE); + if (!ret && GetLastError() == OSS_DATA_ERROR) + { + /* Subsequent tests crashes on some Win9x, so bail out */ + CryptMsgClose(msg); + return; + } ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); size = sizeof(value); ret = CryptMsgGetParam(msg, CMSG_SIGNER_COUNT_PARAM, 0, &value, &size); @@ -2661,27 +2679,31 @@ static void test_msg_control(void) "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); CryptMsgClose(msg); - msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, - NULL); - /* Can't verify the hash of an empty message */ - SetLastError(0xdeadbeef); - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); - todo_wine - ok(!ret && GetLastError() == STATUS_ACCESS_VIOLATION, - "Expected STATUS_ACCESS_VIOLATION, got %08x\n", GetLastError()); - /* Crashes - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, NULL); - */ - /* Can't verify the signature of a hash message */ - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE, - "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); - CryptMsgUpdate(msg, hashEmptyBareContent, sizeof(hashEmptyBareContent), - TRUE); - /* Oddly enough, this fails */ - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); - ok(!ret, "Expected failure\n"); - CryptMsgClose(msg); + if (have_nt) + { + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, + NULL); + /* Can't verify the hash of an empty message */ + SetLastError(0xdeadbeef); + /* Crashes on some Win9x */ + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); + todo_wine + ok(!ret && GetLastError() == STATUS_ACCESS_VIOLATION, + "Expected STATUS_ACCESS_VIOLATION, got %08x\n", GetLastError()); + /* Crashes + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, NULL); + */ + /* Can't verify the signature of a hash message */ + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); + ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE, + "Expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); + CryptMsgUpdate(msg, hashEmptyBareContent, sizeof(hashEmptyBareContent), + TRUE); + /* Oddly enough, this fails, crashes on some Win9x */ + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_HASH, NULL); + ok(!ret, "Expected failure\n"); + CryptMsgClose(msg); + } msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_HASHED, 0, NULL, NULL); CryptMsgUpdate(msg, hashBareContent, sizeof(hashBareContent), TRUE); @@ -2783,63 +2805,71 @@ static void test_msg_control(void) /* This cert has a public key, but it's not in a usable form */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, 0, NULL, NULL); - CryptMsgUpdate(msg, signedWithCertWithPubKeyBareContent, + ret = CryptMsgUpdate(msg, signedWithCertWithPubKeyBareContent, sizeof(signedWithCertWithPubKeyBareContent), TRUE); - /* Again, cert info needs to have a public key set */ - SetLastError(0xdeadbeef); - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && - (GetLastError() == CRYPT_E_ASN1_EOD || - GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), - "Expected CRYPT_E_ASN1_EOD or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); - /* The public key is supposed to be in encoded form.. */ - certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = oid_rsa_rsa; - certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(aKey); - certInfo.SubjectPublicKeyInfo.PublicKey.pbData = aKey; - SetLastError(0xdeadbeef); - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && - (GetLastError() == CRYPT_E_ASN1_BADTAG || - GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), - "Expected CRYPT_E_ASN1_BADTAG or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); - /* but not as a X509_PUBLIC_KEY_INFO.. */ - certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = NULL; - certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(encodedPubKey); - certInfo.SubjectPublicKeyInfo.PublicKey.pbData = encodedPubKey; - SetLastError(0xdeadbeef); - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && - (GetLastError() == CRYPT_E_ASN1_BADTAG || - GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), - "Expected CRYPT_E_ASN1_BADTAG or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); - /* This decodes successfully, but it doesn't match any key in the message */ - certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(mod_encoded); - certInfo.SubjectPublicKeyInfo.PublicKey.pbData = mod_encoded; - SetLastError(0xdeadbeef); - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - /* In Wine's rsaenh, this fails to decode because the key length is too - * small. Not sure if that's a bug in rsaenh, so leaving todo_wine for - * now. - */ - todo_wine - ok(!ret && - (GetLastError() == NTE_BAD_SIGNATURE || - GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), - "Expected NTE_BAD_SIGNATURE or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + if (ret) + { + /* Crashes on some Win9x */ + /* Again, cert info needs to have a public key set */ + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), + "Expected CRYPT_E_ASN1_EOD or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + /* The public key is supposed to be in encoded form.. */ + certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = oid_rsa_rsa; + certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(aKey); + certInfo.SubjectPublicKeyInfo.PublicKey.pbData = aKey; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), + "Expected CRYPT_E_ASN1_BADTAG or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + /* but not as a X509_PUBLIC_KEY_INFO.. */ + certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = NULL; + certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(encodedPubKey); + certInfo.SubjectPublicKeyInfo.PublicKey.pbData = encodedPubKey; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), + "Expected CRYPT_E_ASN1_BADTAG or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + /* This decodes successfully, but it doesn't match any key in the message */ + certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(mod_encoded); + certInfo.SubjectPublicKeyInfo.PublicKey.pbData = mod_encoded; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); + /* In Wine's rsaenh, this fails to decode because the key length is too + * small. Not sure if that's a bug in rsaenh, so leaving todo_wine for + * now. + */ + todo_wine + ok(!ret && + (GetLastError() == NTE_BAD_SIGNATURE || + GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), + "Expected NTE_BAD_SIGNATURE or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + } CryptMsgClose(msg); /* A message with no data doesn't have a valid signature */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); - CryptMsgUpdate(msg, signedWithCertWithValidPubKeyEmptyContent, + ret = CryptMsgUpdate(msg, signedWithCertWithValidPubKeyEmptyContent, sizeof(signedWithCertWithValidPubKeyEmptyContent), TRUE); - certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = oid_rsa_rsa; - certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(pubKey); - certInfo.SubjectPublicKeyInfo.PublicKey.pbData = pubKey; - SetLastError(0xdeadbeef); - ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); - ok(!ret && - (GetLastError() == NTE_BAD_SIGNATURE || - GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), - "Expected NTE_BAD_SIGNATURE or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + if (ret) + { + certInfo.SubjectPublicKeyInfo.Algorithm.pszObjId = oid_rsa_rsa; + certInfo.SubjectPublicKeyInfo.PublicKey.cbData = sizeof(pubKey); + certInfo.SubjectPublicKeyInfo.PublicKey.pbData = pubKey; + SetLastError(0xdeadbeef); + /* Crashes on some Win9x */ + ret = CryptMsgControl(msg, 0, CMSG_CTRL_VERIFY_SIGNATURE, &certInfo); + ok(!ret && + (GetLastError() == NTE_BAD_SIGNATURE || + GetLastError() == TRUST_E_NOSIGNATURE /* Vista */), + "Expected NTE_BAD_SIGNATURE or TRUST_E_NOSIGNATURE, got %08x\n", GetLastError()); + } CryptMsgClose(msg); /* Finally, this succeeds */ msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); @@ -2968,11 +2998,14 @@ static void test_msg_get_and_verify_signer(void) msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); /* A "signed" message created with no signer cert likewise has no signer */ - CryptMsgUpdate(msg, signedEmptyContent, sizeof(signedEmptyContent), TRUE); - SetLastError(0xdeadbeef); - ret = CryptMsgGetAndVerifySigner(msg, 0, NULL, 0, NULL, NULL); - ok(!ret && GetLastError() == CRYPT_E_NO_TRUSTED_SIGNER, - "expected CRYPT_E_NO_TRUSTED_SIGNER, got 0x%08x\n", GetLastError()); + ret = CryptMsgUpdate(msg, signedEmptyContent, sizeof(signedEmptyContent), TRUE); + if (ret) + { + /* Crashes on most Win9x */ + ret = CryptMsgGetAndVerifySigner(msg, 0, NULL, 0, NULL, NULL); + ok(!ret && GetLastError() == CRYPT_E_NO_TRUSTED_SIGNER, + "expected CRYPT_E_NO_TRUSTED_SIGNER, got 0x%08x\n", GetLastError()); + } CryptMsgClose(msg); msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); @@ -3040,6 +3073,8 @@ START_TEST(msg) { init_function_pointers(); have_nt = detect_nt(); + if (!have_nt) + win_skip("Win9x crashes on some parameter checks\n"); /* Basic parameter checking tests */ test_msg_open_to_encode(); diff --git a/rostests/winetests/crypt32/oid.c b/rostests/winetests/crypt32/oid.c index 11451310812..9b50129fd1d 100644 --- a/rostests/winetests/crypt32/oid.c +++ b/rostests/winetests/crypt32/oid.c @@ -34,58 +34,59 @@ static BOOL (WINAPI *pCryptEnumOIDInfo)(DWORD,DWORD,void*,PFN_CRYPT_ENUM_OID_INF struct OIDToAlgID { LPCSTR oid; + LPCSTR altOid; DWORD algID; }; static const struct OIDToAlgID oidToAlgID[] = { - { szOID_RSA_RSA, CALG_RSA_KEYX }, - { szOID_RSA_MD2RSA, CALG_MD2 }, - { szOID_RSA_MD4RSA, CALG_MD4 }, - { szOID_RSA_MD5RSA, CALG_MD5 }, - { szOID_RSA_SHA1RSA, CALG_SHA }, - { szOID_RSA_DH, CALG_DH_SF }, - { szOID_RSA_SMIMEalgESDH, CALG_DH_EPHEM }, - { szOID_RSA_SMIMEalgCMS3DESwrap, CALG_3DES }, - { szOID_RSA_SMIMEalgCMSRC2wrap, CALG_RC2 }, - { szOID_RSA_MD2, CALG_MD2 }, - { szOID_RSA_MD4, CALG_MD4 }, - { szOID_RSA_MD5, CALG_MD5 }, - { szOID_RSA_RC2CBC, CALG_RC2 }, - { szOID_RSA_RC4, CALG_RC4 }, - { szOID_RSA_DES_EDE3_CBC, CALG_3DES }, - { szOID_ANSI_X942_DH, CALG_DH_SF }, - { szOID_X957_DSA, CALG_DSS_SIGN }, - { szOID_X957_SHA1DSA, CALG_SHA }, - { szOID_OIWSEC_md4RSA, CALG_MD4 }, - { szOID_OIWSEC_md5RSA, CALG_MD5 }, - { szOID_OIWSEC_md4RSA2, CALG_MD4 }, - { szOID_OIWSEC_desCBC, CALG_DES }, - { szOID_OIWSEC_dsa, CALG_DSS_SIGN }, - { szOID_OIWSEC_shaDSA, CALG_SHA }, - { szOID_OIWSEC_shaRSA, CALG_SHA }, - { szOID_OIWSEC_sha, CALG_SHA }, - { szOID_OIWSEC_rsaXchg, CALG_RSA_KEYX }, - { szOID_OIWSEC_sha1, CALG_SHA }, - { szOID_OIWSEC_dsaSHA1, CALG_SHA }, - { szOID_OIWSEC_sha1RSASign, CALG_SHA }, - { szOID_OIWDIR_md2RSA, CALG_MD2 }, - { szOID_INFOSEC_mosaicUpdatedSig, CALG_SHA }, - { szOID_INFOSEC_mosaicKMandUpdSig, CALG_DSS_SIGN }, + { szOID_RSA_RSA, NULL, CALG_RSA_KEYX }, + { szOID_RSA_MD2RSA, NULL, CALG_MD2 }, + { szOID_RSA_MD4RSA, NULL, CALG_MD4 }, + { szOID_RSA_MD5RSA, NULL, CALG_MD5 }, + { szOID_RSA_SHA1RSA, NULL, CALG_SHA }, + { szOID_RSA_DH, NULL, CALG_DH_SF }, + { szOID_RSA_SMIMEalgESDH, NULL, CALG_DH_EPHEM }, + { szOID_RSA_SMIMEalgCMS3DESwrap, NULL, CALG_3DES }, + { szOID_RSA_SMIMEalgCMSRC2wrap, NULL, CALG_RC2 }, + { szOID_RSA_MD2, NULL, CALG_MD2 }, + { szOID_RSA_MD4, NULL, CALG_MD4 }, + { szOID_RSA_MD5, NULL, CALG_MD5 }, + { szOID_RSA_RC2CBC, NULL, CALG_RC2 }, + { szOID_RSA_RC4, NULL, CALG_RC4 }, + { szOID_RSA_DES_EDE3_CBC, NULL, CALG_3DES }, + { szOID_ANSI_X942_DH, NULL, CALG_DH_SF }, + { szOID_X957_DSA, NULL, CALG_DSS_SIGN }, + { szOID_X957_SHA1DSA, NULL, CALG_SHA }, + { szOID_OIWSEC_md4RSA, NULL, CALG_MD4 }, + { szOID_OIWSEC_md5RSA, NULL, CALG_MD5 }, + { szOID_OIWSEC_md4RSA2, NULL, CALG_MD4 }, + { szOID_OIWSEC_desCBC, NULL, CALG_DES }, + { szOID_OIWSEC_dsa, NULL, CALG_DSS_SIGN }, + { szOID_OIWSEC_shaDSA, NULL, CALG_SHA }, + { szOID_OIWSEC_shaRSA, NULL, CALG_SHA }, + { szOID_OIWSEC_sha, NULL, CALG_SHA }, + { szOID_OIWSEC_rsaXchg, NULL, CALG_RSA_KEYX }, + { szOID_OIWSEC_sha1, NULL, CALG_SHA }, + { szOID_OIWSEC_dsaSHA1, NULL, CALG_SHA }, + { szOID_OIWSEC_sha1RSASign, NULL, CALG_SHA }, + { szOID_OIWDIR_md2RSA, NULL, CALG_MD2 }, + { szOID_INFOSEC_mosaicUpdatedSig, NULL, CALG_SHA }, + { szOID_INFOSEC_mosaicKMandUpdSig, NULL, CALG_DSS_SIGN }, }; static const struct OIDToAlgID algIDToOID[] = { - { szOID_RSA_RSA, CALG_RSA_KEYX }, - { szOID_RSA_SMIMEalgESDH, CALG_DH_EPHEM }, - { szOID_RSA_MD2, CALG_MD2 }, - { szOID_RSA_MD4, CALG_MD4 }, - { szOID_RSA_MD5, CALG_MD5 }, - { szOID_RSA_RC2CBC, CALG_RC2 }, - { szOID_RSA_RC4, CALG_RC4 }, - { szOID_RSA_DES_EDE3_CBC, CALG_3DES }, - { szOID_ANSI_X942_DH, CALG_DH_SF }, - { szOID_X957_DSA, CALG_DSS_SIGN }, - { szOID_OIWSEC_desCBC, CALG_DES }, - { szOID_OIWSEC_sha1, CALG_SHA }, + { szOID_RSA_RSA, NULL, CALG_RSA_KEYX }, + { szOID_RSA_SMIMEalgESDH, NULL, CALG_DH_EPHEM }, + { szOID_RSA_MD2, NULL, CALG_MD2 }, + { szOID_RSA_MD4, NULL, CALG_MD4 }, + { szOID_RSA_MD5, NULL, CALG_MD5 }, + { szOID_RSA_RC2CBC, NULL, CALG_RC2 }, + { szOID_RSA_RC4, NULL, CALG_RC4 }, + { szOID_RSA_DES_EDE3_CBC, NULL, CALG_3DES }, + { szOID_ANSI_X942_DH, NULL, CALG_DH_SF }, + { szOID_X957_DSA, szOID_OIWSEC_dsa /* some Win98 */, CALG_DSS_SIGN }, + { szOID_OIWSEC_desCBC, NULL, CALG_DES }, + { szOID_OIWSEC_sha1, NULL, CALG_SHA }, }; static const WCHAR bogusDll[] = { 'b','o','g','u','s','.','d','l','l',0 }; @@ -134,8 +135,25 @@ static void testAlgIDToOID(void) oid = CertAlgIdToOID(algIDToOID[i].algID); /* Allow failure, not every version of Windows supports every algo */ if (oid) - ok(!strcmp(oid, algIDToOID[i].oid), - "Expected %s, got %s\n", algIDToOID[i].oid, oid); + { + if (strcmp(oid, algIDToOID[i].oid)) + { + if (algIDToOID[i].altOid) + ok(!strcmp(oid, algIDToOID[i].altOid), + "Expected %s or %s, got %s\n", algIDToOID[i].oid, + algIDToOID[i].altOid, oid); + else + { + /* No need to rerun the test, we already know it failed. */ + ok(0, "Expected %s, got %s\n", algIDToOID[i].oid, oid); + } + } + else + { + /* No need to rerun the test, we already know it succeeded. */ + ok(1, "Expected %s, got %s\n", algIDToOID[i].oid, oid); + } + } } } @@ -202,7 +220,8 @@ static void test_oidFunctionSet(void) ret = CryptGetOIDFunctionAddress(set1, X509_ASN_ENCODING, X509_CERT, 0, &funcAddr, &hFuncAddr); - ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, + ok((!ret && GetLastError() == ERROR_FILE_NOT_FOUND) || + broken(ret) /* some Win98 */, "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError()); } } @@ -254,8 +273,10 @@ static void test_installOIDFunctionAddress(void) */ ret = CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, 0, 0, (void **)&funcAddr, &hFuncAddr); - ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + ok(!ret && (GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == E_INVALIDARG /* some Win98 */), + "Expected ERROR_FILE_NOT_FOUND or E_INVALIDARG, got %d\n", + GetLastError()); ret = CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, X509_CERT, 0, (void **)&funcAddr, &hFuncAddr); ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, @@ -510,7 +531,7 @@ static void test_enumOIDInfo(void) if (!pCryptEnumOIDInfo) { - skip("CryptEnumOIDInfo() is not available\n"); + win_skip("CryptEnumOIDInfo() is not available\n"); return; } diff --git a/rostests/winetests/crypt32/protectdata.c b/rostests/winetests/crypt32/protectdata.c index 97b08c510fb..82cf1aa2667 100644 --- a/rostests/winetests/crypt32/protectdata.c +++ b/rostests/winetests/crypt32/protectdata.c @@ -221,7 +221,7 @@ START_TEST(protectdata) pCryptUnprotectData = (void*)GetProcAddress(hCrypt32, "CryptUnprotectData"); if (!pCryptProtectData || !pCryptUnprotectData) { - skip("Crypt(Un)ProtectData() is not available\n"); + win_skip("Crypt(Un)ProtectData() is not available\n"); return; } diff --git a/rostests/winetests/crypt32/sip.c b/rostests/winetests/crypt32/sip.c index 7ffa2b98d10..372d7ceaac9 100644 --- a/rostests/winetests/crypt32/sip.c +++ b/rostests/winetests/crypt32/sip.c @@ -72,9 +72,14 @@ static void test_AddRemoveProvider(void) } else { - ok (!ret, "Expected CryptSIPRemoveProvider to fail.\n"); - ok (GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %d.\n", GetLastError()); + /* On some Win98 systems, CryptSIPRemoveProvider always succeeds if + * the arguments are correct, whether or not the registry key is + * present, so don't test ret, just check the last error if it does + * return FALSE. + */ + if (!ret) + ok (GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %d.\n", GetLastError()); } /* Everything OK, pwszIsFunctionName and pwszIsFunctionNameFmt2 are left NULL @@ -104,9 +109,14 @@ static void test_AddRemoveProvider(void) */ SetLastError(0xdeadbeef); ret = CryptSIPRemoveProvider(&actionid); - ok (!ret, "Expected CryptSIPRemoveProvider to fail.\n"); - ok (GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %d.\n", GetLastError()); + /* On some Win98 systems, CryptSIPRemoveProvider always succeeds if + * the arguments are correct, whether or not the registry key is + * present, so don't test ret, just check the last error if it does + * return FALSE. + */ + if (!ret) + ok (GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %d.\n", GetLastError()); /* Everything OK */ memset(&newprov, 0, sizeof(SIP_ADD_NEWPROVIDER)); @@ -228,8 +238,9 @@ static void test_SIPRetrieveSubjectGUID(void) ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( GetLastError() == ERROR_FILE_INVALID || GetLastError() == ERROR_INVALID_PARAMETER /* Vista */ || - GetLastError() == ERROR_SUCCESS /* Win98 */, - "Expected ERROR_FILE_INVALID, ERROR_INVALID_PARAMETER or ERROR_SUCCESS, got 0x%08x\n", GetLastError()); + GetLastError() == ERROR_SUCCESS /* most Win98 */ || + GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN /* some Win98 */, + "Expected ERROR_FILE_INVALID, ERROR_INVALID_PARAMETER, ERROR_SUCCESS or TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08x\n", GetLastError()); ok ( !memcmp(&subject, &nullSubject, sizeof(GUID)), "Expected a NULL GUID for empty file %s, not %s\n", tempfile, show_guid(&subject, guid1)); @@ -243,8 +254,9 @@ static void test_SIPRetrieveSubjectGUID(void) ret = CryptSIPRetrieveSubjectGuid(tempfileW, NULL, &subject); ok ( !ret, "Expected CryptSIPRetrieveSubjectGuid to fail\n"); ok ( GetLastError() == ERROR_INVALID_PARAMETER || - GetLastError() == ERROR_SUCCESS /* Win98 */, - "Expected ERROR_INVALID_PARAMETER or ERROR_SUCCESS, got 0x%08x\n", GetLastError()); + GetLastError() == ERROR_SUCCESS /* most Win98 */ || + GetLastError() == TRUST_E_SUBJECT_FORM_UNKNOWN /* some Win98 */, + "Expected ERROR_INVALID_PARAMETER, ERROR_SUCCESS or TRUST_E_SUBJECT_FORM_UNKNOWN, got 0x%08x\n", GetLastError()); ok ( !memcmp(&subject, &nullSubject, sizeof(GUID)), "Expected a NULL GUID for empty file %s, not %s\n", tempfile, show_guid(&subject, guid1)); diff --git a/rostests/winetests/crypt32/store.c b/rostests/winetests/crypt32/store.c index 65d7f1529e7..ae10fbcfed2 100644 --- a/rostests/winetests/crypt32/store.c +++ b/rostests/winetests/crypt32/store.c @@ -285,7 +285,7 @@ static void testCollectionStore(void) if (!pCertAddStoreToCollection) { - skip("CertAddStoreToCollection() is not available\n"); + win_skip("CertAddStoreToCollection() is not available\n"); return; } @@ -545,7 +545,7 @@ static void testCollectionStore(void) if (!pCertRemoveStoreFromCollection) { - skip("CertRemoveStoreFromCollection() is not available\n"); + win_skip("CertRemoveStoreFromCollection() is not available\n"); } else { @@ -639,7 +639,7 @@ static void testRegStore(void) /* It looks like the remainder pretty much needs CertControlStore() */ if (!pCertControlStore) { - skip("CertControlStore() is not available\n"); + win_skip("CertControlStore() is not available\n"); return; } @@ -1113,7 +1113,7 @@ static void testFileStore(void) if (!pCertControlStore) { - skip("CertControlStore() is not available\n"); + win_skip("CertControlStore() is not available\n"); return; } @@ -1714,7 +1714,7 @@ static void testCertEnumSystemStore(void) if (!pCertEnumSystemStore) { - skip("CertEnumSystemStore() is not available\n"); + win_skip("CertEnumSystemStore() is not available\n"); return; } @@ -1754,7 +1754,7 @@ static void testStoreProperty(void) if (!pCertGetStoreProperty || !pCertSetStoreProperty) { - skip("CertGet/SetStoreProperty() is not available\n"); + win_skip("CertGet/SetStoreProperty() is not available\n"); return; } @@ -2016,7 +2016,7 @@ static void test_I_UpdateStore(void) if (!pI_CertUpdatestore) { - skip("No I_CertUpdateStore\n"); + win_skip("No I_CertUpdateStore\n"); return; } store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, diff --git a/rostests/winetests/crypt32/str.c b/rostests/winetests/crypt32/str.c index 2b30995615f..ebc334240ae 100644 --- a/rostests/winetests/crypt32/str.c +++ b/rostests/winetests/crypt32/str.c @@ -281,7 +281,7 @@ static void test_CertRDNValueToStrW(void) if (!pCertRDNValueToStrW) { - skip("CertRDNValueToStrW is not available\n"); + win_skip("CertRDNValueToStrW is not available\n"); return; } @@ -333,7 +333,7 @@ static void test_CertNameToStrA(void) if (!pCertNameToStrA) { - skip("CertNameToStrA is not available\n"); + win_skip("CertNameToStrA is not available\n"); return; } @@ -412,7 +412,7 @@ static void test_CertNameToStrW(void) if (!pCertNameToStrW) { - skip("CertNameToStrW is not available\n"); + win_skip("CertNameToStrW is not available\n"); return; } @@ -499,7 +499,7 @@ static void test_CertStrToNameA(void) if (!pCertStrToNameA) { - skip("CertStrToNameA is not available\n"); + win_skip("CertStrToNameA is not available\n"); return; } @@ -584,7 +584,7 @@ static void test_CertStrToNameW(void) if (!pCertStrToNameW) { - skip("CertStrToNameW is not available\n"); + win_skip("CertStrToNameW is not available\n"); return; } diff --git a/rostests/winetests/gdiplus/brush.c b/rostests/winetests/gdiplus/brush.c index ae831847835..d2cbd3c77e3 100644 --- a/rostests/winetests/gdiplus/brush.c +++ b/rostests/winetests/gdiplus/brush.c @@ -283,6 +283,67 @@ static void test_texturewrap(void) ReleaseDC(0, hdc); } +static void test_gradientgetrect(void) +{ + GpLineGradient *brush; + GpRectF rectf; + GpStatus status; + GpPointF pt1, pt2; + + pt1.X = pt1.Y = 1.0; + pt2.X = pt2.Y = 100.0; + status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + expectf(1.0, rectf.X); + expectf(1.0, rectf.Y); + expectf(99.0, rectf.Width); + expectf(99.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); + /* vertical gradient */ + pt1.X = pt1.Y = pt2.X = 0.0; + pt2.Y = 10.0; + status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + todo_wine expectf(-5.0, rectf.X); + expectf(0.0, rectf.Y); + todo_wine expectf(10.0, rectf.Width); + expectf(10.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); + /* horizontal gradient */ + pt1.X = pt1.Y = pt2.Y = 0.0; + pt2.X = 10.0; + status = GdipCreateLineBrush(&pt1, &pt2, 0, 0, WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + expectf(0.0, rectf.X); + todo_wine expectf(-5.0, rectf.Y); + expectf(10.0, rectf.Width); + todo_wine expectf(10.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); + /* from rect with LinearGradientModeHorizontal */ + rectf.X = rectf.Y = 10.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCreateLineBrushFromRect(&rectf, 0, 0, LinearGradientModeHorizontal, + WrapModeTile, &brush); + expect(Ok, status); + memset(&rectf, 0, sizeof(GpRectF)); + status = GdipGetLineRect(brush, &rectf); + expect(Ok, status); + expectf(10.0, rectf.X); + expectf(10.0, rectf.Y); + expectf(100.0, rectf.Width); + expectf(100.0, rectf.Height); + status = GdipDeleteBrush((GpBrush*)brush); +} + START_TEST(brush) { struct GdiplusStartupInput gdiplusStartupInput; @@ -303,6 +364,7 @@ START_TEST(brush) test_getgamma(); test_transform(); test_texturewrap(); + test_gradientgetrect(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/gdiplus.rbuild b/rostests/winetests/gdiplus/gdiplus.rbuild index 8966c181b0a..02cbcfd9413 100644 --- a/rostests/winetests/gdiplus/gdiplus.rbuild +++ b/rostests/winetests/gdiplus/gdiplus.rbuild @@ -22,6 +22,7 @@ user32 gdi32 kernel32 + ole32 ntdll diff --git a/rostests/winetests/gdiplus/graphics.c b/rostests/winetests/gdiplus/graphics.c index fb98a3810f7..8091a9adff3 100644 --- a/rostests/winetests/gdiplus/graphics.c +++ b/rostests/winetests/gdiplus/graphics.c @@ -486,6 +486,7 @@ static void test_Get_Release_DC(void) INT i; BOOL res; ARGB color = 0x00000000; + HRGN hrgn = CreateRectRgn(0, 0, 10, 10); pt[0].X = 10; pt[0].Y = 10; @@ -653,6 +654,10 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; status = GdipFlush(graphics, FlushIntentionFlush); expect(ObjectBusy, status); status = Ok; + status = GdipGetClipBounds(graphics, rectf); + expect(ObjectBusy, status); status = Ok; + status = GdipGetClipBoundsI(graphics, rect); + expect(ObjectBusy, status); status = Ok; status = GdipGetCompositingMode(graphics, &compmode); expect(ObjectBusy, status); status = Ok; status = GdipGetCompositingQuality(graphics, &quality); @@ -711,6 +716,8 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; status = GdipTranslateWorldTransform(graphics, 0.0, 0.0, MatrixOrderPrepend); expect(ObjectBusy, status); status = Ok; + status = GdipSetClipHrgn(graphics, hrgn, CombineModeReplace); + expect(ObjectBusy, status); status = Ok; status = GdipSetClipPath(graphics, path, CombineModeReplace); expect(ObjectBusy, status); status = Ok; status = GdipSetClipRect(graphics, 0.0, 0.0, 10.0, 10.0, CombineModeReplace); @@ -718,7 +725,11 @@ static void test_Get_Release_DC(void) status = GdipSetClipRectI(graphics, 0, 0, 10, 10, CombineModeReplace); expect(ObjectBusy, status); status = Ok; status = GdipSetClipRegion(graphics, clip, CombineModeReplace); - expect(ObjectBusy, status); + expect(ObjectBusy, status); status = Ok; + status = GdipTranslateClip(graphics, 0.0, 0.0); + expect(ObjectBusy, status); status = Ok; + status = GdipTranslateClipI(graphics, 0, 0); + expect(ObjectBusy, status); status = Ok; status = GdipDrawPolygon(graphics, pen, ptf, 5); expect(ObjectBusy, status); status = Ok; status = GdipDrawPolygonI(graphics, pen, pt, 5); @@ -746,6 +757,7 @@ static void test_Get_Release_DC(void) GdipDeleteBrush((GpBrush*)brush); GdipDeleteRegion(region); GdipDeleteMatrix(m); + DeleteObject(hrgn); ReleaseDC(0, hdc); } diff --git a/rostests/winetests/gdiplus/graphicspath.c b/rostests/winetests/gdiplus/graphicspath.c index 416d80caa90..6e257eb8008 100644 --- a/rostests/winetests/gdiplus/graphicspath.c +++ b/rostests/winetests/gdiplus/graphicspath.c @@ -907,7 +907,12 @@ static path_test_t addpie_path[] = { {79.4, 46.8, PathPointTypeBezier,0, 0}, /*3*/ {63.9, 49.0, PathPointTypeBezier | PathPointTypeCloseSubpath, 0, 0} /*4*/ }; - +static path_test_t addpie_path2[] = { + {0.0, 30.0, PathPointTypeStart | PathPointTypeCloseSubpath, 0, 0} /*0*/ + }; +static path_test_t addpie_path3[] = { + {30.0, 0.0, PathPointTypeStart | PathPointTypeCloseSubpath, 0, 0} /*0*/ + }; static void test_addpie(void) { GpStatus status; @@ -922,6 +927,20 @@ static void test_addpie(void) status = GdipAddPathPie(path, 0.0, 0.0, 100.0, 50.0, 10.0, 50.0); expect(Ok, status); ok_path(path, addpie_path, sizeof(addpie_path)/sizeof(path_test_t), FALSE); + status = GdipResetPath(path); + expect(Ok, status); + + /* zero width base ellipse */ + status = GdipAddPathPie(path, 0.0, 0.0, 0.0, 60.0, -90.0, 24.0); + expect(InvalidParameter, status); + ok_path(path, addpie_path2, sizeof(addpie_path2)/sizeof(path_test_t), FALSE); + status = GdipResetPath(path); + expect(Ok, status); + + /* zero height base ellipse */ + status = GdipAddPathPie(path, 0.0, 0.0, 60.0, 0.0 , -90.0, 24.0); + expect(InvalidParameter, status); + ok_path(path, addpie_path3, sizeof(addpie_path3)/sizeof(path_test_t), FALSE); GdipDeletePath(path); } @@ -1038,6 +1057,58 @@ static void test_flatten(void) GdipDeletePath(path); } +static void test_isvisible(void) +{ + GpPath *path; + GpGraphics *graphics = NULL; + HDC hdc = GetDC(0); + BOOL result; + GpStatus status; + + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + status = GdipCreatePath(FillModeAlternate, &path); + expect(Ok, status); + + /* NULL */ + status = GdipIsVisiblePathPoint(NULL, 0.0, 0.0, NULL, NULL); + expect(InvalidParameter, status); + status = GdipIsVisiblePathPoint(path, 0.0, 0.0, NULL, NULL); + expect(InvalidParameter, status); + status = GdipIsVisiblePathPoint(path, 0.0, 0.0, NULL, NULL); + expect(InvalidParameter, status); + status = GdipIsVisiblePathPoint(path, 0.0, 0.0, graphics, NULL); + expect(InvalidParameter, status); + + /* empty path */ + result = TRUE; + status = GdipIsVisiblePathPoint(path, 0.0, 0.0, NULL, &result); + expect(Ok, status); + expect(FALSE, result); + /* rect */ + status = GdipAddPathRectangle(path, 0.0, 0.0, 10.0, 10.0); + expect(Ok, status); + result = FALSE; + status = GdipIsVisiblePathPoint(path, 0.0, 0.0, NULL, &result); + expect(Ok, status); + expect(TRUE, result); + result = TRUE; + status = GdipIsVisiblePathPoint(path, 11.0, 11.0, NULL, &result); + expect(Ok, status); + expect(FALSE, result); + /* not affected by clipping */ + status = GdipSetClipRect(graphics, 5.0, 5.0, 5.0, 5.0, CombineModeReplace); + expect(Ok, status); + result = FALSE; + status = GdipIsVisiblePathPoint(path, 0.0, 0.0, graphics, &result); + expect(Ok, status); + expect(TRUE, result); + + GdipDeletePath(path); + GdipDeleteGraphics(graphics); + ReleaseDC(0, hdc); +} + START_TEST(graphicspath) { struct GdiplusStartupInput gdiplusStartupInput; @@ -1066,6 +1137,7 @@ START_TEST(graphicspath) test_reverse(); test_addpie(); test_flatten(); + test_isvisible(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/image.c b/rostests/winetests/gdiplus/image.c index 6000dde0b27..12fab7cb659 100644 --- a/rostests/winetests/gdiplus/image.c +++ b/rostests/winetests/gdiplus/image.c @@ -18,13 +18,69 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define COBJMACROS + +#include + +#include "initguid.h" #include "windows.h" #include "gdiplus.h" #include "wine/test.h" -#include -#include "wingdi.h" #define expect(expected, got) ok(((UINT)got) == ((UINT)expected), "Expected %.8x, got %.8x\n", (UINT)expected, (UINT)got) +#define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got) + +static void expect_rawformat(REFGUID expected, GpImage *img, int line, BOOL todo) +{ + GUID raw; + WCHAR bufferW[39]; + char buffer[39]; + char buffer2[39]; + GpStatus stat; + + stat = GdipGetImageRawFormat(img, &raw); + ok_(__FILE__, line)(stat == Ok, "GdipGetImageRawFormat failed with %d\n", stat); + if(stat != Ok) return; + StringFromGUID2(&raw, bufferW, sizeof(bufferW)/sizeof(bufferW[0])); + WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer, sizeof(buffer), NULL, NULL); + StringFromGUID2(expected, bufferW, sizeof(bufferW)/sizeof(bufferW[0])); + WideCharToMultiByte(CP_ACP, 0, bufferW, sizeof(bufferW)/sizeof(bufferW[0]), buffer2, sizeof(buffer2), NULL, NULL); + if(todo) + todo_wine ok_(__FILE__, line)(IsEqualGUID(&raw, expected), "Expected format %s, got %s\n", buffer2, buffer); + else + ok_(__FILE__, line)(IsEqualGUID(&raw, expected), "Expected format %s, got %s\n", buffer2, buffer); +} + +static void test_bufferrawformat(void* buff, int size, REFGUID expected, int line, BOOL todo) +{ + LPSTREAM stream; + HGLOBAL hglob; + LPBYTE data; + HRESULT hres; + GpStatus stat; + GpBitmap *bmp; + + hglob = GlobalAlloc (0, size); + data = GlobalLock (hglob); + memcpy(data, buff, size); + GlobalUnlock(hglob); data = NULL; + + hres = CreateStreamOnHGlobal(hglob, TRUE, &stream); + ok_(__FILE__, line)(hres == S_OK, "Failed to create a stream\n"); + if(hres != S_OK) return; + + stat = GdipCreateBitmapFromStream(stream, &bmp); + ok_(__FILE__, line)(stat == Ok, "Failed to create a Bitmap\n"); + if(stat != Ok){ + IStream_Release(stream); + return; + } + + expect_rawformat(expected, (GpImage*)bmp, line, todo); + + GdipDisposeImage((GpImage*)bmp); + IStream_Release(stream); +} static void test_Scan0(void) { @@ -73,10 +129,8 @@ static void test_Scan0(void) bm = NULL; stat = GdipCreateBitmapFromScan0(10, 10, -8, PixelFormat24bppRGB, buff, &bm); - todo_wine{ - expect(Ok, stat); - ok(NULL != bm, "Expected bitmap to be initialized\n"); - } + expect(Ok, stat); + ok(NULL != bm, "Expected bitmap to be initialized\n"); if (stat == Ok) GdipDisposeImage((GpImage*)bm); @@ -112,8 +166,8 @@ static void test_GetImageDimension(void) h = -1; stat = GdipGetImageDimension((GpImage*)bm,&w,&h); expect(Ok, stat); - ok(fabs(WIDTH - w) < 0.0001, "Width wrong\n"); - ok(fabs(HEIGHT - h) < 0.0001, "Height wrong\n"); + expectf(WIDTH, w); + expectf(HEIGHT, h); GdipDisposeImage((GpImage*)bm); } @@ -219,8 +273,8 @@ static void test_SavingImages(void) stat = GdipGetImageDimension((GpImage*)bm, &w, &h); if (stat != Ok) goto cleanup; - ok((fabs(w - WIDTH) < 0.01) && (fabs(h - HEIGHT) < 0.01), - "Saved image dimensions are different!\n"); + expectf(WIDTH, w); + expectf(HEIGHT, h); cleanup: GdipFree(codecs); @@ -416,8 +470,8 @@ static void test_GdipCreateBitmapFromHBITMAP(void) stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); expect(Ok, stat); expect(Ok, GdipGetImageDimension((GpImage*) gpbm, &width, &height)); - ok(fabs(WIDTH1 - width) < .0001, "width wrong\n"); - ok(fabs(HEIGHT1 - height) < .0001, "height wrong\n"); + expectf(WIDTH1, width); + expectf(HEIGHT1, height); if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); GlobalFree(hbm); @@ -425,9 +479,12 @@ static void test_GdipCreateBitmapFromHBITMAP(void) hbm = CreateBitmap(WIDTH2, HEIGHT2, 1, 1, &buff); stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); expect(Ok, stat); + /* raw format */ + expect_rawformat(&ImageFormatMemoryBMP, (GpImage*)gpbm, __LINE__, TRUE); + expect(Ok, GdipGetImageDimension((GpImage*) gpbm, &width, &height)); - ok(fabs(WIDTH2 - width) < .0001, "width wrong\n"); - ok(fabs(HEIGHT2 - height) < .0001, "height wrong\n"); + expectf(WIDTH2, width); + expectf(HEIGHT2, height); if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); GlobalFree(hbm); @@ -447,15 +504,15 @@ static void test_GdipCreateBitmapFromHBITMAP(void) stat = GdipCreateBitmapFromHBITMAP(hbm, NULL, &gpbm); expect(Ok, stat); expect(Ok, GdipGetImageDimension((GpImage*) gpbm, &width, &height)); - ok(fabs(WIDTH1 - width) < .0001, "width wrong\n"); - ok(fabs(HEIGHT1 - height) < .0001, "height wrong\n"); + expectf(WIDTH1, width); + expectf(HEIGHT1, height); if (stat == Ok) GdipDisposeImage((GpImage*)gpbm); LogPal = GdipAlloc(sizeof(LOGPALETTE)); ok(LogPal != NULL, "unable to allocate LOGPALETTE\n"); LogPal->palVersion = 0x300; - hpal = CreatePalette((const LOGPALETTE*) LogPal); + hpal = CreatePalette(LogPal); ok(hpal != NULL, "CreatePalette failed\n"); GdipFree(LogPal); @@ -501,10 +558,12 @@ static void test_GdipCloneImage(void) /* Create an image, clone it, delete the original, make sure the copy works */ stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat24bppRGB, NULL, &bm); expect(Ok, stat); + expect_rawformat(&ImageFormatMemoryBMP, (GpImage*)bm, __LINE__, TRUE); image_src = ((GpImage*)bm); stat = GdipCloneImage(image_src, &image_dest); expect(Ok, stat); + expect_rawformat(&ImageFormatMemoryBMP, image_dest, __LINE__, TRUE); stat = GdipDisposeImage((GpImage*)bm); expect(Ok, stat); @@ -512,8 +571,8 @@ static void test_GdipCloneImage(void) expect(Ok, stat); /* Treat FP values carefully */ - ok(fabsf(rectF.Width-WIDTH)<1e-5, "Expected: %d, got %.05f\n", WIDTH, rectF.Width); - ok(fabsf(rectF.Height-HEIGHT)<1e-5, "Expected: %d, got %.05f\n", HEIGHT, rectF.Height); + expectf((REAL)WIDTH, rectF.Width); + expectf((REAL)HEIGHT, rectF.Height); stat = GdipDisposeImage(image_dest); expect(Ok, stat); @@ -530,6 +589,150 @@ static void test_testcontrol(void) ok(param != 0, "Build number expected, got %u\n", param); } +static void test_fromhicon(void) +{ + static const BYTE bmp_bits[1024]; + HBITMAP hbmMask, hbmColor; + ICONINFO info; + HICON hIcon; + GpStatus stat; + GpBitmap *bitmap = NULL; + UINT dim; + ImageType type; + PixelFormat format; + + /* NULL */ + stat = GdipCreateBitmapFromHICON(NULL, NULL); + expect(InvalidParameter, stat); + stat = GdipCreateBitmapFromHICON(NULL, &bitmap); + expect(InvalidParameter, stat); + + /* color icon 1 bit */ + hbmMask = CreateBitmap(16, 16, 1, 1, bmp_bits); + ok(hbmMask != 0, "CreateBitmap failed\n"); + hbmColor = CreateBitmap(16, 16, 1, 1, bmp_bits); + ok(hbmColor != 0, "CreateBitmap failed\n"); + info.fIcon = TRUE; + info.xHotspot = 8; + info.yHotspot = 8; + info.hbmMask = hbmMask; + info.hbmColor = hbmColor; + hIcon = CreateIconIndirect(&info); + ok(hIcon != 0, "CreateIconIndirect failed\n"); + DeleteObject(hbmMask); + DeleteObject(hbmColor); + + stat = GdipCreateBitmapFromHICON(hIcon, &bitmap); + expect(Ok, stat); + if(stat == Ok){ + /* check attributes */ + stat = GdipGetImageHeight((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageWidth((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageType((GpImage*)bitmap, &type); + expect(Ok, stat); + expect(ImageTypeBitmap, type); + stat = GdipGetImagePixelFormat((GpImage*)bitmap, &format); + expect(PixelFormat32bppARGB, format); + /* raw format */ + expect_rawformat(&ImageFormatMemoryBMP, (GpImage*)bitmap, __LINE__, TRUE); + GdipDisposeImage((GpImage*)bitmap); + } + DestroyIcon(hIcon); + + /* color icon 8 bpp */ + hbmMask = CreateBitmap(16, 16, 1, 8, bmp_bits); + ok(hbmMask != 0, "CreateBitmap failed\n"); + hbmColor = CreateBitmap(16, 16, 1, 8, bmp_bits); + ok(hbmColor != 0, "CreateBitmap failed\n"); + info.fIcon = TRUE; + info.xHotspot = 8; + info.yHotspot = 8; + info.hbmMask = hbmMask; + info.hbmColor = hbmColor; + hIcon = CreateIconIndirect(&info); + ok(hIcon != 0, "CreateIconIndirect failed\n"); + DeleteObject(hbmMask); + DeleteObject(hbmColor); + + stat = GdipCreateBitmapFromHICON(hIcon, &bitmap); + expect(Ok, stat); + if(stat == Ok){ + /* check attributes */ + stat = GdipGetImageHeight((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageWidth((GpImage*)bitmap, &dim); + expect(Ok, stat); + expect(16, dim); + stat = GdipGetImageType((GpImage*)bitmap, &type); + expect(Ok, stat); + expect(ImageTypeBitmap, type); + stat = GdipGetImagePixelFormat((GpImage*)bitmap, &format); + expect(PixelFormat32bppARGB, format); + /* raw format */ + expect_rawformat(&ImageFormatMemoryBMP, (GpImage*)bitmap, __LINE__, TRUE); + GdipDisposeImage((GpImage*)bitmap); + } + DestroyIcon(hIcon); +} + +/* 1x1 pixel png */ +static const unsigned char pngimage[285] = { +0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53, +0xde,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b, +0x13,0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xd5, +0x06,0x03,0x0f,0x07,0x2d,0x12,0x10,0xf0,0xfd,0x00,0x00,0x00,0x0c,0x49,0x44,0x41, +0x54,0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59, +0xe7,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 +}; +/* 1x1 pixel gif */ +static const unsigned char gifimage[35] = { +0x47,0x49,0x46,0x38,0x37,0x61,0x01,0x00,0x01,0x00,0x80,0x00,0x00,0xff,0xff,0xff, +0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x02,0x02,0x44, +0x01,0x00,0x3b +}; +/* 1x1 pixel bmp */ +static const unsigned char bmpimage[66] = { +0x42,0x4d,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00, +0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00, +0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x12,0x0b,0x00,0x00,0x02,0x00, +0x00,0x00,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00, +0x00,0x00 +}; +/* 1x1 pixel jpg */ +static const unsigned char jpgimage[285] = { +0xff,0xd8,0xff,0xe0,0x00,0x10,0x4a,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x01,0x2c, +0x01,0x2c,0x00,0x00,0xff,0xdb,0x00,0x43,0x00,0x05,0x03,0x04,0x04,0x04,0x03,0x05, +0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x07,0x0c,0x08,0x07,0x07,0x07,0x07,0x0f,0x0b, +0x0b,0x09,0x0c,0x11,0x0f,0x12,0x12,0x11,0x0f,0x11,0x11,0x13,0x16,0x1c,0x17,0x13, +0x14,0x1a,0x15,0x11,0x11,0x18,0x21,0x18,0x1a,0x1d,0x1d,0x1f,0x1f,0x1f,0x13,0x17, +0x22,0x24,0x22,0x1e,0x24,0x1c,0x1e,0x1f,0x1e,0xff,0xdb,0x00,0x43,0x01,0x05,0x05, +0x05,0x07,0x06,0x07,0x0e,0x08,0x08,0x0e,0x1e,0x14,0x11,0x14,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0xff,0xc0, +0x00,0x11,0x08,0x00,0x01,0x00,0x01,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11, +0x01,0xff,0xc4,0x00,0x15,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xc4,0x00,0x14,0x10,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xc4, +0x00,0x14,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xff,0xc4,0x00,0x14,0x11,0x01,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xda,0x00,0x0c,0x03,0x01, +0x00,0x02,0x11,0x03,0x11,0x00,0x3f,0x00,0xb2,0xc0,0x07,0xff,0xd9 +}; +static void test_getrawformat(void) +{ + test_bufferrawformat((void*)pngimage, sizeof(pngimage), &ImageFormatPNG, __LINE__, TRUE); + test_bufferrawformat((void*)gifimage, sizeof(gifimage), &ImageFormatGIF, __LINE__, TRUE); + test_bufferrawformat((void*)bmpimage, sizeof(bmpimage), &ImageFormatBMP, __LINE__, FALSE); + test_bufferrawformat((void*)jpgimage, sizeof(jpgimage), &ImageFormatJPEG, __LINE__, TRUE); +} + START_TEST(image) { struct GdiplusStartupInput gdiplusStartupInput; @@ -553,6 +756,8 @@ START_TEST(image) test_GdipGetImageFlags(); test_GdipCloneImage(); test_testcontrol(); + test_fromhicon(); + test_getrawformat(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/region.c b/rostests/winetests/gdiplus/region.c index 9ac0e9a78fe..689811cedc4 100644 --- a/rostests/winetests/gdiplus/region.c +++ b/rostests/winetests/gdiplus/region.c @@ -709,6 +709,9 @@ static void test_fromhrgn(void) UINT needed; DWORD buf[220]; RegionDataPoint *point; + GpGraphics *graphics = NULL; + HDC hdc; + BOOL res; /* NULL */ status = GdipCreateRegionHrgn(NULL, NULL); @@ -716,24 +719,42 @@ static void test_fromhrgn(void) status = GdipCreateRegionHrgn(NULL, ®ion); expect(InvalidParameter, status); status = GdipCreateRegionHrgn((HRGN)0xdeadbeef, ®ion); - todo_wine expect(InvalidParameter, status); + expect(InvalidParameter, status); + + /* empty rectangle */ + hrgn = CreateRectRgn(0, 0, 0, 0); + status = GdipCreateRegionHrgn(hrgn, ®ion); + expect(Ok, status); + if(status == Ok) { + + hdc = GetDC(0); + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + res = FALSE; + status = GdipIsEmptyRegion(region, graphics, &res); + expect(Ok, status); + expect(TRUE, res); + GdipDeleteGraphics(graphics); + ReleaseDC(0, hdc); + GdipDeleteRegion(region); + + } + DeleteObject(hrgn); /* rectangle */ hrgn = CreateRectRgn(0, 0, 100, 10); status = GdipCreateRegionHrgn(hrgn, ®ion); - todo_wine expect(Ok, status); + expect(Ok, status); status = GdipGetRegionDataSize(region, &needed); -todo_wine{ expect(Ok, status); expect(56, needed); -} status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); - todo_wine expect(Ok, status); + expect(Ok, status); if(status == Ok){ -todo_wine{ + expect(56, needed); expect_dword(buf, 48); expect_magic((DWORD*)(buf + 2)); @@ -742,25 +763,23 @@ todo_wine{ expect_dword(buf + 5, 0x00000020); expect_magic((DWORD*)(buf + 6)); expect_dword(buf + 7, 0x00000004); - expect_dword(buf + 8, 0x00006000); /* ?? */ -} + todo_wine expect_dword(buf + 8, 0x00006000); /* ?? */ + point = (RegionDataPoint*)buf + 9; expect(0, point[0].X); expect(0, point[0].Y); -todo_wine{ expect(100,point[1].X); /* buf + 10 */ expect(0, point[1].Y); expect(100,point[2].X); /* buf + 11 */ expect(10, point[2].Y); -} + expect(0, point[3].X); /* buf + 12 */ -todo_wine{ expect(10, point[3].Y); expect_dword(buf + 13, 0x81010100); /* closed */ -} + } GdipDeleteRegion(region); @@ -777,6 +796,10 @@ todo_wine{ expect(216, needed); } status = GdipGetRegionData(region, (BYTE*)buf, sizeof(buf), &needed); + todo_wine expect(Ok, status); + + if(status == Ok) + { todo_wine{ expect(Ok, status); expect(216, needed); @@ -789,6 +812,8 @@ todo_wine{ expect_dword(buf + 7, 0x00000024); expect_dword(buf + 8, 0x00006000); /* ?? */ } + } + GdipDeleteRegion(region); DeleteObject(hrgn); } @@ -926,6 +951,236 @@ static void test_gethrgn(void) ReleaseDC(0, hdc); } +static void test_isequal(void) +{ + GpRegion *region1, *region2; + GpGraphics *graphics; + GpRectF rectf; + GpStatus status; + HDC hdc = GetDC(0); + BOOL res; + + status = GdipCreateFromHDC(hdc, &graphics); + ok(status == Ok, "status %08x\n", status); + + status = GdipCreateRegion(®ion1); + ok(status == Ok, "status %08x\n", status); + status = GdipCreateRegion(®ion2); + ok(status == Ok, "status %08x\n", status); + + /* NULL */ + status = GdipIsEqualRegion(NULL, NULL, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipIsEqualRegion(region1, region2, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipIsEqualRegion(region1, region2, graphics, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipIsEqualRegion(region1, region2, NULL, &res); + ok(status == InvalidParameter, "status %08x\n", status); + + /* infinite regions */ + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* empty regions */ + status = GdipSetEmpty(region1); + ok(status == Ok, "status %08x\n", status); + status = GdipSetEmpty(region2); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* empty & infinite */ + status = GdipSetInfinite(region1); + ok(status == Ok, "status %08x\n", status); + res = TRUE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(!res, "Expected to be unequal.\n"); + /* rect & (inf/empty) */ + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region1, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + res = TRUE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(!res, "Expected to be unequal.\n"); + status = GdipSetInfinite(region2); + ok(status == Ok, "status %08x\n", status); + res = TRUE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(!res, "Expected to be unequal.\n"); + /* roughly equal rectangles */ + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.001; + status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* equal rectangles */ + rectf.X = rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region1, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + + /* cleanup */ + status = GdipDeleteRegion(region1); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteRegion(region2); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteGraphics(graphics); + ok(status == Ok, "status %08x\n", status); + ReleaseDC(0, hdc); +} + +static void test_translate(void) +{ + GpRegion *region, *region2; + GpGraphics *graphics; + GpPath *path; + GpRectF rectf; + GpStatus status; + HDC hdc = GetDC(0); + BOOL res; + + status = GdipCreateFromHDC(hdc, &graphics); + ok(status == Ok, "status %08x\n", status); + + status = GdipCreatePath(FillModeAlternate, &path); + ok(status == Ok, "status %08x\n", status); + + status = GdipCreateRegion(®ion); + ok(status == Ok, "status %08x\n", status); + status = GdipCreateRegion(®ion2); + ok(status == Ok, "status %08x\n", status); + + /* NULL */ + status = GdipTranslateRegion(NULL, 0.0, 0.0); + ok(status == InvalidParameter, "status %08x\n", status); + + /* infinite */ + status = GdipTranslateRegion(region, 10.0, 10.0); + ok(status == Ok, "status %08x\n", status); + /* empty */ + status = GdipSetEmpty(region); + ok(status == Ok, "status %08x\n", status); + status = GdipTranslateRegion(region, 10.0, 10.0); + ok(status == Ok, "status %08x\n", status); + /* rect */ + rectf.X = 10.0; rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + rectf.X = 15.0; rectf.Y = -2.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region2, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + status = GdipTranslateRegion(region, 5.0, -2.0); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + /* path */ + status = GdipAddPathEllipse(path, 0.0, 10.0, 100.0, 150.0); + ok(status == Ok, "status %08x\n", status); + status = GdipCombineRegionPath(region, path, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + status = GdipResetPath(path); + ok(status == Ok, "status %08x\n", status); + status = GdipAddPathEllipse(path, 10.0, 21.0, 100.0, 150.0); + ok(status == Ok, "status %08x\n", status); + status = GdipCombineRegionPath(region2, path, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + status = GdipTranslateRegion(region, 10.0, 11.0); + ok(status == Ok, "status %08x\n", status); + res = FALSE; + status = GdipIsEqualRegion(region, region2, graphics, &res); + ok(status == Ok, "status %08x\n", status); + ok(res, "Expected to be equal.\n"); + + status = GdipDeleteRegion(region); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteRegion(region2); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteGraphics(graphics); + ok(status == Ok, "status %08x\n", status); + status = GdipDeletePath(path); + ok(status == Ok, "status %08x\n", status); + ReleaseDC(0, hdc); +} + +static void test_getbounds(void) +{ + GpRegion *region; + GpGraphics *graphics; + GpStatus status; + GpRectF rectf; + HDC hdc = GetDC(0); + + status = GdipCreateFromHDC(hdc, &graphics); + ok(status == Ok, "status %08x\n", status); + status = GdipCreateRegion(®ion); + ok(status == Ok, "status %08x\n", status); + + /* NULL */ + status = GdipGetRegionBounds(NULL, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipGetRegionBounds(region, NULL, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + status = GdipGetRegionBounds(region, graphics, NULL); + ok(status == InvalidParameter, "status %08x\n", status); + /* infinite */ + rectf.X = rectf.Y = 0.0; + rectf.Height = rectf.Width = 100.0; + status = GdipGetRegionBounds(region, graphics, &rectf); + ok(status == Ok, "status %08x\n", status); + ok(rectf.X == -(REAL)(1 << 22), "Expected X = %.2f, got %.2f\n", -(REAL)(1 << 22), rectf.X); + ok(rectf.Y == -(REAL)(1 << 22), "Expected Y = %.2f, got %.2f\n", -(REAL)(1 << 22), rectf.Y); + ok(rectf.Width == (REAL)(1 << 23), "Expected width = %.2f, got %.2f\n", (REAL)(1 << 23), rectf.Width); + ok(rectf.Height == (REAL)(1 << 23), "Expected height = %.2f, got %.2f\n",(REAL)(1 << 23), rectf.Height); + /* empty */ + rectf.X = rectf.Y = 0.0; + rectf.Height = rectf.Width = 100.0; + status = GdipSetEmpty(region); + ok(status == Ok, "status %08x\n", status); + status = GdipGetRegionBounds(region, graphics, &rectf); + ok(status == Ok, "status %08x\n", status); + ok(rectf.X == 0.0, "Expected X = 0.0, got %.2f\n", rectf.X); + ok(rectf.Y == 0.0, "Expected Y = 0.0, got %.2f\n", rectf.Y); + ok(rectf.Width == 0.0, "Expected width = 0.0, got %.2f\n", rectf.Width); + ok(rectf.Height == 0.0, "Expected height = 0.0, got %.2f\n", rectf.Height); + /* rect */ + rectf.X = 10.0; rectf.Y = 0.0; + rectf.Width = rectf.Height = 100.0; + status = GdipCombineRegionRect(region, &rectf, CombineModeReplace); + ok(status == Ok, "status %08x\n", status); + rectf.X = rectf.Y = 0.0; + rectf.Height = rectf.Width = 0.0; + status = GdipGetRegionBounds(region, graphics, &rectf); + ok(status == Ok, "status %08x\n", status); + ok(rectf.X == 10.0, "Expected X = 0.0, got %.2f\n", rectf.X); + ok(rectf.Y == 0.0, "Expected Y = 0.0, got %.2f\n", rectf.Y); + ok(rectf.Width == 100.0, "Expected width = 0.0, got %.2f\n", rectf.Width); + ok(rectf.Height == 100.0, "Expected height = 0.0, got %.2f\n", rectf.Height); + + status = GdipDeleteRegion(region); + ok(status == Ok, "status %08x\n", status); + status = GdipDeleteGraphics(graphics); + ok(status == Ok, "status %08x\n", status); + ReleaseDC(0, hdc); +} + START_TEST(region) { struct GdiplusStartupInput gdiplusStartupInput; @@ -944,6 +1199,9 @@ START_TEST(region) test_combinereplace(); test_fromhrgn(); test_gethrgn(); + test_isequal(); + test_translate(); + test_getbounds(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/stringformat.c b/rostests/winetests/gdiplus/stringformat.c index 93319128f28..b28dbc6d355 100644 --- a/rostests/winetests/gdiplus/stringformat.c +++ b/rostests/winetests/gdiplus/stringformat.c @@ -318,6 +318,67 @@ static void test_getgenericdefault(void) expect(Ok, stat); } +static void test_stringformatflags(void) +{ + GpStringFormat *format; + GpStatus stat; + + INT flags; + + stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format); + expect(Ok, stat); + + /* NULL args */ + stat = GdipSetStringFormatFlags(NULL, 0); + expect(InvalidParameter, stat); + + stat = GdipSetStringFormatFlags(format, 0); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(0, flags); + + /* Check some valid flags */ + stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionRightToLeft); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(StringFormatFlagsDirectionRightToLeft, flags); + + stat = GdipSetStringFormatFlags(format, StringFormatFlagsNoFontFallback); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(StringFormatFlagsNoFontFallback, flags); + + /* Check some flag combinations */ + stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionVertical + | StringFormatFlagsNoFitBlackBox); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect((StringFormatFlagsDirectionVertical + | StringFormatFlagsNoFitBlackBox), flags); + + stat = GdipSetStringFormatFlags(format, StringFormatFlagsDisplayFormatControl + | StringFormatFlagsMeasureTrailingSpaces); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect((StringFormatFlagsDisplayFormatControl + | StringFormatFlagsMeasureTrailingSpaces), flags); + + /* Check invalid flags */ + stat = GdipSetStringFormatFlags(format, 0xdeadbeef); + expect(Ok, stat); + stat = GdipGetStringFormatFlags(format, &flags); + expect(Ok, stat); + expect(0xdeadbeef, flags); + + stat = GdipDeleteStringFormat(format); + expect(Ok, stat); +} + START_TEST(stringformat) { struct GdiplusStartupInput gdiplusStartupInput; @@ -336,6 +397,7 @@ START_TEST(stringformat) test_getgenerictypographic(); test_tabstops(); test_getgenericdefault(); + test_stringformatflags(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/lz32/lzexpand_main.c b/rostests/winetests/lz32/lzexpand_main.c index 187aa803c7a..91fd6873e3f 100644 --- a/rostests/winetests/lz32/lzexpand_main.c +++ b/rostests/winetests/lz32/lzexpand_main.c @@ -231,7 +231,7 @@ static void test_LZOpenFileA_existing_compressed(void) file = LZOpenFileA(_terminated, &test, OF_EXIST); ok(file >= 0, "LZOpenFileA failed on switching to a compressed file name\n"); ok(test.cBytes == sizeof(OFSTRUCT) || - broken(test.cBytes == 40), /* win95 */ + broken(test.cBytes == FIELD_OFFSET(OFSTRUCT, szPathName) + lstrlenA(test.szPathName)), /* win9x */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == 0, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -390,8 +390,8 @@ static void test_LZOpenFileA(void) file = LZOpenFileA(filename_, &test, OF_READ); ok(file >= 0, "LZOpenFileA failed on read\n"); ok(test.cBytes == sizeof(OFSTRUCT) || - broken(test.cBytes == 40), /* win95 */ - "LZOpenFileA set test.cBytes to %d\n", test.cBytes); + broken(test.cBytes == FIELD_OFFSET(OFSTRUCT, szPathName) + lstrlenA(test.szPathName)), /* win9x */ + "LZOpenFileA set test.cBytes to %d '%s'('%s')\n", test.cBytes, expected, short_expected); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); ok(lstrcmpA(test.szPathName, expected) == 0 || @@ -406,7 +406,7 @@ static void test_LZOpenFileA(void) file = LZOpenFileA(filename_, &test, OF_WRITE); ok(file >= 0, "LZOpenFileA failed on write\n"); ok(test.cBytes == sizeof(OFSTRUCT) || - broken(test.cBytes == 40), /* win95 */ + broken(test.cBytes == FIELD_OFFSET(OFSTRUCT, szPathName) + lstrlenA(test.szPathName)), /* win9x */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -422,7 +422,7 @@ static void test_LZOpenFileA(void) file = LZOpenFileA(filename_, &test, OF_READWRITE); ok(file >= 0, "LZOpenFileA failed on read/write\n"); ok(test.cBytes == sizeof(OFSTRUCT) || - broken(test.cBytes == 40), /* win95 */ + broken(test.cBytes == FIELD_OFFSET(OFSTRUCT, szPathName) + lstrlenA(test.szPathName)), /* win9x */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -438,7 +438,7 @@ static void test_LZOpenFileA(void) file = LZOpenFileA(filename_, &test, OF_EXIST); ok(file >= 0, "LZOpenFileA failed on read/write\n"); ok(test.cBytes == sizeof(OFSTRUCT) || - broken(test.cBytes == 40), /* win95 */ + broken(test.cBytes == FIELD_OFFSET(OFSTRUCT, szPathName) + lstrlenA(test.szPathName)), /* win9x */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); @@ -454,7 +454,7 @@ static void test_LZOpenFileA(void) file = LZOpenFileA(filename_, &test, OF_DELETE); ok(file >= 0, "LZOpenFileA failed on delete\n"); ok(test.cBytes == sizeof(OFSTRUCT) || - broken(test.cBytes == 40), /* win95 */ + broken(test.cBytes == FIELD_OFFSET(OFSTRUCT, szPathName) + lstrlenA(test.szPathName)), /* win9x */ "LZOpenFileA set test.cBytes to %d\n", test.cBytes); ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode); diff --git a/rostests/winetests/mapi32/imalloc.c b/rostests/winetests/mapi32/imalloc.c index 5e3a06014f3..9ce94b0a04c 100644 --- a/rostests/winetests/mapi32/imalloc.c +++ b/rostests/winetests/mapi32/imalloc.c @@ -93,7 +93,7 @@ START_TEST(imalloc) pScInitMapiUtil = (void*)GetProcAddress(hMapi32, "ScInitMapiUtil@4"); if (!pScInitMapiUtil) { - skip("ScInitMapiUtil is not available\n"); + win_skip("ScInitMapiUtil is not available\n"); FreeLibrary(hMapi32); return; } @@ -102,7 +102,7 @@ START_TEST(imalloc) ret = pScInitMapiUtil(0); if ((ret != S_OK) && (GetLastError() == ERROR_PROC_NOT_FOUND)) { - skip("ScInitMapiUtil is not implemented\n"); + win_skip("ScInitMapiUtil is not implemented\n"); FreeLibrary(hMapi32); return; } diff --git a/rostests/winetests/mapi32/prop.c b/rostests/winetests/mapi32/prop.c index 0e979d15e08..8226bead08a 100644 --- a/rostests/winetests/mapi32/prop.c +++ b/rostests/winetests/mapi32/prop.c @@ -239,7 +239,8 @@ static void test_UlPropSize(void) } res = pUlPropSize(&pv); - ok(res == exp, "pt= %d: Expected %d, got %d\n", pt, exp, res); + ok(res == exp || broken(!res) /* Win9x */, + "pt= %d: Expected %d, got %d\n", pt, exp, res); } } @@ -280,30 +281,30 @@ static void test_FPropContainsProp(void) pvRight.Value.lpszA = szFull; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); - ok(bRet == TRUE, "(full,full)[] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,full)[] match failed\n"); pvRight.Value.lpszA = szPrefix; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); ok(bRet == FALSE, "(full,prefix)[] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == TRUE, "(full,prefix)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "(full,prefix)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,prefix)[SUBSTRING] match failed\n"); pvRight.Value.lpszA = szPrefixLower; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "(full,prefixlow)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); ok(bRet == FALSE, "(full,prefixlow)[SUBSTRING] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX|FL_IGNORECASE); - ok(bRet == TRUE, "(full,prefixlow)[PREFIX|IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,prefixlow)[PREFIX|IGNORECASE] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING|FL_IGNORECASE); - ok(bRet == TRUE, "(full,prefixlow)[SUBSTRING|IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,prefixlow)[SUBSTRING|IGNORECASE] match failed\n"); pvRight.Value.lpszA = szSubstring; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); ok(bRet == FALSE, "(full,substr)[] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "(full,substr)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "(full,substr)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,substr)[SUBSTRING] match failed\n"); pvRight.Value.lpszA = szSubstringLower; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "(full,substrlow)[PREFIX] match failed\n"); @@ -312,10 +313,10 @@ static void test_FPropContainsProp(void) bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX|FL_IGNORECASE); ok(bRet == FALSE, "(full,substrlow)[PREFIX|IGNORECASE] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING|FL_IGNORECASE); - ok(bRet == TRUE, "(full,substrlow)[SUBSTRING|IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,substrlow)[SUBSTRING|IGNORECASE] match failed\n"); pvRight.Value.lpszA = szFullLower; bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING|FL_IGNORECASE); - ok(bRet == TRUE, "(full,fulllow)[IGNORECASE] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "(full,fulllow)[IGNORECASE] match failed\n"); pvLeft.ulPropTag = pvRight.ulPropTag = PT_BINARY; pvLeft.Value.bin.lpb = (LPBYTE)szFull; @@ -323,15 +324,15 @@ static void test_FPropContainsProp(void) pvLeft.Value.bin.cb = pvRight.Value.bin.cb = strlen(szFull); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); - ok(bRet == TRUE, "bin(full,full)[] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,full)[] match failed\n"); pvRight.Value.bin.lpb = (LPBYTE)szPrefix; pvRight.Value.bin.cb = strlen(szPrefix); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_FULLSTRING); ok(bRet == FALSE, "bin(full,prefix)[] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); - ok(bRet == TRUE, "bin(full,prefix)[PREFIX] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,prefix)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "bin(full,prefix)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,prefix)[SUBSTRING] match failed\n"); pvRight.Value.bin.lpb = (LPBYTE)szPrefixLower; pvRight.Value.bin.cb = strlen(szPrefixLower); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); @@ -349,7 +350,7 @@ static void test_FPropContainsProp(void) bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); ok(bRet == FALSE, "bin(full,substr)[PREFIX] match failed\n"); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_SUBSTRING); - ok(bRet == TRUE, "bin(full,substr)[SUBSTRING] match failed\n"); + ok(bRet == TRUE || broken(!bRet) /* Win9x */, "bin(full,substr)[SUBSTRING] match failed\n"); pvRight.Value.bin.lpb = (LPBYTE)szSubstringLower; pvRight.Value.bin.cb = strlen(szSubstringLower); bRet = pFPropContainsProp(&pvLeft, &pvRight, FL_PREFIX); @@ -502,7 +503,8 @@ static void test_FPropCompareProp(void) } bRet = pFPropCompareProp(&pvLeft, FPCProp_Results[j].relOp, &pvRight); - ok(bRet == bExp, "pt %d (%d,%d,%s): expected %d, got %d\n", ptTypes[i], + ok(bRet == bExp || broken(!bRet) /* Win9x */, + "pt %d (%d,%d,%s): expected %d, got %d\n", ptTypes[i], FPCProp_Results[j].lVal, FPCProp_Results[j].rVal, relops[FPCProp_Results[j].relOp], bExp, bRet); } @@ -625,7 +627,8 @@ static void test_LPropCompareProp(void) } iRet = pLPropCompareProp(&pvLeft, &pvRight); - ok(iRet == iExp, "pt %d (%d,%d): expected %d, got %d\n", ptTypes[i], + ok(iRet == iExp || broken(iRet == 0) /* Win9x */, + "pt %d (%d,%d): expected %d, got %d\n", ptTypes[i], LPCProp_Results[j].lVal, LPCProp_Results[j].rVal, iExp, iRet); } } @@ -646,7 +649,8 @@ static void test_PpropFindProp(void) pvProp.ulPropTag = ptTypes[i]; pRet = pPpropFindProp(&pvProp, 1u, ptTypes[i]); - ok(pRet == &pvProp, "PpropFindProp[%d]: Didn't find existing propery\n", + ok(pRet == &pvProp || broken(pRet != &pvProp) /* Win9x */, + "PpropFindProp[%d]: Didn't find existing propery\n", ptTypes[i]); pRet = pPpropFindProp(&pvProp, 1u, i ? ptTypes[i-1] : ptTypes[i+1]); @@ -882,7 +886,8 @@ static void test_LpValFindProp(void) pvProp.ulPropTag = PROP_TAG(ptTypes[i], 1u); pRet = pLpValFindProp(PROP_TAG(ptTypes[i], 1u), 1u, &pvProp); - ok(pRet == &pvProp, "LpValFindProp[%d]: Didn't find existing propery id/type\n", + ok(pRet == &pvProp || broken(pRet != &pvProp) /* Win9x */, + "LpValFindProp[%d]: Didn't find existing propery id/type\n", ptTypes[i]); pRet = pLpValFindProp(PROP_TAG(ptTypes[i], 0u), 1u, &pvProp); @@ -894,7 +899,8 @@ static void test_LpValFindProp(void) ptTypes[i]); pRet = pLpValFindProp(PROP_TAG(PT_NULL, 1u), 1u, &pvProp); - ok(pRet == &pvProp, "LpValFindProp[%d]: Didn't find existing propery id\n", + ok(pRet == &pvProp || broken(pRet != &pvProp) /* Win9x */, + "LpValFindProp[%d]: Didn't find existing propery id\n", ptTypes[i]); } } @@ -990,7 +996,8 @@ static void test_FBadPropTag(void) if (bBad) ok(res != 0, "pt= %d: Expected non-zero, got 0\n", pt); else - ok(res == 0, "pt= %d: Expected zero, got %d\n", pt, res); + ok(res == 0 || broken(res) /* Win9x */, + "pt= %d: Expected zero, got %d\n", pt, res); } } @@ -1079,7 +1086,8 @@ static void test_FBadProp(void) if (bBad) ok(res != 0, "pt= %d: Expected non-zero, got 0\n", pt); else - ok(res == 0, "pt= %d: Expected zero, got %d\n", pt, res); + ok(res == 0 || broken(res) /* Win9x */, + "pt= %d: Expected zero, got %d\n", pt, res); } } @@ -1130,7 +1138,8 @@ static void test_FBadColumnSet(void) if (bBad) ok(res != 0, "pt= %d: Expected non-zero, got 0\n", pt); else - ok(res == 0, "pt= %d: Expected zero, got %d\n", pt, res); + ok(res == 0 || broken(res) /* Win9x */, + "pt= %d: Expected zero, got %d\n", pt, res); } } @@ -1353,7 +1362,7 @@ START_TEST(prop) if(!InitFuncPtrs()) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); return; } @@ -1361,7 +1370,7 @@ START_TEST(prop) ret = pScInitMapiUtil(0); if ((ret != S_OK) && (GetLastError() == ERROR_PROC_NOT_FOUND)) { - skip("ScInitMapiUtil is not implemented\n"); + win_skip("ScInitMapiUtil is not implemented\n"); FreeLibrary(hMapi32); return; } diff --git a/rostests/winetests/mapi32/util.c b/rostests/winetests/mapi32/util.c index 2ae42f1c814..6cb77702039 100644 --- a/rostests/winetests/mapi32/util.c +++ b/rostests/winetests/mapi32/util.c @@ -51,7 +51,8 @@ static void test_SwapPword(void) shorts[1] = 0x10ff; shorts[2] = 0x2001; pSwapPword(shorts, 2); - ok(shorts[0] == 0x01ff && shorts[1] == 0xff10 && shorts[2] == 0x2001, + ok((shorts[0] == 0x01ff && shorts[1] == 0xff10 && shorts[2] == 0x2001) || + broken(shorts[0] == 0xff01 && shorts[1] == 0x10ff && shorts[2] == 0x2001) /* Win9x */, "Expected {0x01ff,0xff10,0x2001}, got {0x%04x,0x%04x,0x%04x}\n", shorts[0], shorts[1], shorts[2]); } @@ -68,7 +69,8 @@ static void test_SwapPlong(void) longs[1] = 0x1000ffff; longs[2] = 0x20000001; pSwapPlong(longs, 2); - ok(longs[0] == 0x0100ffff && longs[1] == 0xffff0010 && longs[2] == 0x20000001, + ok((longs[0] == 0x0100ffff && longs[1] == 0xffff0010 && longs[2] == 0x20000001) || + broken(longs[0] == 0xffff0001 && longs[1] == 0x1000ffff && longs[2] == 0x20000001) /* Win9x */, "Expected {0x0100ffff,0xffff0010,0x20000001}, got {0x%08x,0x%08x,0x%08x}\n", longs[0], longs[1], longs[2]); } @@ -151,7 +153,8 @@ static void test_CbOfEncoded(void) memset(buff, '\0', sizeof(buff)); memset(buff, '?', i); ulRet = pCbOfEncoded(buff); - ok(ulRet == ulExpected, "CbOfEncoded(length %d): expected %d, got %d\n", + ok(ulRet == ulExpected || broken(ulRet == 0) /* Win9x */, + "CbOfEncoded(length %d): expected %d, got %d\n", i, ulExpected, ulRet); } } @@ -177,7 +180,7 @@ START_TEST(util) if (!pScInitMapiUtil) { - skip("ScInitMapiUtil is not available\n"); + win_skip("ScInitMapiUtil is not available\n"); FreeLibrary(hMapi32); return; } @@ -186,7 +189,7 @@ START_TEST(util) ret = pScInitMapiUtil(0); if ((ret != S_OK) && (GetLastError() == ERROR_PROC_NOT_FOUND)) { - skip("ScInitMapiUtil is not implemented\n"); + win_skip("ScInitMapiUtil is not implemented\n"); FreeLibrary(hMapi32); return; } diff --git a/rostests/winetests/mlang/mlang.c b/rostests/winetests/mlang/mlang.c index 115080eb692..ae5060a7cdc 100644 --- a/rostests/winetests/mlang/mlang.c +++ b/rostests/winetests/mlang/mlang.c @@ -25,6 +25,7 @@ #include "windef.h" #include "winbase.h" #include "winerror.h" +#include "initguid.h" #include "mlang.h" #include "wine/test.h" @@ -42,21 +43,41 @@ #endif #endif /* 0 */ -#define TRACE_2 OutputDebugStringA +static BOOL (WINAPI *pGetCPInfoExA)(UINT, DWORD, LPCPINFOEXA); +static HRESULT (WINAPI *pConvertINetMultiByteToUnicode)(LPDWORD, DWORD, LPCSTR, + LPINT, LPWSTR, LPINT); +static HRESULT (WINAPI *pConvertINetUnicodeToMultiByte)(LPDWORD, DWORD, LPCWSTR, + LPINT, LPSTR, LPINT); -static CHAR string1[MAX_PATH], string2[MAX_PATH]; +static BOOL init_function_ptrs(void) +{ + HMODULE hMlang; + + hMlang = LoadLibraryA("mlang.dll"); + if (!hMlang) + { + skip("mlang not available\n"); + return FALSE; + } + + pConvertINetMultiByteToUnicode = (void *)GetProcAddress(hMlang, "ConvertINetMultiByteToUnicode"); + pConvertINetUnicodeToMultiByte = (void *)GetProcAddress(hMlang, "ConvertINetUnicodeToMultiByte"); + + pGetCPInfoExA = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetCPInfoExA"); + + return TRUE; +} #define ok_w2(format, szString1, szString2) \ \ - if (lstrcmpW(szString1, szString2) != 0) \ + if (lstrcmpW((szString1), (szString2)) != 0) \ { \ - WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ - WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ - ok(0, format, string1, string2); \ + CHAR string1[256], string2[256]; \ + WideCharToMultiByte(CP_ACP, 0, (szString1), -1, string1, 256, NULL, NULL); \ + WideCharToMultiByte(CP_ACP, 0, (szString2), -1, string2, 256, NULL, NULL); \ + ok(0, (format), string1, string2); \ } -static BOOL (WINAPI *pGetCPInfoExA)(UINT,DWORD,LPCPINFOEXA); - static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) { /* these APIs are broken regarding constness of the input buffer */ @@ -66,24 +87,12 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) WCHAR bufW[256]; UINT lenA, lenW, expected_len; HRESULT ret; - HMODULE hMlang; - FARPROC pConvertINetMultiByteToUnicode; - FARPROC pConvertINetUnicodeToMultiByte; - - hMlang = LoadLibraryA("mlang.dll"); - ok(hMlang != 0, "couldn't load mlang.dll\n"); - - pConvertINetMultiByteToUnicode = GetProcAddress(hMlang, "ConvertINetMultiByteToUnicode"); - ok(pConvertINetMultiByteToUnicode != NULL, "couldn't resolve ConvertINetMultiByteToUnicode\n"); - pConvertINetUnicodeToMultiByte = GetProcAddress(hMlang, "ConvertINetUnicodeToMultiByte"); - ok(pConvertINetUnicodeToMultiByte != NULL, "couldn't resolve ConvertINetUnicodeToMultiByte\n"); /* IMultiLanguage2_ConvertStringToUnicode tests */ memset(bufW, 'x', sizeof(bufW)); lenA = 0; lenW = sizeof(bufW)/sizeof(bufW[0]); - TRACE_2("Call IMultiLanguage2_ConvertStringToUnicode\n"); ret = IMultiLanguage2_ConvertStringToUnicode(iML2, NULL, 1252, stringA, &lenA, bufW, &lenW); ok(ret == S_OK, "IMultiLanguage2_ConvertStringToUnicode failed: %08x\n", ret); ok(lenA == 0, "expected lenA 0, got %u\n", lenA); @@ -92,7 +101,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufW, 'x', sizeof(bufW)); lenA = -1; lenW = sizeof(bufW)/sizeof(bufW[0]); - TRACE_2("Call IMultiLanguage2_ConvertStringToUnicode\n"); ret = IMultiLanguage2_ConvertStringToUnicode(iML2, NULL, 1252, stringA, &lenA, bufW, &lenW); ok(ret == S_OK, "IMultiLanguage2_ConvertStringToUnicode failed: %08x\n", ret); ok(lenA == lstrlenA(stringA), "expected lenA %u, got %u\n", lstrlenA(stringA), lenA); @@ -107,7 +115,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufW, 'x', sizeof(bufW)); lenA = -1; lenW = 5; - TRACE_2("Call IMultiLanguage2_ConvertStringToUnicode\n"); ret = IMultiLanguage2_ConvertStringToUnicode(iML2, NULL, 1252, stringA, &lenA, bufW, &lenW); ok(ret == E_FAIL, "IMultiLanguage2_ConvertStringToUnicode should fail: %08x\n", ret); ok(lenW == 0, "expected lenW 0, got %u\n", lenW); @@ -117,7 +124,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufW, 'x', sizeof(bufW)); lenA = -1; lenW = sizeof(bufW)/sizeof(bufW[0]); - TRACE_2("Call IMultiLanguage2_ConvertStringToUnicode\n"); ret = IMultiLanguage2_ConvertStringToUnicode(iML2, NULL, CP_UNICODE, stringA, &lenA, bufW, &lenW); ok(ret == S_OK, "IMultiLanguage2_ConvertStringToUnicode failed: %08x\n", ret); ok(lenA == lstrlenA(stringA), "expected lenA %u, got %u\n", lstrlenA(stringA), lenA); @@ -138,7 +144,7 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufW, 'x', sizeof(bufW)); lenA = lstrlenA(stringA); lenW = sizeof(bufW)/sizeof(bufW[0]); - ret = pConvertINetMultiByteToUnicode(NULL, 1252, stringA, &lenA, NULL, &lenW); + ret = pConvertINetMultiByteToUnicode(NULL, 1252, stringA, (INT *)&lenA, NULL, (INT *)&lenW); ok(ret == S_OK, "ConvertINetMultiByteToUnicode failed: %08x\n", ret); ok(lenA == lstrlenA(stringA), "expected lenA %u, got %u\n", lstrlenA(stringA), lenA); expected_len = MultiByteToWideChar(1252, 0, stringA, lenA, NULL, 0); @@ -147,7 +153,7 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufW, 'x', sizeof(bufW)); lenA = lstrlenA(stringA); lenW = 0; - ret = pConvertINetMultiByteToUnicode(NULL, 1252, stringA, &lenA, NULL, &lenW); + ret = pConvertINetMultiByteToUnicode(NULL, 1252, stringA, (INT *)&lenA, NULL, (INT *)&lenW); ok(ret == S_OK, "ConvertINetMultiByteToUnicode failed: %08x\n", ret); ok(lenA == lstrlenA(stringA), "expected lenA %u, got %u\n", lstrlenA(stringA), lenA); expected_len = MultiByteToWideChar(1252, 0, stringA, lenA, NULL, 0); @@ -158,7 +164,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufA, 'x', sizeof(bufA)); lenW = 0; lenA = sizeof(bufA); - TRACE_2("Call IMultiLanguage2_ConvertStringFromUnicode\n"); ret = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, stringW, &lenW, bufA, &lenA); ok(ret == S_OK, "IMultiLanguage2_ConvertStringFromUnicode failed: %08x\n", ret); ok(lenA == 0, "expected lenA 0, got %u\n", lenA); @@ -167,7 +172,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufA, 'x', sizeof(bufA)); lenW = -1; lenA = sizeof(bufA); - TRACE_2("Call IMultiLanguage2_ConvertStringFromUnicode\n"); ret = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, stringW, &lenW, bufA, &lenA); ok(ret == S_OK, "IMultiLanguage2_ConvertStringFromUnicode failed: %08x\n", ret); ok(lenA == lstrlenA(stringA), "expected lenA %u, got %u\n", lstrlenA(stringA), lenA); @@ -179,7 +183,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufA, 'x', sizeof(bufA)); lenW = -1; lenA = 5; - TRACE_2("Call IMultiLanguage2_ConvertStringFromUnicode\n"); ret = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, stringW, &lenW, bufA, &lenA); ok(ret == E_FAIL, "IMultiLanguage2_ConvertStringFromUnicode should fail: %08x\n", ret); ok(lenA == 0, "expected lenA 0, got %u\n", lenA); @@ -189,7 +192,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) memset(bufA, 'x', sizeof(bufA)); lenW = -1; lenA = sizeof(bufA); - TRACE_2("Call IMultiLanguage2_ConvertStringFromUnicode\n"); ret = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, CP_UNICODE, stringW, &lenW, bufA, &lenA); ok(ret == S_OK, "IMultiLanguage2_ConvertStringFromUnicode failed: %08x\n", ret); ok(lenA == lstrlenA(stringA) * (int)sizeof(WCHAR), "wrong lenA %u\n", lenA); @@ -207,24 +209,6 @@ static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) ok(lenW == lstrlenW(stringW), "expected lenW %u, got %u\n", lstrlenW(stringW), lenW); expected_len = WideCharToMultiByte(1252, 0, stringW, lenW, NULL, 0, NULL, NULL); ok(lenA == expected_len, "expected lenA %u, got %u\n", expected_len, lenA); - - memset(bufA, 'x', sizeof(bufA)); - lenW = lstrlenW(stringW); - lenA = sizeof(bufA); - ret = pConvertINetUnicodeToMultiByte(NULL, 1252, stringW, &lenW, NULL, &lenA); - ok(ret == S_OK, "ConvertINetUnicodeToMultiByte failed: %08x\n", ret); - ok(lenW == lstrlenW(stringW), "expected lenW %u, got %u\n", lstrlenW(stringW), lenW); - expected_len = WideCharToMultiByte(1252, 0, stringW, lenW, NULL, 0, NULL, NULL); - ok(lenA == expected_len, "expected lenA %u, got %u\n", expected_len, lenA); - - memset(bufA, 'x', sizeof(bufA)); - lenW = lstrlenW(stringW); - lenA = 0; - ret = pConvertINetUnicodeToMultiByte(NULL, 1252, stringW, &lenW, NULL, &lenA); - ok(ret == S_OK, "ConvertINetUnicodeToMultiByte failed: %08x\n", ret); - ok(lenW == lstrlenW(stringW), "expected lenW %u, got %u\n", lstrlenW(stringW), lenW); - expected_len = WideCharToMultiByte(1252, 0, stringW, lenW, NULL, 0, NULL, NULL); - ok(lenA == expected_len, "expected lenA %u, got %u\n", expected_len, lenA); } static inline void cpinfo_cmp(MIMECPINFO *cpinfo1, MIMECPINFO *cpinfo2) @@ -266,7 +250,7 @@ static const char *dump_mime_flags(DWORD flags) } #endif -static BOOL check_convertible(IMultiLanguage2 *iML2, UINT from, UINT to) +static HRESULT check_convertible(IMultiLanguage2 *iML2, UINT from, UINT to) { CHAR convert[MAX_PATH]; BYTE dest[MAX_PATH]; @@ -275,21 +259,37 @@ static BOOL check_convertible(IMultiLanguage2 *iML2, UINT from, UINT to) static WCHAR strW[] = {'a','b','c',0}; - srcsz = -1; + /* Check to see if the target codepage has these characters or not */ + if (from != CP_UTF8) + { + BOOL fDefaultChar; + char ch[10]; + int cb; + cb = WideCharToMultiByte( from, WC_NO_BEST_FIT_CHARS | WC_COMPOSITECHECK | WC_DEFAULTCHAR, + strW, 3, ch, sizeof(ch), NULL, &fDefaultChar); + + if(cb == 0 || fDefaultChar) + { + trace("target codepage %i does not contain 'abc'\n",from); + return E_FAIL; + } + } + + srcsz = lstrlenW(strW) + 1; destsz = MAX_PATH; hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, from, strW, &srcsz, convert, &destsz); if (hr != S_OK) - return FALSE; + return S_FALSE; srcsz = -1; destsz = MAX_PATH; hr = IMultiLanguage2_ConvertString(iML2, NULL, from, to, (BYTE *)convert, &srcsz, dest, &destsz); if (hr != S_OK) - return FALSE; + return S_FALSE; - return TRUE; + return S_OK; } static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) @@ -302,38 +302,35 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) UINT total; total = 0; - TRACE_2("Call IMultiLanguage2_GetNumberOfCodePageInfo\n"); ret = IMultiLanguage2_GetNumberOfCodePageInfo(iML2, &total); ok(ret == S_OK && total != 0, "IMultiLanguage2_GetNumberOfCodePageInfo: expected S_OK/!0, got %08x/%u\n", ret, total); trace("total mlang supported codepages %u\n", total); - TRACE_2("Call IMultiLanguage2_EnumCodePages\n"); ret = IMultiLanguage2_EnumCodePages(iML2, flags, LANG_NEUTRAL, &iEnumCP); - trace("IMultiLanguage2_EnumCodePages = %08x, iEnumCP = %p\n", ret, iEnumCP); ok(ret == S_OK && iEnumCP, "IMultiLanguage2_EnumCodePages: expected S_OK/!NULL, got %08x/%p\n", ret, iEnumCP); - TRACE_2("Call IEnumCodePage_Reset\n"); ret = IEnumCodePage_Reset(iEnumCP); ok(ret == S_OK, "IEnumCodePage_Reset: expected S_OK, got %08x\n", ret); n = 65536; - TRACE_2("Call IEnumCodePage_Next\n"); ret = IEnumCodePage_Next(iEnumCP, 0, NULL, &n); - ok(n == 0 && ret == S_FALSE, "IEnumCodePage_Next: expected 0/S_FALSE, got %u/%08x\n", n, ret); - TRACE_2("Call IEnumCodePage_Next\n"); + if (ret == S_FALSE) + ok(n == 0 && ret == S_FALSE, "IEnumCodePage_Next: expected 0/S_FALSE, got %u/%08x\n", n, ret); + else if (ret == E_FAIL) + ok(n == 65536 && ret == E_FAIL, "IEnumCodePage_Next: expected 65536/E_FAIL, got %u/%08x\n", n, ret); ret = IEnumCodePage_Next(iEnumCP, 0, NULL, NULL); - ok(ret == S_FALSE, "IEnumCodePage_Next: expected S_FALSE, got %08x\n", ret); + if (ret == S_FALSE) + ok(ret == S_FALSE, "IEnumCodePage_Next: expected S_FALSE, got %08x\n", ret); + else if (ret == E_FAIL) + ok(n == 65536 && ret == E_FAIL, "IEnumCodePage_Next: expected 65536/E_FAIL, got %u/%08x\n", n, ret); cpinfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*cpinfo) * total * 2); n = total * 2; - TRACE_2("Call IEnumCodePage_Next\n"); ret = IEnumCodePage_Next(iEnumCP, 0, cpinfo, &n); - trace("IEnumCodePage_Next = %08x, n = %u\n", ret, n); ok(ret == S_FALSE && n == 0, "IEnumCodePage_Next: expected S_FALSE/0, got %08x/%u\n", ret, n); n = total * 2; - TRACE_2("Call IEnumCodePage_Next\n"); ret = IEnumCodePage_Next(iEnumCP, n, cpinfo, &n); ok(ret == S_OK && n != 0, "IEnumCodePage_Next: expected S_OK/!0, got %08x/%u\n", ret, n); @@ -352,9 +349,9 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) { CHARSETINFO csi; MIMECSETINFO mcsi; - BOOL convertible; - HRESULT check = S_OK; + HRESULT convertible = S_OK; static const WCHAR autoW[] = {'_','a','u','t','o',0}; + static const WCHAR feffW[] = {'u','n','i','c','o','d','e','F','E','F','F',0}; #ifdef DUMP_CP_INFO trace("MIMECPINFO #%u:\n" @@ -382,13 +379,14 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) #endif ok(cpinfo[i].dwFlags & flags, "enumerated flags %08x do not include requested %08x\n", cpinfo[i].dwFlags, flags); - if (TranslateCharsetInfo((DWORD *)cpinfo[i].uiFamilyCodePage, &csi, TCI_SRCCODEPAGE)) + if (TranslateCharsetInfo((DWORD *)(INT_PTR)cpinfo[i].uiFamilyCodePage, &csi, TCI_SRCCODEPAGE)) ok(cpinfo[i].bGDICharset == csi.ciCharset, "%d != %d\n", cpinfo[i].bGDICharset, csi.ciCharset); else trace("TranslateCharsetInfo failed for cp %u\n", cpinfo[i].uiFamilyCodePage); +#ifdef DUMP_CP_INFO trace("%u: codepage %u family %u\n", i, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); - +#endif /* Win95 does not support UTF-7 */ if (cpinfo[i].uiCodePage == CP_UTF7) continue; @@ -397,104 +395,115 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) */ if (IsValidCodePage(cpinfo[i].uiCodePage)) { - TRACE_2("Call IMultiLanguage2_IsConvertible\n"); ret = IMultiLanguage2_IsConvertible(iML2, cpinfo[i].uiCodePage, CP_UNICODE); ok(ret == S_OK, "IMultiLanguage2_IsConvertible(%u -> CP_UNICODE) = %08x\n", cpinfo[i].uiCodePage, ret); - TRACE_2("Call IMultiLanguage2_IsConvertible\n"); ret = IMultiLanguage2_IsConvertible(iML2, CP_UNICODE, cpinfo[i].uiCodePage); ok(ret == S_OK, "IMultiLanguage2_IsConvertible(CP_UNICODE -> %u) = %08x\n", cpinfo[i].uiCodePage, ret); convertible = check_convertible(iML2, cpinfo[i].uiCodePage, CP_UTF8); - if (!convertible) - check = S_FALSE; - - TRACE_2("Call IMultiLanguage2_IsConvertible\n"); - ret = IMultiLanguage2_IsConvertible(iML2, cpinfo[i].uiCodePage, CP_UTF8); - ok(ret == check, "IMultiLanguage2_IsConvertible(%u -> CP_UTF8) = %08x\n", cpinfo[i].uiCodePage, ret); - TRACE_2("Call IMultiLanguage2_IsConvertible\n"); - ret = IMultiLanguage2_IsConvertible(iML2, CP_UTF8, cpinfo[i].uiCodePage); - ok(ret == check, "IMultiLanguage2_IsConvertible(CP_UTF8 -> %u) = %08x\n", cpinfo[i].uiCodePage, ret); + if (convertible != E_FAIL) + { + ret = IMultiLanguage2_IsConvertible(iML2, cpinfo[i].uiCodePage, CP_UTF8); + ok(ret == convertible, "IMultiLanguage2_IsConvertible(%u -> CP_UTF8) = %08x\n", cpinfo[i].uiCodePage, ret); + ret = IMultiLanguage2_IsConvertible(iML2, CP_UTF8, cpinfo[i].uiCodePage); + ok(ret == convertible, "IMultiLanguage2_IsConvertible(CP_UTF8 -> %u) = %08x\n", cpinfo[i].uiCodePage, ret); + } } else trace("IsValidCodePage failed for cp %u\n", cpinfo[i].uiCodePage); - ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszWebCharset, &mcsi); - /* _autoxxx charsets are a fake and GetCharsetInfo fails for them */ - if (memcmp(cpinfo[i].wszWebCharset, autoW, 5 * sizeof(WCHAR))) - { - ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08x\n", ret); + if (memcmp(cpinfo[i].wszWebCharset,feffW,sizeof(WCHAR)*11)==0) + skip("Legacy windows bug returning invalid charset of unicodeFEFF\n"); + else + { + ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszWebCharset, &mcsi); + /* _autoxxx charsets are a fake and GetCharsetInfo fails for them */ + if (memcmp(cpinfo[i].wszWebCharset, autoW, 5 * sizeof(WCHAR))) + { + ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08x\n", ret); #ifdef DUMP_CP_INFO - trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszWebCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset)); + trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszWebCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset)); #endif - ok(!lstrcmpiW(cpinfo[i].wszWebCharset, mcsi.wszCharset), + ok(!lstrcmpiW(cpinfo[i].wszWebCharset, mcsi.wszCharset), #ifdef DUMP_CP_INFO - "%s != %s\n", - wine_dbgstr_w(cpinfo[i].wszWebCharset), wine_dbgstr_w(mcsi.wszCharset)); + "%s != %s\n", + wine_dbgstr_w(cpinfo[i].wszWebCharset), wine_dbgstr_w(mcsi.wszCharset)); #else - "wszWebCharset mismatch\n"); + "wszWebCharset mismatch\n"); #endif - if (0) - { - /* native mlang returns completely messed up encodings in some cases */ - ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage, - "%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); - ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage, - "%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + if (0) + { + /* native mlang returns completely messed up encodings in some cases */ + ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage, + "%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage, + "%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + } } - } + } - ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszHeaderCharset, &mcsi); - /* _autoxxx charsets are a fake and GetCharsetInfo fails for them */ - if (memcmp(cpinfo[i].wszHeaderCharset, autoW, 5 * sizeof(WCHAR))) - { - ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08x\n", ret); + if (memcmp(cpinfo[i].wszHeaderCharset,feffW,sizeof(WCHAR)*11)==0) + skip("Legacy windows bug returning invalid charset of unicodeFEFF\n"); + else + { + ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszHeaderCharset, &mcsi); + /* _autoxxx charsets are a fake and GetCharsetInfo fails for them */ + if (memcmp(cpinfo[i].wszHeaderCharset, autoW, 5 * sizeof(WCHAR))) + { + ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08x\n", ret); #ifdef DUMP_CP_INFO - trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszHeaderCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset)); + trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszHeaderCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset)); #endif - ok(!lstrcmpiW(cpinfo[i].wszHeaderCharset, mcsi.wszCharset), + ok(!lstrcmpiW(cpinfo[i].wszHeaderCharset, mcsi.wszCharset), #ifdef DUMP_CP_INFO - "%s != %s\n", - wine_dbgstr_w(cpinfo[i].wszHeaderCharset), wine_dbgstr_w(mcsi.wszCharset)); + "%s != %s\n", + wine_dbgstr_w(cpinfo[i].wszHeaderCharset), wine_dbgstr_w(mcsi.wszCharset)); #else - "wszHeaderCharset mismatch\n"); + "wszHeaderCharset mismatch\n"); #endif - if (0) - { - /* native mlang returns completely messed up encodings in some cases */ - ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage, - "%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); - ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage, - "%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); - } - } + if (0) + { + /* native mlang returns completely messed up encodings in some cases */ + ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage, + "%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage, + "%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + } + } + } - ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszBodyCharset, &mcsi); - /* _autoxxx charsets are a fake and GetCharsetInfo fails for them */ - if (memcmp(cpinfo[i].wszBodyCharset, autoW, 5 * sizeof(WCHAR))) - { - ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08x\n", ret); + if (memcmp(cpinfo[i].wszBodyCharset,feffW,sizeof(WCHAR)*11)==0) + skip("Legacy windows bug returning invalid charset of unicodeFEFF\n"); + else + { + ret = IMultiLanguage2_GetCharsetInfo(iML2, cpinfo[i].wszBodyCharset, &mcsi); + /* _autoxxx charsets are a fake and GetCharsetInfo fails for them */ + if (memcmp(cpinfo[i].wszBodyCharset, autoW, 5 * sizeof(WCHAR))) + { + ok (ret == S_OK, "IMultiLanguage2_GetCharsetInfo failed: %08x\n", ret); #ifdef DUMP_CP_INFO - trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszBodyCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset)); + trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszBodyCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset)); #endif - ok(!lstrcmpiW(cpinfo[i].wszBodyCharset, mcsi.wszCharset), + ok(!lstrcmpiW(cpinfo[i].wszBodyCharset, mcsi.wszCharset), #ifdef DUMP_CP_INFO - "%s != %s\n", - wine_dbgstr_w(cpinfo[i].wszBodyCharset), wine_dbgstr_w(mcsi.wszCharset)); + "%s != %s\n", + wine_dbgstr_w(cpinfo[i].wszBodyCharset), wine_dbgstr_w(mcsi.wszCharset)); #else - "wszBodyCharset mismatch\n"); + "wszBodyCharset mismatch\n"); #endif - if (0) - { - /* native mlang returns completely messed up encodings in some cases */ - ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage, - "%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); - ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage, - "%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); - } - } + if (0) + { + /* native mlang returns completely messed up encodings in some cases */ + ok(mcsi.uiInternetEncoding == cpinfo[i].uiCodePage || mcsi.uiInternetEncoding == cpinfo[i].uiFamilyCodePage, + "%u != %u || %u\n", mcsi.uiInternetEncoding, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + ok(mcsi.uiCodePage == cpinfo[i].uiCodePage || mcsi.uiCodePage == cpinfo[i].uiFamilyCodePage, + "%u != %u || %u\n", mcsi.uiCodePage, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); + } + } + } } /* now IEnumCodePage_Next should fail, since pointer is at the end */ @@ -548,37 +557,29 @@ static void test_EnumScripts(IMultiLanguage2 *iML2, DWORD flags) UINT total; total = 0; - TRACE_2("Call IMultiLanguage2_GetNumberOfScripts\n"); ret = IMultiLanguage2_GetNumberOfScripts(iML2, &total); ok(ret == S_OK && total != 0, "IMultiLanguage2_GetNumberOfScripts: expected S_OK/!0, got %08x/%u\n", ret, total); trace("total mlang supported scripts %u\n", total); - TRACE_2("Call IMultiLanguage2_EnumScripts\n"); ret = IMultiLanguage2_EnumScripts(iML2, flags, LANG_NEUTRAL, &iEnumScript); - trace("IMultiLanguage2_EnumScripts = %08x, iEnumScript = %p\n", ret, iEnumScript); ok(ret == S_OK && iEnumScript, "IMultiLanguage2_EnumScripts: expected S_OK/!NULL, got %08x/%p\n", ret, iEnumScript); - TRACE_2("Call IEnumScript_Reset\n"); ret = IEnumScript_Reset(iEnumScript); ok(ret == S_OK, "IEnumScript_Reset: expected S_OK, got %08x\n", ret); n = 65536; - TRACE_2("Call IEnumScript_Next\n"); ret = IEnumScript_Next(iEnumScript, 0, NULL, &n); ok(n == 65536 && ret == E_FAIL, "IEnumScript_Next: expected 65536/E_FAIL, got %u/%08x\n", n, ret); - TRACE_2("Call IEnumScript_Next\n"); ret = IEnumScript_Next(iEnumScript, 0, NULL, NULL); ok(ret == E_FAIL, "IEnumScript_Next: expected E_FAIL, got %08x\n", ret); sinfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*sinfo) * total * 2); n = total * 2; - TRACE_2("Call IEnumScript_Next\n"); ret = IEnumScript_Next(iEnumScript, 0, sinfo, &n); ok(ret == S_FALSE && n == 0, "IEnumScript_Next: expected S_FALSE/0, got %08x/%u\n", ret, n); n = total * 2; - TRACE_2("Call IEnumScript_Next\n"); ret = IEnumScript_Next(iEnumScript, n, sinfo, &n); ok(ret == S_OK && n != 0, "IEnumScript_Next: expected S_OK, got %08x/%u\n", ret, n); @@ -607,8 +608,8 @@ static void test_EnumScripts(IMultiLanguage2 *iML2, DWORD flags) wine_dbgstr_w(sinfo[i].wszDescription), wine_dbgstr_w(sinfo[i].wszFixedWidthFont), wine_dbgstr_w(sinfo[i].wszProportionalFont)); -#endif trace("%u codepage %u\n", i, sinfo[i].uiCodePage); +#endif } /* now IEnumScript_Next should fail, since pointer is at the end */ @@ -645,41 +646,72 @@ static void test_EnumScripts(IMultiLanguage2 *iML2, DWORD flags) static void IMLangFontLink_Test(IMLangFontLink* iMLFL) { - DWORD dwCodePages = 0; - DWORD dwManyCodePages = 0; - UINT CodePage = 0; + DWORD dwCodePages, dwManyCodePages; + DWORD dwCmpCodePages; + UINT CodePage; + HRESULT ret; - ok(IMLangFontLink_CodePageToCodePages(iMLFL, 932, &dwCodePages)==S_OK, - "IMLangFontLink_CodePageToCodePages failed\n"); - ok (dwCodePages != 0, "No CodePages returned\n"); - ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwCodePages, 1035, - &CodePage)==S_OK, - "IMLangFontLink_CodePagesToCodePage failed\n"); + dwCodePages = ~0u; + ret = IMLangFontLink_CodePageToCodePages(iMLFL, -1, &dwCodePages); + ok(ret == E_FAIL, "IMLangFontLink_CodePageToCodePages should fail: %x\n", ret); + ok(dwCodePages == 0, "expected 0, got %u\n", dwCodePages); + + dwCodePages = 0; + ret = IMLangFontLink_CodePageToCodePages(iMLFL, 932, &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_CodePageToCodePages error %x\n", ret); + ok(dwCodePages == FS_JISJAPAN, "expected FS_JISJAPAN, got %08x\n", dwCodePages); + CodePage = 0; + ret = IMLangFontLink_CodePagesToCodePage(iMLFL, dwCodePages, 1035, &CodePage); + ok(ret == S_OK, "IMLangFontLink_CodePagesToCodePage error %x\n", ret); ok(CodePage == 932, "Incorrect CodePage Returned (%i)\n",CodePage); - ok(IMLangFontLink_CodePageToCodePages(iMLFL, 1252, &dwCodePages)==S_OK, - "IMLangFontLink_CodePageToCodePages failed\n"); - dwManyCodePages = dwManyCodePages | dwCodePages; - ok(IMLangFontLink_CodePageToCodePages(iMLFL, 1256, &dwCodePages)==S_OK, - "IMLangFontLink_CodePageToCodePages failed\n"); - dwManyCodePages = dwManyCodePages | dwCodePages; - ok(IMLangFontLink_CodePageToCodePages(iMLFL, 874, &dwCodePages)==S_OK, - "IMLangFontLink_CodePageToCodePages failed\n"); - dwManyCodePages = dwManyCodePages | dwCodePages; + dwManyCodePages = 0; + ret = IMLangFontLink_CodePageToCodePages(iMLFL, 1252, &dwManyCodePages); + ok(ret == S_OK, "IMLangFontLink_CodePageToCodePages error %x\n", ret); + ok(dwManyCodePages == FS_LATIN1, "expected FS_LATIN1, got %08x\n", dwManyCodePages); + dwCodePages = 0; + ret = IMLangFontLink_CodePageToCodePages(iMLFL, 1256, &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_CodePageToCodePages error %x\n", ret); + ok(dwCodePages == FS_ARABIC, "expected FS_ARABIC, got %08x\n", dwCodePages); + dwManyCodePages |= dwCodePages; + ret = IMLangFontLink_CodePageToCodePages(iMLFL, 874, &dwCodePages); + ok(ret == S_OK, "IMLangFontLink_CodePageToCodePages error %x\n", ret); + ok(dwCodePages == FS_THAI, "expected FS_THAI, got %08x\n", dwCodePages); + dwManyCodePages |= dwCodePages; - ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 1256, - &CodePage)==S_OK, - "IMLangFontLink_CodePagesToCodePage failed\n"); + ret = IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 1256, &CodePage); + ok(ret == S_OK, "IMLangFontLink_CodePagesToCodePage error %x\n", ret); ok(CodePage == 1256, "Incorrect CodePage Returned (%i)\n",CodePage); - ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 936, - &CodePage)==S_OK, - "IMLangFontLink_CodePagesToCodePage failed\n"); + ret = IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 936, &CodePage); + ok(ret == S_OK, "IMLangFontLink_CodePagesToCodePage error %x\n", ret); ok(CodePage == 1252, "Incorrect CodePage Returned (%i)\n",CodePage); + + /* Tests for GetCharCodePages */ + + /* Latin 1 */ + dwCmpCodePages = FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC | FS_GREEK | FS_TURKISH + | FS_HEBREW | FS_ARABIC | FS_BALTIC | FS_VIETNAMESE | FS_THAI + | FS_JISJAPAN | FS_CHINESESIMP | FS_WANSUNG | FS_CHINESETRAD; + ok(IMLangFontLink_GetCharCodePages(iMLFL, 'd', &dwCodePages) == S_OK, + "IMLangFontLink_GetCharCodePages failed\n"); + ok(dwCodePages == dwCmpCodePages, "Incorrect CodePages returned (%i)\n", dwCodePages); + + /* Cyrillic */ + dwCmpCodePages = FS_CYRILLIC | FS_JISJAPAN | FS_CHINESESIMP | FS_WANSUNG; + ok(IMLangFontLink_GetCharCodePages(iMLFL, 0x0436, &dwCodePages) == S_OK, + "IMLangFontLink_GetCharCodePages failed\n"); + ok(dwCodePages == dwCmpCodePages, "Incorrect CodePages returned (%i)\n", dwCodePages); + + /* Japanese */ + dwCmpCodePages = FS_JISJAPAN; + ok(IMLangFontLink_GetCharCodePages(iMLFL, 0xff90, &dwCodePages) == S_OK, + "IMLangFontLink_GetCharCodePages failed\n"); + ok(dwCodePages == dwCmpCodePages, "Incorrect CodePages returned (%i)\n", dwCodePages); } /* copied from libs/wine/string.c */ -WCHAR *strstrW(const WCHAR *str, const WCHAR *sub) +static WCHAR *strstrW(const WCHAR *str, const WCHAR *sub) { while (*str) { @@ -762,10 +794,28 @@ static void test_GetLcidFromRfc1766(IMultiLanguage2 *iML2) ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret); ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, en_them); - ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret); + ok((ret == E_FAIL || ret == S_FALSE), "GetLcidFromRfc1766 returned: %08x\n", ret); + if (ret == S_FALSE) + { + BSTR rfcstr; + static WCHAR en[] = {'e','n',0}; + + ret = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid, &rfcstr); + ok(ret == S_OK, "Expected S_OK, got %08x\n", ret); + ok_w2("Expected \"%s\", got \"%s\"n", en, rfcstr); + } ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, english); - ok(ret == E_FAIL, "GetLcidFromRfc1766 returned: %08x\n", ret); + ok((ret == E_FAIL || ret == S_FALSE), "GetLcidFromRfc1766 returned: %08x\n", ret); + if (ret == S_FALSE) + { + BSTR rfcstr; + static WCHAR en[] = {'e','n',0}; + + ret = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid, &rfcstr); + ok(ret == S_OK, "Expected S_OK, got %08x\n", ret); + ok_w2("Expected \"%s\", got \"%s\"n", en, rfcstr); + } lcid = 0; @@ -791,29 +841,585 @@ static void test_GetRfc1766FromLcid(IMultiLanguage2 *iML2) static WCHAR kok[] = {'k','o','k',0}; hr = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, kok); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + /* + * S_FALSE happens when 'kok' instead matches to a different Rfc1766 name + * for example 'ko' so it is not a failure but does not give us what + * we are looking for + */ + if (hr != S_FALSE) + { + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - hr = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid, &rfcstr); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok_w2("Expected \"%s\", got \"%s\"n", kok, rfcstr); + hr = IMultiLanguage2_GetRfc1766FromLcid(iML2, lcid, &rfcstr); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_w2("Expected \"%s\", got \"%s\"n", kok, rfcstr); + SysFreeString(rfcstr); + } +} - SysFreeString(rfcstr); +static void test_IMultiLanguage2_ConvertStringFromUnicode(IMultiLanguage2 *iML2) +{ + CHAR dest[MAX_PATH]; + CHAR invariate[MAX_PATH]; + UINT srcsz, destsz; + HRESULT hr; + + static WCHAR src[] = {'a','b','c',0}; + + memset(invariate, 'x', sizeof(invariate)); + + /* pSrcStr NULL */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, NULL, + &srcsz, dest, &destsz); + ok(hr == S_OK || hr == E_FAIL,"expected S_OK or E_FAIL, got %08x\n",hr); + if (hr == S_OK) + { + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + } + else if (hr == E_FAIL) + { + ok(srcsz == 0, + "Expected %u, got %u\n", 0, srcsz); + } + + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", destsz); + + /* pcSrcSize NULL */ + memset(dest, 'x', sizeof(dest)); + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + NULL, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!strncmp(dest, "abc", 3), + "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), destsz); + + /* both pSrcStr and pcSrcSize NULL */ + memset(dest, 'x', sizeof(dest)); + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, NULL, + NULL, dest, &destsz); + ok(hr == S_OK || hr == E_FAIL, "Expected S_OK or E_FAIL, got %08x\n", hr); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", destsz); + + /* pDstStr NULL */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, NULL, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + + /* pcDstSize NULL */ + memset(dest, 'x', sizeof(dest)); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + + /* pcSrcSize is 0 */ + memset(dest, 'x', sizeof(dest)); + srcsz = 0; + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == 0, "Expected 0, got %u\n", srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", destsz); + + /* pcSrcSize does not include NULL terminator */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src); + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), srcsz); + ok(!strncmp(dest, "abc", 3), "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), destsz); + + /* pcSrcSize includes NULL terminator */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, "Expected 3, got %u\n", srcsz); + ok(!lstrcmpA(dest, "abc"), "Expected \"abc\", got \"%s\"\n", dest); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, destsz); + + /* pcSrcSize is -1 */ + memset(dest, 'x', sizeof(dest)); + srcsz = -1; + destsz = sizeof(dest); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), srcsz); + ok(!strncmp(dest, "abc", 3), "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), destsz); + + /* pcDstSize is 0 */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = 0; + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, destsz); + + /* pcDstSize is not large enough */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = lstrlenW(src); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == E_FAIL, "Expected E_FAIL, got %08x\n", hr); + ok(srcsz == 0, "Expected 0, got %u\n", srcsz); + ok(!strncmp(dest, "abc", 3), "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", srcsz); + + /* pcDstSize (bytes) does not leave room for NULL terminator */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = lstrlenW(src) * sizeof(WCHAR); + hr = IMultiLanguage2_ConvertStringFromUnicode(iML2, NULL, 1252, src, + &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(!lstrcmpA(dest, "abc"), "Expected \"abc\", got \"%s\"\n", dest); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, destsz); +} + +static void test_ConvertINetUnicodeToMultiByte(void) +{ + CHAR dest[MAX_PATH]; + CHAR invariate[MAX_PATH]; + INT srcsz, destsz; + HRESULT hr; + + static WCHAR src[] = {'a','b','c',0}; + + memset(invariate, 'x', sizeof(invariate)); + + /* lpSrcStr NULL */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, NULL, &srcsz, dest, &destsz); + ok(hr == S_OK || hr == E_FAIL, "Expected S_OK or E_FAIL, got %08x\n", hr); + if (hr == S_OK) + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + else if (hr == E_FAIL) + ok(srcsz == 0, + "Expected %u, got %u\n", 0, srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", destsz); + + /* lpnWideCharCount NULL */ + memset(dest, 'x', sizeof(dest)); + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, NULL, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!strncmp(dest, "abc", 3), + "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), destsz); + + /* both lpSrcStr and lpnWideCharCount NULL */ + memset(dest, 'x', sizeof(dest)); + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, NULL, NULL, dest, &destsz); + ok(hr == S_OK || hr == E_FAIL, "Expected S_OK or E_FAIL, got %08x\n", hr); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", destsz); + + /* lpDstStr NULL */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, NULL, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + + /* lpnMultiCharCount NULL */ + memset(dest, 'x', sizeof(dest)); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + + /* lpnWideCharCount is 0 */ + memset(dest, 'x', sizeof(dest)); + srcsz = 0; + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == 0, "Expected 0, got %u\n", srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", destsz); + + /* lpnWideCharCount does not include NULL terminator */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src); + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), srcsz); + ok(!strncmp(dest, "abc", 3), "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), destsz); + + /* lpnWideCharCount includes NULL terminator */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, "Expected 3, got %u\n", srcsz); + ok(!lstrcmpA(dest, "abc"), "Expected \"abc\", got \"%s\"\n", dest); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, destsz); + + /* lpnWideCharCount is -1 */ + memset(dest, 'x', sizeof(dest)); + srcsz = -1; + destsz = sizeof(dest); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), srcsz); + ok(!strncmp(dest, "abc", 3), "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src), + "Expected %u, got %u\n", lstrlenW(src), destsz); + + /* lpnMultiCharCount is 0 */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = 0; + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(!memcmp(dest, invariate, sizeof(dest)), + "Expected dest to be unchanged, got %s\n", dest); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, destsz); + + /* lpnMultiCharCount is not large enough */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = lstrlenW(src); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == E_FAIL, "Expected E_FAIL, got %08x\n", hr); + ok(srcsz == 0, "Expected 0, got %u\n", srcsz); + ok(!strncmp(dest, "abc", 3), "Expected first three chars to be \"abc\"\n"); + ok(!memcmp(&dest[3], invariate, sizeof(dest) - 3), + "Expected rest of dest to be unchanged, got %s\n", dest); + ok(destsz == 0, "Expected 0, got %u\n", srcsz); + + /* lpnMultiCharCount (bytes) does not leave room for NULL terminator */ + memset(dest, 'x', sizeof(dest)); + srcsz = lstrlenW(src) + 1; + destsz = lstrlenW(src) * sizeof(WCHAR); + hr = pConvertINetUnicodeToMultiByte(NULL, 1252, src, &srcsz, dest, &destsz); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(srcsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, srcsz); + ok(!lstrcmpA(dest, "abc"), "Expected \"abc\", got \"%s\"\n", dest); + ok(destsz == lstrlenW(src) + 1, + "Expected %u, got %u\n", lstrlenW(src) + 1, destsz); +} + +static void test_JapaneseConversion(void) +{ + /* Data */ + static WCHAR unc_jp[9][12] = { + {9,0x31,0x20,0x3042,0x3044,0x3046,0x3048,0x304a,0x000d,0x000a}, + {9,0x31,0x20,0x30a2,0x30a4,0x30a6,0x30a8,0x30aa,0x000d,0x000a}, + {9,0x31,0x20,0xff71,0xff72,0xff73,0xff74,0xff75,0x000d,0x000a}, + {9,0x31,0x20,0x3041,0x3043,0x3045,0x3047,0x3049,0x000d,0x000a}, + {9,0x31,0x20,0x30a1,0x30a3,0x30a5,0x30a7,0x30a9,0x000d,0x000a}, + {9,0x31,0x20,0xff67,0xff68,0xff69,0xff6a,0xff6b,0x000d,0x000a}, + {9,0x31,0x20,0x300c,0x65e5,0x672c,0x8a9e,0x300d,0x000d,0x000a}, + {7,0x31,0x20,0x25c7,0x25c7,0x3012,0x000d,0x000a}, + {11,0x31,0x20,0x203b,0x3010,0x0074,0x0065,0x0073,0x0074,0x3011,0x000d,0x000a} + }; + static CHAR jis_jp[9][27] = { + {20,0x31,0x20,0x1b,0x24,0x42,0x24,0x22,0x24,0x24,0x24,0x26,0x24,0x28, + 0x24,0x2a,0x1b,0x28,0x42,0x0d,0x0a}, + {20,0x31,0x20,0x1b,0x24,0x42,0x25,0x22,0x25,0x24,0x25,0x26,0x25,0x28, + 0x25,0x2a,0x1b,0x28,0x42,0x0d,0x0a}, + {20,0x31,0x20,0x1b,0x24,0x42,0x25,0x22,0x25,0x24,0x25,0x26,0x25,0x28, + 0x25,0x2a,0x1b,0x28,0x42,0x0d,0x0a}, + {20,0x31,0x20,0x1b,0x24,0x42,0x24,0x21,0x24,0x23,0x24,0x25,0x24,0x27, + 0x24,0x29,0x1b,0x28,0x42,0x0d,0x0a}, + {20,0x31,0x20,0x1b,0x24,0x42,0x25,0x21,0x25,0x23,0x25,0x25,0x25,0x27, + 0x25,0x29,0x1b,0x28,0x42,0x0d,0x0a}, + {20,0x31,0x20,0x1b,0x24,0x42,0x25,0x21,0x25,0x23,0x25,0x25,0x25,0x27, + 0x25,0x29,0x1b,0x28,0x42,0x0d,0x0a}, + {20,0x31,0x20,0x1b,0x24,0x42,0x21,0x56,0x46,0x7c,0x4b,0x5c,0x38,0x6c, + 0x21,0x57,0x1b,0x28,0x42,0x0d,0x0a}, + {16,0x31,0x20,0x1b,0x24,0x42,0x21,0x7e,0x21,0x7e,0x22,0x29,0x1b,0x28, + 0x42,0x0d,0x0a}, + {26,0x31,0x20,0x1b,0x24,0x42,0x22,0x28,0x21,0x5a,0x1b,0x28,0x42,0x74, + 0x65,0x73,0x74,0x1b,0x24,0x42,0x21,0x5b,0x1b,0x28,0x42,0x0d,0x0a} + }; + static CHAR sjis_jp[9][15] = { + {14,0x31,0x20,0x82,0xa0,0x82,0xa2,0x82,0xa4,0x82,0xa6,0x82,0xa8,0x0d,0x0a}, + {14,0x31,0x20,0x83,0x41,0x83,0x43,0x83,0x45,0x83,0x47,0x83,0x49,0x0d,0x0a}, + {9,0x31,0x20,0xb1,0xb2,0xb3,0xb4,0xb5,0x0d,0x0a}, + {14,0x31,0x20,0x82,0x9f,0x82,0xa1,0x82,0xa3,0x82,0xa5,0x82,0xa7,0x0d,0x0a}, + {14,0x31,0x20,0x83,0x40,0x83,0x42,0x83,0x44,0x83,0x46,0x83,0x48,0x0d,0x0a}, + {9,0x31,0x20,0xa7,0xa8,0xa9,0xaa,0xab,0x0d,0x0a}, + {14,0x31,0x20,0x81,0x75,0x93,0xfa,0x96,0x7b,0x8c,0xea,0x81,0x76,0x0d,0x0a}, + {10,0x31,0x20,0x81,0x9e,0x81,0x9e,0x81,0xa7,0x0d,0x0a}, + {14,0x31,0x20,0x81,0xa6,0x81,0x79,0x74,0x65,0x73,0x74,0x81,0x7a,0x0d,0x0a} + }; + static CHAR euc_jp[9][15] = { + {14,0x31,0x20,0xa4,0xa2,0xa4,0xa4,0xa4,0xa6,0xa4,0xa8,0xa4,0xaa,0x0d,0x0a}, + {14,0x31,0x20,0xa5,0xa2,0xa5,0xa4,0xa5,0xa6,0xa5,0xa8,0xa5,0xaa,0x0d,0x0a}, + {14,0x31,0x20,0x8e,0xb1,0x8e,0xb2,0x8e,0xb3,0x8e,0xb4,0x8e,0xb5,0x0d,0x0a}, + {14,0x31,0x20,0xa4,0xa1,0xa4,0xa3,0xa4,0xa5,0xa4,0xa7,0xa4,0xa9,0x0d,0x0a}, + {14,0x31,0x20,0xa5,0xa1,0xa5,0xa3,0xa5,0xa5,0xa5,0xa7,0xa5,0xa9,0x0d,0x0a}, + {14,0x31,0x20,0x8e,0xa7,0x8e,0xa8,0x8e,0xa9,0x8e,0xaa,0x8e,0xab,0x0d,0x0a}, + {14,0x31,0x20,0xa1,0xd6,0xc6,0xfc,0xcb,0xdc,0xb8,0xec,0xa1,0xd7,0x0d,0x0a}, + {10,0x31,0x20,0xa1,0xfe,0xa1,0xfe,0xa2,0xa9,0x0d,0x0a}, + {14,0x31,0x20,0xa2,0xa8,0xa1,0xda,0x74,0x65,0x73,0x74,0xa1,0xdb,0x0d,0x0a} + }; + + INT srcsz, destsz; + INT i; + HRESULT hr; + CHAR output[30]; + WCHAR outputW[30]; + int outlen; + + /* test unc->jis */ + for (i = 0; i < 9; i++) + { + int j; + destsz = 30; + outlen = jis_jp[i][0]; + srcsz = unc_jp[i][0]; + hr = pConvertINetUnicodeToMultiByte(NULL, 50220, &unc_jp[i][1], &srcsz, output, &destsz); + if (hr == S_FALSE) + { + skip("Code page identifier 50220 is not supported\n"); + break; + } + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n", i, hr); + ok(destsz == outlen, "(%i) Expected %i, got %i\n",i,outlen,destsz); + ok(srcsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],srcsz); + ok(memcmp(output,&jis_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); + + /* and back */ + srcsz = outlen; + destsz = 30; + hr = pConvertINetMultiByteToUnicode(NULL, 50220, output, &srcsz, outputW,&destsz); + + /* + * JIS does not have hankata so it get automatically converted to + * zenkata. this means that strings 1 and 2 are identical as well as + * strings 4 and 5. + */ + j = i; + if (i == 2) j = 1; + if (i == 5) j = 4; + + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n",i, hr); + ok(destsz == unc_jp[j][0],"(%i) Expected %i, got %i\n",i,unc_jp[j][0],destsz); + ok(srcsz == outlen,"(%i) Expected %i, got %i\n",i,outlen,srcsz); + ok(memcmp(outputW,&unc_jp[j][1],destsz)==0,"(%i) Strings do not match\n",i); + } + + /* test unc->sjis */ + for (i = 0; i < 9; i++) + { + destsz = 30; + outlen = sjis_jp[i][0]; + srcsz = unc_jp[i][0]; + + hr = pConvertINetUnicodeToMultiByte(NULL, 932, &unc_jp[i][1], &srcsz, output, &destsz); + if (hr == S_FALSE) + { + skip("Code page identifier 932 is not supported\n"); + break; + } + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n",i,hr); + ok(destsz == outlen,"(%i) Expected %i, got %i\n",i,outlen,destsz); + ok(srcsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],srcsz); + ok(memcmp(output,&sjis_jp[i][1],outlen)==0,"(%i) Strings do not match\n",i); + + srcsz = outlen; + destsz = 30; + hr = pConvertINetMultiByteToUnicode(NULL, 932, output, &srcsz, outputW,&destsz); + + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n", i, hr); + ok(destsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); + ok(srcsz == outlen,"(%i) Expected %i, got %i\n",i,outlen,srcsz); + ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); + } + + /* test unc->euc */ + for (i = 0; i < 9; i++) + { + destsz = 30; + outlen = euc_jp[i][0]; + srcsz = unc_jp[i][0]; + + hr = pConvertINetUnicodeToMultiByte(NULL, 51932, &unc_jp[i][1], &srcsz, output, &destsz); + if (hr == S_FALSE) + { + skip("Code page identifier 51932 is not supported\n"); + break; + } + ok(hr == S_OK, "(%i) Expected S_OK, got %08x\n",i,hr); + ok(destsz == outlen, "(%i) Expected %i, got %i\n",i,outlen,destsz); + ok(srcsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); + ok(memcmp(output,&euc_jp[i][1],outlen)==0,"(%i) Strings do not match\n",i); + + srcsz = outlen; + destsz = 30; + hr = pConvertINetMultiByteToUnicode(NULL, 51932, output, &srcsz, outputW,&destsz); + + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n",i,hr); + ok(destsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); + ok(srcsz == outlen,"(%i) Expected %i, got %i\n",i,outlen,srcsz); + ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); + } + + /* Japanese autodetect */ + i = 0; + destsz = 30; + srcsz = jis_jp[i][0]; + hr = pConvertINetMultiByteToUnicode(NULL, 50932, &jis_jp[i][1], &srcsz, outputW, &destsz); + if (hr == S_FALSE) + { + skip("Code page identifier 50932 is not supported\n"); + return; + } + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n",i,hr); + ok(destsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); + ok(srcsz == jis_jp[i][0],"(%i) Expected %i, got %i\n",i,jis_jp[i][0],srcsz); + ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); + + i = 1; + destsz = 30; + srcsz = sjis_jp[i][0]; + hr = pConvertINetMultiByteToUnicode(NULL, 50932, &sjis_jp[i][1], &srcsz, outputW, &destsz); + ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n",i,hr); + ok(destsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); + ok(srcsz == sjis_jp[i][0],"(%i) Expected %i, got %i\n",i,sjis_jp[i][0],srcsz); + ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); +} + +static void test_GetScriptFontInfo(IMLangFontLink2 *font_link) +{ + HRESULT hr; + UINT nfonts; + SCRIPTFONTINFO sfi[1]; + + nfonts = 0; + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, 0, &nfonts, NULL); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts, "unexpected result\n"); + + nfonts = 0; + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_FIXED_FONT, &nfonts, NULL); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts, "unexpected result\n"); + + nfonts = 0; + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_PROPORTIONAL_FONT, &nfonts, NULL); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts, "unexpected result\n"); + + nfonts = 1; + memset(sfi, 0, sizeof(sfi)); + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_FIXED_FONT, &nfonts, sfi); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts == 1, "got %u, expected 1\n", nfonts); + ok(sfi[0].scripts, "unexpected result\n"); + ok(sfi[0].wszFont[0], "unexpected result\n"); + + nfonts = 1; + memset(sfi, 0, sizeof(sfi)); + hr = IMLangFontLink2_GetScriptFontInfo(font_link, sidLatin, SCRIPTCONTF_PROPORTIONAL_FONT, &nfonts, sfi); + ok(hr == S_OK, "GetScriptFontInfo failed %u\n", GetLastError()); + ok(nfonts == 1, "got %u, expected 1\n", nfonts); + ok(sfi[0].scripts, "unexpected result\n"); + ok(sfi[0].wszFont[0], "unexpected result\n"); } START_TEST(mlang) { IMultiLanguage2 *iML2 = NULL; IMLangFontLink *iMLFL = NULL; + IMLangFontLink2 *iMLFL2 = NULL; HRESULT ret; - pGetCPInfoExA = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetCPInfoExA"); + if (!init_function_ptrs()) + return; CoInitialize(NULL); - TRACE_2("Call CoCreateInstance\n"); ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, &IID_IMultiLanguage2, (void **)&iML2); - - trace("ret = %08x, MultiLanguage2 iML2 = %p\n", ret, iML2); if (ret != S_OK || !iML2) return; test_rfc1766(iML2); @@ -832,25 +1438,33 @@ START_TEST(mlang) test_EnumScripts(iML2, SCRIPTCONTF_SCRIPT_USER); test_EnumScripts(iML2, SCRIPTCONTF_SCRIPT_USER | SCRIPTCONTF_SCRIPT_HIDE | SCRIPTCONTF_SCRIPT_SYSTEM); - TRACE_2("Call IMultiLanguage2_IsConvertible\n"); ret = IMultiLanguage2_IsConvertible(iML2, CP_UTF8, CP_UNICODE); ok(ret == S_OK, "IMultiLanguage2_IsConvertible(CP_UTF8 -> CP_UNICODE) = %08x\n", ret); - TRACE_2("Call IMultiLanguage2_IsConvertible\n"); ret = IMultiLanguage2_IsConvertible(iML2, CP_UNICODE, CP_UTF8); ok(ret == S_OK, "IMultiLanguage2_IsConvertible(CP_UNICODE -> CP_UTF8) = %08x\n", ret); test_multibyte_to_unicode_translations(iML2); + test_IMultiLanguage2_ConvertStringFromUnicode(iML2); IMultiLanguage2_Release(iML2); + test_ConvertINetUnicodeToMultiByte(); + + test_JapaneseConversion(); + ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, &IID_IMLangFontLink, (void **)&iMLFL); - - trace("ret = %08x, IMLangFontLink iMLFL = %p\n", ret, iMLFL); - if (ret != S_OK || !iML2) return; + if (ret != S_OK || !iMLFL) return; IMLangFontLink_Test(iMLFL); IMLangFontLink_Release(iMLFL); - + + ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, + &IID_IMLangFontLink2, (void **)&iMLFL2); + if (ret != S_OK || !iMLFL2) return; + + test_GetScriptFontInfo(iMLFL2); + IMLangFontLink2_Release(iMLFL2); + CoUninitialize(); } diff --git a/rostests/winetests/msacm32/msacm.c b/rostests/winetests/msacm32/msacm.c index 6efcb84b9d0..956b78554bd 100644 --- a/rostests/winetests/msacm32/msacm.c +++ b/rostests/winetests/msacm32/msacm.c @@ -34,7 +34,7 @@ static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid, PACMFORMATTAGDETAILS paftd, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { if (winetest_interactive) @@ -45,7 +45,7 @@ static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid, static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid, LPACMFORMATDETAILS pafd, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fd) { if (winetest_interactive) @@ -55,7 +55,7 @@ static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid, } static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, - DWORD dwInstance, + DWORD_PTR dwInstance, DWORD fdwSupport) { MMRESULT rc; diff --git a/rostests/winetests/mshtml/dom.c b/rostests/winetests/mshtml/dom.c index bcb14ef4ea7..b4889999cbe 100644 --- a/rostests/winetests/mshtml/dom.c +++ b/rostests/winetests/mshtml/dom.c @@ -1798,7 +1798,7 @@ static void _test_border_styles(unsigned line, IHTMLStyle *pStyle, BSTR Name) HRESULT hres; DISPID dispid; - hres = IHTMLStyle_GetIDsOfNames(pStyle, &IID_NULL, (LPOLESTR*)&Name, 1, + hres = IHTMLStyle_GetIDsOfNames(pStyle, &IID_NULL, &Name, 1, LOCALE_USER_DEFAULT, &dispid); ok_(__FILE__,line) (hres == S_OK, "GetIDsOfNames: %08x\n", hres); if(hres == S_OK) @@ -2371,6 +2371,7 @@ static void test_current_style(IHTMLCurrentStyle *current_style) { BSTR str; HRESULT hres; + VARIANT v; test_disp((IUnknown*)current_style, &DIID_DispHTMLCurrentStyle); test_ifaces((IUnknown*)current_style, cstyle_iids); @@ -2379,6 +2380,118 @@ static void test_current_style(IHTMLCurrentStyle *current_style) ok(hres == S_OK, "get_display failed: %08x\n", hres); ok(!strcmp_wa(str, "block"), "get_display returned %s\n", dbgstr_w(str)); SysFreeString(str); + + hres = IHTMLCurrentStyle_get_position(current_style, &str); + ok(hres == S_OK, "get_position failed: %08x\n", hres); + ok(!strcmp_wa(str, "absolute"), "get_position returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_fontFamily(current_style, &str); + ok(hres == S_OK, "get_fontFamily failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_fontStyle(current_style, &str); + ok(hres == S_OK, "get_fontStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "normal"), "get_fontStyle returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_backgroundImage(current_style, &str); + ok(hres == S_OK, "get_backgroundImage failed: %08x\n", hres); + ok(!strcmp_wa(str, "none"), "get_backgroundImage returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_fontVariant(current_style, &str); + ok(hres == S_OK, "get_fontVariant failed: %08x\n", hres); + ok(!strcmp_wa(str, "normal"), "get_fontVariant returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_borderTopStyle(current_style, &str); + ok(hres == S_OK, "get_borderTopStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "none"), "get_borderTopStyle returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_borderRightStyle(current_style, &str); + ok(hres == S_OK, "get_borderRightStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "none"), "get_borderRightStyle returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_borderBottomStyle(current_style, &str); + ok(hres == S_OK, "get_borderBottomStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "none"), "get_borderBottomStyle returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_borderLeftStyle(current_style, &str); + ok(hres == S_OK, "get_borderLeftStyle failed: %08x\n", hres); + ok(!strcmp_wa(str, "none"), "get_borderLeftStyle returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_textAlign(current_style, &str); + ok(hres == S_OK, "get_textAlign failed: %08x\n", hres); + ok(!strcmp_wa(str, "center"), "get_textAlign returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_textDecoration(current_style, &str); + ok(hres == S_OK, "get_textDecoration failed: %08x\n", hres); + ok(!strcmp_wa(str, "none"), "get_textDecoration returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_cursor(current_style, &str); + ok(hres == S_OK, "get_cursor failed: %08x\n", hres); + ok(!strcmp_wa(str, "default"), "get_cursor returned %s\n", dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLCurrentStyle_get_fontWeight(current_style, &v); + ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres); + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); + ok( V_I4(&v) == 400, "expect 400 got (%d)\n", V_I4(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_fontSize(current_style, &v); + ok(hres == S_OK, "get_fontSize failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_left(current_style, &v); + ok(hres == S_OK, "get_left failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_top(current_style, &v); + ok(hres == S_OK, "get_top failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_width(current_style, &v); + ok(hres == S_OK, "get_width failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_height(current_style, &v); + ok(hres == S_OK, "get_height failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_paddingLeft(current_style, &v); + ok(hres == S_OK, "get_paddingLeft failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_zIndex(current_style, &v); + ok(hres == S_OK, "get_zIndex failed: %08x\n", hres); + ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v)); + ok( V_I4(&v) == 1, "expect 1 got (%d)\n", V_I4(&v)); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_verticalAlign(current_style, &v); + ok(hres == S_OK, "get_verticalAlign failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + ok(!strcmp_wa(V_BSTR(&v), "middle"), "get_verticalAlign returned %s\n", dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + hres = IHTMLCurrentStyle_get_marginRight(current_style, &v); + ok(hres == S_OK, "get_marginRight failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + VariantClear(&v); } static void test_style2(IHTMLStyle2 *style2) @@ -2403,9 +2516,35 @@ static void test_style2(IHTMLStyle2 *style2) SysFreeString(str); } +static void test_style4(IHTMLStyle4 *style4) +{ + HRESULT hres; + VARIANT v; + VARIANT vdefault; + + hres = IHTMLStyle4_get_minHeight(style4, &vdefault); + ok(hres == S_OK, "get_minHeight failed: %08x\n", hres); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = a2bstr("10px"); + hres = IHTMLStyle4_put_minHeight(style4, v); + ok(hres == S_OK, "put_minHeight failed: %08x\n", hres); + VariantClear(&v); + + hres = IHTMLStyle4_get_minHeight(style4, &v); + ok(hres == S_OK, "get_minHeight failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v)); + ok( !strcmp_wa(V_BSTR(&v), "10px"), "expect 10px got (%s)\n", dbgstr_w(V_BSTR(&v))); + + hres = IHTMLStyle4_put_minHeight(style4, vdefault); + ok(hres == S_OK, "put_minHeight failed: %08x\n", hres); + VariantClear(&vdefault); +} + static void test_default_style(IHTMLStyle *style) { IHTMLStyle2 *style2; + IHTMLStyle4 *style4; VARIANT_BOOL b; VARIANT v; BSTR str; @@ -2422,6 +2561,18 @@ static void test_default_style(IHTMLStyle *style) ok(hres == S_OK, "get_position failed: %08x\n", hres); ok(!str, "str=%s\n", dbgstr_w(str)); + V_VT(&v) = VT_NULL; + hres = IHTMLStyle_get_marginRight(style, &v); + ok(hres == S_OK, "get_marginRight failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(marginRight) = %d\n", V_VT(&v)); + ok(!V_BSTR(&v), "V_BSTR(marginRight) = %s\n", dbgstr_w(V_BSTR(&v))); + + V_VT(&v) = VT_NULL; + hres = IHTMLStyle_get_marginLeft(style, &v); + ok(hres == S_OK, "get_marginLeft failed: %08x\n", hres); + ok(V_VT(&v) == VT_BSTR, "V_VT(marginLeft) = %d\n", V_VT(&v)); + ok(!V_BSTR(&v), "V_BSTR(marginLeft) = %s\n", dbgstr_w(V_BSTR(&v))); + str = (void*)0xdeadbeef; hres = IHTMLStyle_get_fontFamily(style, &str); ok(hres == S_OK, "get_fontFamily failed: %08x\n", hres); @@ -3034,6 +3185,13 @@ static void test_default_style(IHTMLStyle *style) test_style2(style2); IHTMLStyle2_Release(style2); } + + hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLStyle4, (void**)&style4); + ok(hres == S_OK, "Could not get IHTMLStyle4 iface: %08x\n", hres); + if(SUCCEEDED(hres)) { + test_style4(style4); + IHTMLStyle4_Release(style4); + } } static void test_default_selection(IHTMLDocument2 *doc) diff --git a/rostests/winetests/msvcrt/file.c b/rostests/winetests/msvcrt/file.c index 36fcc8001b8..edc0799e6b3 100644 --- a/rostests/winetests/msvcrt/file.c +++ b/rostests/winetests/msvcrt/file.c @@ -36,6 +36,37 @@ static HANDLE proc_handles[2]; +static void test_filbuf( void ) +{ + FILE *fp; + int c; + fpos_t pos; + + fp = fopen("filbuf.tst", "wb"); + fwrite("\n\n\n\n", 1, 4, fp); + fclose(fp); + + fp = fopen("filbuf.tst", "rt"); + c = _filbuf(fp); + ok(c == '\n', "read wrong byte\n"); + /* See bug 16970 for why we care about _filbuf. + * ftell returns screwy values on files with lots + * of bare LFs in ascii mode because it assumes + * that ascii files contain only CRLFs, removes + * the CR's early in _filbuf, and adjusts the return + * value of ftell to compensate. + * native _filbuf will read the whole file, then consume and return + * the first one. That leaves fp->_fd at offset 4, and fp->_ptr + * pointing to a buffer of three bare LFs, so + * ftell will return 4 - 3 - 3 = -2. + */ + ok(ftell(fp) == -2, "ascii crlf removal does not match native\n"); + ok(fgetpos(fp, &pos) == 0, "fgetpos fail\n"); + ok(pos == -2, "ftell does not match fgetpos\n"); + fclose(fp); + unlink("filbuf.tst"); +} + static void test_fdopen( void ) { static const char buffer[] = {0,1,2,3,4,5,6,7,8,9}; @@ -105,11 +136,11 @@ static void test_fileops( void ) rewind(file); ok(fgetpos(file,&pos) == 0, "fgetpos failed unexpected\n"); - ok(pos == 0, "Unexpected result of fgetpos 0x%Lx\n", pos); - pos = (ULONGLONG)sizeof (outbuffer); + ok(pos == 0, "Unexpected result of fgetpos %x%08x\n", (DWORD)(pos >> 32), (DWORD)pos); + pos = sizeof (outbuffer); ok(fsetpos(file, &pos) == 0, "fsetpos failed unexpected\n"); ok(fgetpos(file,&pos) == 0, "fgetpos failed unexpected\n"); - ok(pos == (ULONGLONG)sizeof (outbuffer), "Unexpected result of fgetpos 0x%Lx\n", pos); + ok(pos == sizeof (outbuffer), "Unexpected result of fgetpos %x%08x\n", (DWORD)(pos >> 32), (DWORD)pos); fclose (file); fd = open ("fdopen.tst", O_RDONLY | O_TEXT); @@ -275,6 +306,7 @@ static void test_asciimode(void) { FILE *fp; char buf[64]; + int c, i, j; /* Simple test of CR CR LF handling. Test both fgets and fread code paths, they're different! */ fp = fopen("ascii.tst", "wb"); @@ -303,9 +335,84 @@ static void test_asciimode(void) ok((fread(buf, 1, sizeof(buf), fp) == 0), "fread after logical EOF\n"); fclose(fp); + /* Show ASCII mode handling*/ + fp= fopen("ascii.tst","wb"); + fputs("0\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n", fp); + fclose(fp); + + fp = fopen("ascii.tst", "r"); + c= fgetc(fp); + c= fgetc(fp); + fseek(fp,0,SEEK_CUR); + for(i=1; i<10; i++) { + ok((j = ftell(fp)) == i*3, "ftell fails in TEXT mode\n"); + fseek(fp,0,SEEK_CUR); + ok((c = fgetc(fp)) == '0'+ i, "fgetc after fseek failed in line %d\n", i); + c= fgetc(fp); + } + /* Show that fseek doesn't skip \\r !*/ + rewind(fp); + c= fgetc(fp); + fseek(fp, 2 ,SEEK_CUR); + for(i=1; i<10; i++) { + ok((c = fgetc(fp)) == '0'+ i, "fgetc after fseek with pos Offset failed in line %d\n", i); + fseek(fp, 2 ,SEEK_CUR); + } + fseek(fp, 9*3 ,SEEK_SET); + c = fgetc(fp); + fseek(fp, -4 ,SEEK_CUR); + for(i= 8; i>=0; i--) { + ok((c = fgetc(fp)) == '0'+ i, "fgetc after fseek with neg Offset failed in line %d\n", i); + fseek(fp, -4 ,SEEK_CUR); + } + /* Show what happens if fseek positions filepointer on \\r */ + fclose(fp); + fp = fopen("ascii.tst", "r"); + fseek(fp, 3 ,SEEK_SET); + ok((c = fgetc(fp)) == '1', "fgetc fails to read next char when positioned on \\r\n"); + fclose(fp); + unlink("ascii.tst"); } +static void test_asciimode2(void) +{ + /* Error sequence from one app was getchar followed by small fread + * with one \r removed had last byte of buffer filled with + * next byte of *unbuffered* data rather than next byte from buffer + * Test case is a short string of one byte followed by a newline + * followed by filler to fill out the sector, then a sector of + * some different byte. + */ + + FILE *fp; + char ibuf[4]; + int i; + static const char obuf[] = +"00\n" +"000000000000000000000000000000000000000000000000000000000000000000000000000000\n" +"000000000000000000000000000000000000000000000000000000000000000000000000000000\n" +"000000000000000000000000000000000000000000000000000000000000000000000000000000\n" +"000000000000000000000000000000000000000000000000000000000000000000000000000000\n" +"000000000000000000000000000000000000000000000000000000000000000000000000000000\n" +"000000000000000000000000000000000000000000000000000000000000000000000000000000\n" +"000000000000000000\n" +"1111111111111111111"; + + fp = fopen("ascii2.tst", "wt"); + fwrite(obuf, 1, sizeof(obuf), fp); + fclose(fp); + + fp = fopen("ascii2.tst", "rt"); + ok(getc(fp) == '0', "first char not 0\n"); + memset(ibuf, 0, sizeof(ibuf)); + i = fread(ibuf, 1, sizeof(ibuf), fp); + ok(i == sizeof(ibuf), "fread i %d != sizeof(ibuf)\n", i); + ok(0 == strncmp(ibuf, obuf+1, sizeof(ibuf)), "ibuf != obuf\n"); + fclose(fp); + unlink("ascii2.tst"); +} + static WCHAR* AtoW( const char* p ) { WCHAR* buffer; @@ -362,9 +469,10 @@ static void test_flsbuf( void ) { char* tempf; FILE *tempfh; + int c; int ret; int bufmode; - int bufmodes[] = {_IOFBF,_IONBF}; + static const int bufmodes[] = {_IOFBF,_IONBF}; tempf=_tempnam(".","wne"); for (bufmode=0; bufmode < sizeof(bufmodes)/sizeof(bufmodes[0]); bufmode++) @@ -388,6 +496,26 @@ static void test_flsbuf( void ) ok(EOF == ret, "_flsbuf(0,tempfh) on r/o file expected %x got %x\n", EOF, ret); fclose(tempfh); + /* See bug 17123, exposed by WinAVR's make */ + tempfh = fopen(tempf,"w"); + ok(tempfh->_cnt == 0, "_cnt on freshly opened file was %d\n", tempfh->_cnt); + setbuf(tempfh, NULL); + ok(tempfh->_cnt == 0, "_cnt on unbuffered file was %d\n", tempfh->_cnt); + /* Inlined putchar sets _cnt to -1. Native seems to ignore the value... */ + tempfh->_cnt = 1234; + ret = _flsbuf('Q',tempfh); + ok('Q' == ret, "_flsbuf('Q',tempfh) expected %x got %x\n", 'Q', ret); + /* ... and reset it to zero */ + ok(tempfh->_cnt == 0, "after unbuf _flsbuf, _cnt was %d\n", tempfh->_cnt); + fclose(tempfh); + /* And just for grins, make sure the file is correct */ + tempfh = fopen(tempf,"r"); + c = fgetc(tempfh); + ok(c == 'Q', "first byte should be 'Q'\n"); + c = fgetc(tempfh); + ok(c == EOF, "there should only be one byte\n"); + fclose(tempfh); + unlink(tempf); } @@ -425,8 +553,7 @@ static void test_fgetwc( void ) ok(l==BUFSIZ-2, "ftell expected %d got %ld\n", BUFSIZ-2, l); fgetws(wtextW,LLEN,tempfh); l=ftell(tempfh); - ok(l==BUFSIZ-2+strlen(mytext), "ftell expected %d got %ld\n", - BUFSIZ-2+strlen(mytext), l); + ok(l==BUFSIZ-2+strlen(mytext), "ftell expected %d got %ld\n", BUFSIZ-2+lstrlen(mytext), l); mytextW = AtoW (mytext); aptr = mytextW; wptr = wtextW; @@ -903,23 +1030,21 @@ static void test_stat(void) fd = open("stat.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE); if (fd >= 0) { - if (fstat(fd, &buf) == 0) - { - if ((buf.st_mode & _S_IFMT) == _S_IFREG) - { - ok(buf.st_dev == 0, "st_dev is %d, expected 0\n", buf.st_dev); - ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", - buf.st_dev, buf.st_rdev); - ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", - buf.st_nlink); - ok(buf.st_size == 0, "st_size is %d, expected 0\n", - buf.st_size); - } - else - skip("file is not a file?\n"); - } - else - skip("fstat failed, errno %d\n", errno); + ok(fstat(fd, &buf) == 0, "fstat failed: errno=%d\n", errno); + ok((buf.st_mode & _S_IFMT) == _S_IFREG, "bad format = %06o\n", buf.st_mode); + ok((buf.st_mode & 0777) == 0666, "bad st_mode = %06o\n", buf.st_mode); + ok(buf.st_dev == 0, "st_dev is %d, expected 0\n", buf.st_dev); + ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", buf.st_dev, buf.st_rdev); + ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink); + ok(buf.st_size == 0, "st_size is %d, expected 0\n", buf.st_size); + + ok(stat("stat.tst", &buf) == 0, "stat failed: errno=%d\n", errno); + ok((buf.st_mode & _S_IFMT) == _S_IFREG, "bad format = %06o\n", buf.st_mode); + ok((buf.st_mode & 0777) == 0666, "bad st_mode = %06o\n", buf.st_mode); + ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", buf.st_dev, buf.st_rdev); + ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink); + ok(buf.st_size == 0, "st_size is %d, expected 0\n", buf.st_size); + close(fd); remove("stat.tst"); } @@ -929,19 +1054,16 @@ static void test_stat(void) /* Tests for a char device */ if (_dup2(0, 10) == 0) { - if (fstat(10, &buf) == 0) + ok(fstat(10, &buf) == 0, "fstat(stdin) failed: errno=%d\n", errno); + if ((buf.st_mode & _S_IFMT) == _S_IFCHR) { - if (buf.st_mode == _S_IFCHR) - { - ok(buf.st_dev == 10, "st_dev is %d, expected 10\n", buf.st_dev); - ok(buf.st_rdev == 10, "st_rdev is %d, expected 10\n", buf.st_rdev); - ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink); - } - else - skip("stdin is not a char device?\n"); + ok(buf.st_mode == _S_IFCHR, "bad st_mode=%06o\n", buf.st_mode); + ok(buf.st_dev == 10, "st_dev is %d, expected 10\n", buf.st_dev); + ok(buf.st_rdev == 10, "st_rdev is %d, expected 10\n", buf.st_rdev); + ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink); } else - skip("fstat failed with errno %d\n", errno); + skip("stdin is not a char device? st_mode=%06o\n", buf.st_mode); close(10); } else @@ -950,22 +1072,11 @@ static void test_stat(void) /* Tests for pipes */ if (_pipe(pipes, 1024, O_BINARY) == 0) { - if (fstat(pipes[0], &buf) == 0) - { - if (buf.st_mode == _S_IFIFO) - { - ok(buf.st_dev == pipes[0], "st_dev is %d, expected %d\n", - buf.st_dev, pipes[0]); - ok(buf.st_rdev == pipes[0], "st_rdev is %d, expected %d\n", - buf.st_rdev, pipes[0]); - ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", - buf.st_nlink); - } - else - skip("pipe() didn't make a pipe?\n"); - } - else - skip("fstat failed with errno %d\n", errno); + ok(fstat(pipes[0], &buf) == 0, "fstat(pipe) failed: errno=%d\n", errno); + ok(buf.st_mode == _S_IFIFO, "bad st_mode=%06o\n", buf.st_mode); + ok(buf.st_dev == pipes[0], "st_dev is %d, expected %d\n", buf.st_dev, pipes[0]); + ok(buf.st_rdev == pipes[0], "st_rdev is %d, expected %d\n", buf.st_rdev, pipes[0]); + ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink); close(pipes[0]); close(pipes[1]); } @@ -997,7 +1108,7 @@ static void test_pipes_child(int argc, char** args) for (i=0; i 0) buf[r]='\0'; ok(strcmp(buf, pipe_string) == 0, "expected to read '%s', got '%s'\n", pipe_string, buf); @@ -1070,7 +1181,7 @@ static void test_pipes(const char* selfname) for (i=0; i 0) buf[r]='\0'; ok(strcmp(buf, expected) == 0, "got '%s' expected '%s'\n", buf, expected); @@ -1125,10 +1236,12 @@ START_TEST(file) test_unlink(); /* testing stream I/O */ + test_filbuf(); test_fdopen(); test_fopen_fclose_fcloseall(); test_fileops(); test_asciimode(); + test_asciimode2(); test_readmode(FALSE); /* binary mode */ test_readmode(TRUE); /* ascii mode */ test_fgetc(); diff --git a/rostests/winetests/msvcrt/headers.c b/rostests/winetests/msvcrt/headers.c index d909ac7bf43..7133e1ec05d 100644 --- a/rostests/winetests/msvcrt/headers.c +++ b/rostests/winetests/msvcrt/headers.c @@ -32,7 +32,7 @@ #include "stdio.h" #include "wchar.h" #include "ctype.h" -//#include "crtdbg.h" +#include "crtdbg.h" #include "share.h" #include "search.h" #include "wctype.h" @@ -88,6 +88,7 @@ static void test_types(void) CHECK_TYPE(_off_t); CHECK_TYPE(clock_t); CHECK_TYPE(time_t); + CHECK_TYPE(__time32_t); CHECK_TYPE(__time64_t); CHECK_TYPE(fpos_t); CHECK_SIZE(FILE); @@ -462,6 +463,17 @@ static void test_defines(void) CHECK_DEF(SIGBREAK); CHECK_DEF(SIGABRT); CHECK_DEF(NSIG); + CHECK_DEF(_FPE_INVALID); + CHECK_DEF(_FPE_DENORMAL); + CHECK_DEF(_FPE_ZERODIVIDE); + CHECK_DEF(_FPE_OVERFLOW); + CHECK_DEF(_FPE_UNDERFLOW); + CHECK_DEF(_FPE_INEXACT); + CHECK_DEF(_FPE_UNEMULATED); + CHECK_DEF(_FPE_SQRTNEG); + CHECK_DEF(_FPE_STACKOVERFLOW); + CHECK_DEF(_FPE_STACKUNDERFLOW); + CHECK_DEF(_FPE_EXPLICITGEN); #ifdef __i386__ CHECK_DEF(_EM_INVALID); CHECK_DEF(_EM_DENORMAL); diff --git a/rostests/winetests/msvcrt/heap.c b/rostests/winetests/msvcrt/heap.c index ae98e3b8975..6e6b54446a6 100644 --- a/rostests/winetests/msvcrt/heap.c +++ b/rostests/winetests/msvcrt/heap.c @@ -29,7 +29,7 @@ static void * (*p_aligned_offset_malloc)(size_t,size_t,size_t) = NULL; static void * (*p_aligned_realloc)(void*,size_t,size_t) = NULL; static void * (*p_aligned_offset_realloc)(void*,size_t,size_t,size_t) = NULL; -static void test_aligned_malloc(size_t size, size_t alignment) +static void test_aligned_malloc(unsigned int size, unsigned int alignment) { void *mem; @@ -48,8 +48,7 @@ static void test_aligned_malloc(size_t size, size_t alignment) { void *saved; saved = *(void **)((DWORD_PTR)((char *)mem - sizeof(void *)) & ~(sizeof(void *) - 1)); - trace("_aligned_malloc(%3d, %3d) returns %p, saved = %p, diff = %d\n", - size, alignment, mem, saved, (char *)saved - (char *)mem); + trace("_aligned_malloc(%3d, %3d) returns %p, saved = %p\n", size, alignment, mem, saved ); } p_aligned_free(mem); } @@ -57,7 +56,7 @@ static void test_aligned_malloc(size_t size, size_t alignment) ok(errno == EINVAL, "_aligned_malloc(%d, %d) errno: %d != %d\n", size, alignment, errno, EINVAL); } -static void test_aligned_offset_malloc(size_t size, size_t alignment, size_t offset) +static void test_aligned_offset_malloc(unsigned int size, unsigned int alignment, unsigned int offset) { void *mem; @@ -79,8 +78,8 @@ static void test_aligned_offset_malloc(size_t size, size_t alignment, size_t off { void *saved; saved = *(void **)((DWORD_PTR)((char *)mem - sizeof(void *)) & ~(sizeof(void *) - 1)); - trace("_aligned_offset_malloc(%3d, %3d, %3d) returns %p, saved = %p, diff = %d\n", - size, alignment, offset, mem, saved, (char *)saved - (char *)mem); + trace("_aligned_offset_malloc(%3d, %3d, %3d) returns %p, saved = %p\n", + size, alignment, offset, mem, saved); } p_aligned_free(mem); } @@ -88,7 +87,7 @@ static void test_aligned_offset_malloc(size_t size, size_t alignment, size_t off ok(errno == EINVAL, "_aligned_offset_malloc(%d, %d, %d) errno: %d != %d\n", size, alignment, offset, errno, EINVAL); } -static void test_aligned_realloc(size_t size1, size_t size2, size_t alignment) +static void test_aligned_realloc(unsigned int size1, unsigned int size2, unsigned int alignment) { void *mem, *mem1, *mem2; @@ -116,8 +115,7 @@ static void test_aligned_realloc(size_t size1, size_t size2, size_t alignment) { void *saved; saved = *(void **)((DWORD_PTR)((char *)mem - sizeof(void *)) & ~(sizeof(void *) - 1)); - trace("_aligned_malloc(%3d, %3d) returns %p, saved = %p, diff = %d\n", - size1, alignment, mem, saved, (char *)saved - (char *)mem); + trace("_aligned_malloc(%3d, %3d) returns %p, saved = %p\n", size1, alignment, mem, saved); } mem2 = p_aligned_realloc(mem, size2, alignment); @@ -132,8 +130,8 @@ static void test_aligned_realloc(size_t size1, size_t size2, size_t alignment) { void *saved; saved = *(void **)((DWORD_PTR)((char *)mem2 - sizeof(void *)) & ~(sizeof(void *) - 1)); - trace("_aligned_realloc(%p, %3d, %3d) returns %p, saved = %p, diff = %d\n", - mem, size2, alignment, mem2, saved, (char *)saved - (char *)mem2); + trace("_aligned_realloc(%p, %3d, %3d) returns %p, saved = %p\n", + mem, size2, alignment, mem2, saved); } if (mem1) { @@ -160,7 +158,8 @@ static void test_aligned_realloc(size_t size1, size_t size2, size_t alignment) ok(errno == EINVAL, "_aligned_malloc(%d, %d) errno: %d != %d\n", size1, alignment, errno, EINVAL); } -static void test_aligned_offset_realloc(size_t size1, size_t size2, size_t alignment, size_t offset) +static void test_aligned_offset_realloc(unsigned int size1, unsigned int size2, + unsigned int alignment, unsigned int offset) { void *mem, *mem1, *mem2; @@ -188,8 +187,8 @@ static void test_aligned_offset_realloc(size_t size1, size_t size2, size_t align { void *saved; saved = *(void **)((DWORD_PTR)((char *)mem - sizeof(void *)) & ~(sizeof(void *) - 1)); - trace("_aligned_offset_malloc(%3d, %3d, %3d) returns %p, saved = %p, diff = %d\n", - size1, alignment, offset, mem, saved, (char *)saved - (char *)mem); + trace("_aligned_offset_malloc(%3d, %3d, %3d) returns %p, saved = %p\n", + size1, alignment, offset, mem, saved); } mem2 = p_aligned_offset_realloc(mem, size2, alignment, offset); @@ -204,8 +203,8 @@ static void test_aligned_offset_realloc(size_t size1, size_t size2, size_t align { void *saved; saved = *(void **)((DWORD_PTR)((char *)mem2 - sizeof(void *)) & ~(sizeof(void *) - 1)); - trace("_aligned_offset_realloc(%p, %3d, %3d, %3d) returns %p, saved = %p, diff = %d\n", - mem, size2, alignment, offset, mem2, saved, (char *)saved - (char *)mem2); + trace("_aligned_offset_realloc(%p, %3d, %3d, %3d) returns %p, saved = %p\n", + mem, size2, alignment, offset, mem2, saved); } if (mem1) { diff --git a/rostests/winetests/msvcrt/printf.c b/rostests/winetests/msvcrt/printf.c index 1603893a811..d25734e195e 100644 --- a/rostests/winetests/msvcrt/printf.c +++ b/rostests/winetests/msvcrt/printf.c @@ -27,6 +27,10 @@ #include +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + #include "wine/test.h" static void test_sprintf( void ) @@ -277,20 +281,50 @@ static void test_sprintf( void ) ok(!strcmp(buffer,"1 "),"Character zero-padded and/or not left-adjusted \"%s\"\n",buffer); ok( r==4, "return count wrong\n"); - format = "%p"; - r = sprintf(buffer,format,(void *)57); - ok(!strcmp(buffer,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer); - ok( r==8, "return count wrong\n"); + if (sizeof(void *) == 8) + { + format = "%p"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer,"0000000000000039"),"Pointer formatted incorrectly \"%s\"\n",buffer); + ok( r==16, "return count wrong\n"); - format = "%#012p"; - r = sprintf(buffer,format,(void *)57); - ok(!strcmp(buffer," 0X00000039"),"Pointer formatted incorrectly\n"); - ok( r==12, "return count wrong\n"); + format = "%#020p"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer," 0X0000000000000039"),"Pointer formatted incorrectly\n"); + ok( r==20, "return count wrong\n"); - format = "%Fp"; - r = sprintf(buffer,format,(void *)57); - ok(!strcmp(buffer,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer); - ok( r==8, "return count wrong\n"); + format = "%Fp"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer,"0000000000000039"),"Pointer formatted incorrectly \"%s\"\n",buffer); + ok( r==16, "return count wrong\n"); + + format = "%#-020p"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer,"0X0000000000000039 "),"Pointer formatted incorrectly\n"); + ok( r==20, "return count wrong\n"); + } + else + { + format = "%p"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer); + ok( r==8, "return count wrong\n"); + + format = "%#012p"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer," 0X00000039"),"Pointer formatted incorrectly\n"); + ok( r==12, "return count wrong\n"); + + format = "%Fp"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer); + ok( r==8, "return count wrong\n"); + + format = "%#-012p"; + r = sprintf(buffer,format,(void *)57); + ok(!strcmp(buffer,"0X00000039 "),"Pointer formatted incorrectly\n"); + ok( r==12, "return count wrong\n"); + } format = "%04s"; r = sprintf(buffer,format,"foo"); @@ -312,11 +346,6 @@ static void test_sprintf( void ) ok(!strcmp(buffer,"foo "),"Negative field width ignored \"%s\"\n",buffer); ok( r==5, "return count wrong\n"); - format = "%#-012p"; - r = sprintf(buffer,format,(void *)57); - ok(!strcmp(buffer,"0X00000039 "),"Pointer formatted incorrectly\n"); - ok( r==12, "return count wrong\n"); - format = "hello"; r = sprintf(buffer, format); ok(!strcmp(buffer,"hello"), "failed\n"); @@ -455,8 +484,16 @@ static void test_sprintf( void ) format = "%p"; r = sprintf(buffer, format,0); - ok(!strcmp(buffer,"00000000"), "failed\n"); - ok( r==8, "return count wrong\n"); + if (sizeof(void *) == 8) + { + ok(!strcmp(buffer,"0000000000000000"), "failed\n"); + ok( r==16, "return count wrong\n"); + } + else + { + ok(!strcmp(buffer,"00000000"), "failed\n"); + ok( r==8, "return count wrong\n"); + } format = "%s"; r = sprintf(buffer, format,0); @@ -661,10 +698,39 @@ static void test_fcvt(void) ok( 0 == sign, "sign wrong\n"); } +static int _vsnwprintf_wrapper(wchar_t *str, size_t len, const wchar_t *format, ...) +{ + int ret; + __ms_va_list valist; + __ms_va_start(valist, format); + ret = _vsnwprintf(str, len, format, valist); + __ms_va_end(valist); + return ret; +} + +static void test_vsnwprintf(void) +{ + const wchar_t format[] = {'%','w','s','%','w','s','%','w','s',0}; + const wchar_t one[] = {'o','n','e',0}; + const wchar_t two[] = {'t','w','o',0}; + const wchar_t three[] = {'t','h','r','e','e',0}; + + int ret; + wchar_t str[32]; + char buf[32]; + + ret = _vsnwprintf_wrapper( str, sizeof(str)/sizeof(str[0]), format, one, two, three ); + + ok( ret == 11, "got %d expected 11\n", ret ); + WideCharToMultiByte( CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL ); + ok( !strcmp(buf, "onetwothree"), "got %s expected 'onetwothree'\n", buf ); +} + START_TEST(printf) { test_sprintf(); test_swprintf(); test_snprintf(); test_fcvt(); + test_vsnwprintf(); } diff --git a/rostests/winetests/msvcrt/scanf.c b/rostests/winetests/msvcrt/scanf.c index b152eacfbfd..0ec89ff5193 100644 --- a/rostests/winetests/msvcrt/scanf.c +++ b/rostests/winetests/msvcrt/scanf.c @@ -51,10 +51,11 @@ static void test_sscanf( void ) ok( ptr == (void *)0x46F172,"sscanf reads %p instead of %x\n", ptr, 0x46F172 ); ok( sscanf("0x46F173", "%p", &ptr) == 1, "sscanf failed\n" ); - ok( ptr == (void *)0,"sscanf reads %p instead of %x\n", ptr, 0 ); + ok( ptr == NULL,"sscanf reads %p instead of %x\n", ptr, 0 ); ok( sscanf("-46F174", "%p", &ptr) == 1, "sscanf failed\n" ); - ok( ptr == (void *)0xFFB90E8C,"sscanf reads %p instead of %x\n", ptr, 0xFFB90E8C ); + ok( ptr == (void *)(ULONG_PTR)-0x46f174,"sscanf reads %p instead of %p\n", + ptr, (void *)(ULONG_PTR)-0x46f174 ); ok( sscanf("+46F175", "%p", &ptr) == 1, "sscanf failed\n" ); ok( ptr == (void *)0x46F175,"sscanf reads %p instead of %x\n", ptr, 0x46F175 ); diff --git a/rostests/winetests/msvcrt/string.c b/rostests/winetests/msvcrt/string.c index a36d3b0ce7f..45c40d5dc4b 100644 --- a/rostests/winetests/msvcrt/string.c +++ b/rostests/winetests/msvcrt/string.c @@ -51,6 +51,8 @@ static int (*pstrcpy_s)(char *dst, size_t len, const char *src); static int (*pstrcat_s)(char *dst, size_t len, const char *src); static int (*p_mbsnbcpy_s)(unsigned char * dst, size_t size, const unsigned char * src, size_t count); static int (*p_wcscpy_s)(wchar_t *wcDest, size_t size, const wchar_t *wcSrc); +static int *p__mb_cur_max; +static unsigned char *p_mbctype; #define SETNOFAIL(x,y) x = (void*)GetProcAddress(hMsvcrt,y) #define SET(x,y) SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y) @@ -62,13 +64,13 @@ static void test_swab( void ) { char expected1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ@#"; char expected2[] = "ABCDEFGHIJKLMNOPQRSTUVWX$"; char expected3[] = "$"; - + char from[30]; char to[30]; - + int testsize; - - /* Test 1 - normal even case */ + + /* Test 1 - normal even case */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 26; @@ -76,7 +78,7 @@ static void test_swab( void ) { _swab( from, to, testsize ); ok(memcmp(to,expected1,testsize) == 0, "Testing even size %d returned '%*.*s'\n", testsize, testsize, testsize, to); - /* Test 2 - uneven case */ + /* Test 2 - uneven case */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 25; @@ -84,7 +86,7 @@ static void test_swab( void ) { _swab( from, to, testsize ); ok(memcmp(to,expected2,testsize) == 0, "Testing odd size %d returned '%*.*s'\n", testsize, testsize, testsize, to); - /* Test 3 - from = to */ + /* Test 3 - from = to */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 26; @@ -92,7 +94,7 @@ static void test_swab( void ) { _swab( to, to, testsize ); ok(memcmp(to,expected1,testsize) == 0, "Testing overlapped size %d returned '%*.*s'\n", testsize, testsize, testsize, to); - /* Test 4 - 1 bytes */ + /* Test 4 - 1 bytes */ memset(to,'$', sizeof(to)); memset(from,'@', sizeof(from)); testsize = 1; @@ -111,14 +113,14 @@ static void test_codepage(int cp) ok(_setmbcp(cp) == 0, "Couldn't set mbcp\n"); - prev = _mbctype[0]; + prev = p_mbctype[0]; printf("static int result_cp_%d_mbctype[] = { ", cp); for (i = 1; i < 257; i++) { - if (_mbctype[i] != prev) + if (p_mbctype[i] != prev) { printf("0x%x,%d, ", prev, count); - prev = _mbctype[i]; + prev = p_mbctype[i]; count = 1; } else @@ -127,7 +129,7 @@ static void test_codepage(int cp) printf("0x%x,%d };\n", prev, count); } -#define test_codepage_todo(cp, todo) test_codepage(cp) +#else /* RLE-encoded mbctype tables for given codepages */ static int result_cp_932_mbctype[] = { 0x0,65, 0x8,1, 0x18,26, 0x8,6, 0x28,26, 0x8,4, @@ -139,10 +141,7 @@ static int result_cp_949_mbctype[] = { 0x0,66, 0x18,26, 0x8,6, 0x28,26, 0x8,6, 0 static int result_cp_950_mbctype[] = { 0x0,65, 0x8,1, 0x18,26, 0x8,6, 0x28,26, 0x8,4, 0x0,2, 0x4,32, 0xc,94, 0,1 }; -static int todo_none[] = { -2 }; -static int todo_cp_932[] = { 254, -2 }; - -void test_cp_table(int cp, int *result, int *todo) +static void test_cp_table(int cp, int *result) { int i; int count = 0; @@ -156,26 +155,18 @@ void test_cp_table(int cp, int *result, int *todo) count = result[1]; result += 2; } - if (i == *todo + 1) - { - todo_wine ok(_mbctype[i] == curr, "CP%d: Mismatch in ctype for character %d - %d instead of %d\n", cp, i-1, _mbctype[i], curr); - todo++; - } - else - ok(_mbctype[i] == curr, "CP%d: Mismatch in ctype for character %d - %d instead of %d\n", cp, i-1, _mbctype[i], curr); + ok(p_mbctype[i] == curr, "CP%d: Mismatch in ctype for character %d - %d instead of %d\n", cp, i-1, p_mbctype[i], curr); count--; } } -#define test_codepage(num) test_cp_table(num, result_cp_##num##_mbctype, todo_none); -#define test_codepage_todo(num, todo) test_cp_table(num, result_cp_##num##_mbctype, todo); +#define test_codepage(num) test_cp_table(num, result_cp_##num##_mbctype); #endif - static void test_mbcp(void) { - int mb_orig_max = __mb_cur_max; + int mb_orig_max = *p__mb_cur_max; int curr_mbcp = _getmbcp(); unsigned char *mbstring = (unsigned char *)"\xb0\xb1\xb2 \xb3\xb4 \xb5"; /* incorrect string */ unsigned char *mbstring2 = (unsigned char *)"\xb0\xb1\xb2\xb3Q\xb4\xb5"; /* correct string */ @@ -189,26 +180,26 @@ static void test_mbcp(void) * between versions of Windows. Also Windows 9x seems to ignore the codepage and always uses * CP1252 (or the ACP?) so we test only a few ASCII characters */ _setmbcp(1252); - expect_eq(_mbctype[10], 0, char, "%x"); - expect_eq(_mbctype[50], 0, char, "%x"); - expect_eq(_mbctype[66], _SBUP, char, "%x"); - expect_eq(_mbctype[100], _SBLOW, char, "%x"); - expect_eq(_mbctype[128], 0, char, "%x"); + expect_eq(p_mbctype[10], 0, char, "%x"); + expect_eq(p_mbctype[50], 0, char, "%x"); + expect_eq(p_mbctype[66], _SBUP, char, "%x"); + expect_eq(p_mbctype[100], _SBLOW, char, "%x"); + expect_eq(p_mbctype[128], 0, char, "%x"); _setmbcp(1250); - expect_eq(_mbctype[10], 0, char, "%x"); - expect_eq(_mbctype[50], 0, char, "%x"); - expect_eq(_mbctype[66], _SBUP, char, "%x"); - expect_eq(_mbctype[100], _SBLOW, char, "%x"); - expect_eq(_mbctype[128], 0, char, "%x"); + expect_eq(p_mbctype[10], 0, char, "%x"); + expect_eq(p_mbctype[50], 0, char, "%x"); + expect_eq(p_mbctype[66], _SBUP, char, "%x"); + expect_eq(p_mbctype[100], _SBLOW, char, "%x"); + expect_eq(p_mbctype[128], 0, char, "%x"); /* double byte code pages */ - //test_codepage_todo(932, todo_cp_932); - //test_codepage(936); - //test_codepage(949); - //test_codepage(950); + test_codepage(932); + test_codepage(936); + test_codepage(949); + test_codepage(950); _setmbcp(936); - ok(__mb_cur_max == mb_orig_max, "__mb_cur_max shouldn't be updated (is %d != %d)\n", __mb_cur_max, mb_orig_max); + ok(*p__mb_cur_max == mb_orig_max, "__mb_cur_max shouldn't be updated (is %d != %d)\n", *p__mb_cur_max, mb_orig_max); ok(_ismbblead('\354'), "\354 should be a lead byte\n"); ok(_ismbblead(' ') == FALSE, "' ' should not be a lead byte\n"); ok(_ismbblead(0x1234b0), "0x1234b0 should not be a lead byte\n"); @@ -345,7 +336,7 @@ static void test_mbcp(void) * we hope the current locale to be SBCS because setlocale(LC_ALL, ".1252") seems not to work yet * (as of Wine 0.9.43) */ - if (__mb_cur_max == 1) + if (*p__mb_cur_max == 1) { expect_eq(mblen((char *)mbstring, 3), 1, int, "%x"); expect_eq(_mbstrlen((char *)mbstring2), 7, int, "%d"); @@ -606,6 +597,28 @@ static void test_wcscpy_s(void) ok(szDestShort[0] == 0, "szDestShort[0] not 0\n"); } +static void test_mbcjisjms(void) +{ + /* List of value-pairs to test. The test assumes the last pair to be {0, ..} */ + unsigned int jisjms[][2] = { {0x2020, 0}, {0x2021, 0}, {0x2120, 0}, {0x2121, 0x8140}, + {0x7f7f, 0}, {0x7f7e, 0}, {0x7e7f, 0}, {0x7e7e, 0xeffc}, + {0x2121FFFF, 0}, {0x2223, 0x81a1}, {0x237e, 0x829e}, {0, 0}}; + unsigned int ret, exp, i; + + i = 0; + do + { + ret = _mbcjistojms(jisjms[i][0]); + + if(_getmbcp() == 932) /* Japanese codepage? */ + exp = jisjms[i][1]; + else + exp = jisjms[i][0]; /* If not, no conversion */ + + ok(ret == exp, "Expected 0x%x, got 0x%x\n", exp, ret); + } while(jisjms[i++][0] != 0); +} + START_TEST(string) { char mem[100]; @@ -618,6 +631,8 @@ START_TEST(string) ok(hMsvcrt != 0, "GetModuleHandleA failed\n"); SET(pmemcpy,"memcpy"); SET(pmemcmp,"memcmp"); + SET(p_mbctype,"_mbctype"); + SET(p__mb_cur_max,"__mb_cur_max"); pstrcpy_s = (void *)GetProcAddress( hMsvcrt,"strcpy_s" ); pstrcat_s = (void *)GetProcAddress( hMsvcrt,"strcat_s" ); p_mbsnbcpy_s = (void *)GetProcAddress( hMsvcrt,"_mbsnbcpy_s" ); @@ -644,6 +659,7 @@ START_TEST(string) test_strcpy_s(); test_strcat_s(); test__mbsnbcpy_s(); + test_mbcjisjms(); test_wcscpy_s(); } diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index 584eab33e22..c70e6edb3e2 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -2404,6 +2404,7 @@ static void test_cloneNode(void ) long nAttrCnt = 0, nAttrCnt1 = 0; IXMLDOMNode *node; IXMLDOMNode *node_clone; + IXMLDOMNode *node_first; HRESULT r; BSTR str; static const WCHAR szSearch[] = { 'l', 'c', '/', 'p', 'r', 0 }; @@ -2448,6 +2449,20 @@ static void test_cloneNode(void ) return; } + r = IXMLDOMNode_get_firstChild(node_clone, &node_first); + ok( r == S_OK, "ret %08x\n", r ); + if(r == S_OK) + { + IXMLDOMDocument *doc2; + + r = IXMLDOMNode_get_ownerDocument(node_clone, &doc2); + ok( r == S_OK, "ret %08x\n", r ); + if(r == S_OK) + IXMLDOMDocument_Release(doc2); + + IXMLDOMNode_Release(node_first); + } + r = IXMLDOMNode_get_childNodes(node, &pList); ok( r == S_OK, "ret %08x\n", r ); if (pList) @@ -2496,6 +2511,20 @@ static void test_cloneNode(void ) return; } + r = IXMLDOMNode_get_firstChild(node_clone, &node_first); + ok( r == S_FALSE, "ret %08x\n", r ); + if(r == S_OK) + { + IXMLDOMDocument *doc2; + + r = IXMLDOMNode_get_ownerDocument(node_clone, &doc2); + ok( r == S_OK, "ret %08x\n", r ); + if(r == S_OK) + IXMLDOMDocument_Release(doc2); + + IXMLDOMNode_Release(node_first); + } + r = IXMLDOMNode_get_childNodes(node_clone, &pList); ok( r == S_OK, "ret %08x\n", r ); if (pList) diff --git a/rostests/winetests/netapi32/access.c b/rostests/winetests/netapi32/access.c index dfa68efd883..8c39a187eab 100644 --- a/rostests/winetests/netapi32/access.c +++ b/rostests/winetests/netapi32/access.c @@ -74,7 +74,7 @@ static int init_access_tests(void) rc=GetUserNameW(user_name, &dwSize); if (rc==FALSE && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) { - skip("GetUserNameW is not available.\n"); + win_skip("GetUserNameW is not available.\n"); return 0; } ok(rc, "User Name Retrieved\n"); @@ -251,6 +251,11 @@ static void run_userhandling_tests(void) ret = pNetUserDel(NULL, sTooLongName); ok(ret == NERR_Success, "Deleting the user failed : %d\n", ret); } + else if (ret == ERROR_ACCESS_DENIED) + { + skip("not enough permissions to add a user\n"); + return; + } else ok(ret == NERR_BadUsername || broken(ret == NERR_PasswordTooShort), /* NT4 */ @@ -260,7 +265,8 @@ static void run_userhandling_tests(void) usri.usri1_password = sTooLongPassword; ret = pNetUserAdd(NULL, 1, (LPBYTE)&usri, NULL); - ok(ret == NERR_PasswordTooShort, "Adding user with too long password returned 0x%08x\n", ret); + ok(ret == NERR_PasswordTooShort || ret == ERROR_ACCESS_DENIED /* Win2003 */, + "Adding user with too long password returned 0x%08x\n", ret); usri.usri1_name = sTooLongName; usri.usri1_password = sTooLongPassword; @@ -327,7 +333,7 @@ START_TEST(access) * if one is not available, none are. */ if (!pNetApiBufferFree) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); FreeLibrary(hnetapi32); return; } diff --git a/rostests/winetests/netapi32/apibuf.c b/rostests/winetests/netapi32/apibuf.c index fa29fc441d5..2438ecd7e44 100644 --- a/rostests/winetests/netapi32/apibuf.c +++ b/rostests/winetests/netapi32/apibuf.c @@ -98,7 +98,7 @@ START_TEST(apibuf) if (pNetApiBufferAllocate && pNetApiBufferFree && pNetApiBufferReallocate && pNetApiBufferSize) run_apibuf_tests(); else - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); FreeLibrary(hnetapi32); } diff --git a/rostests/winetests/netapi32/ds.c b/rostests/winetests/netapi32/ds.c index 277a589b8ca..be9597d79ef 100644 --- a/rostests/winetests/netapi32/ds.c +++ b/rostests/winetests/netapi32/ds.c @@ -87,7 +87,7 @@ START_TEST(ds) test_get(); } else - skip("DsRoleGetPrimaryDomainInformation is not available\n"); + win_skip("DsRoleGetPrimaryDomainInformation is not available\n"); FreeLibrary(hnetapi32); } diff --git a/rostests/winetests/netapi32/wksta.c b/rostests/winetests/netapi32/wksta.c index b4994f8a2d3..e0c16d35ba9 100644 --- a/rostests/winetests/netapi32/wksta.c +++ b/rostests/winetests/netapi32/wksta.c @@ -51,7 +51,7 @@ static int init_wksta_tests(void) dwSize = sizeof(user_name)/sizeof(user_name[0]); rc=GetUserNameW(user_name, &dwSize); if (rc==FALSE && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) { - skip("GetUserNameW is not implemented\n"); + win_skip("GetUserNameW is not implemented\n"); return 0; } ok(rc, "User Name Retrieved\n"); @@ -192,7 +192,7 @@ START_TEST(wksta) * if one is not available, none are. */ if (!pNetApiBufferFree) { - skip("Needed functions are not available\n"); + win_skip("Needed functions are not available\n"); FreeLibrary(hnetapi32); return; } diff --git a/rostests/winetests/psapi/psapi_main.c b/rostests/winetests/psapi/psapi_main.c index 1978fd4d787..4cee7c62405 100644 --- a/rostests/winetests/psapi/psapi_main.c +++ b/rostests/winetests/psapi/psapi_main.c @@ -176,7 +176,7 @@ static void test_GetProcessImageFileName(void) if(!pGetProcessImageFileNameA(hpQI, szImgPath, sizeof(szImgPath))) { if(GetLastError() == ERROR_INVALID_FUNCTION) - trace("GetProcessImageFileName not implemented\n"); + win_skip("GetProcessImageFileName not implemented\n"); else if(GetLastError() == 0xdeadbeef) ok(0, "failed without error code\n"); else diff --git a/rostests/winetests/riched20/editor.c b/rostests/winetests/riched20/editor.c index ff5d598ef4b..f8da3faf109 100644 --- a/rostests/winetests/riched20/editor.c +++ b/rostests/winetests/riched20/editor.c @@ -1471,7 +1471,7 @@ static void test_EM_SETOPTIONS(void) DestroyWindow(hwndRichEdit); hwndRichEdit = CreateWindow(RICHEDIT_CLASS, NULL, - WS_POPUP|WS_HSCROLL|WS_VSCROLL, + WS_POPUP|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE, 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); ok(hwndRichEdit != NULL, "class: %s, error: %d\n", @@ -3225,7 +3225,7 @@ static DWORD CALLBACK test_WM_SETTEXT_esCallback(DWORD_PTR dwCookie, return 0; } -static void test_WM_SETTEXT() +static void test_WM_SETTEXT(void) { HWND hwndRichEdit = new_richedit(NULL); const char * TestItem1 = "TestSomeText"; @@ -3345,7 +3345,9 @@ static void test_EM_STREAMOUT(void) static void test_EM_SETTEXTEX(void) { - HWND hwndRichEdit = new_richedit(NULL); + HWND hwndRichEdit, parent; + SCROLLINFO si; + int sel_start, sel_end; SETTEXTEX setText; GETTEXTEX getText; WCHAR TestItem1[] = {'T', 'e', 's', 't', @@ -3392,6 +3394,76 @@ static void test_EM_SETTEXTEX(void) int result; CHARRANGE cr; EDITSTREAM es; + WNDCLASSA cls; + + /* Test the scroll position with and without a parent window. + * + * For some reason the scroll position is 0 after EM_SETTEXTEX + * with the ST_SELECTION flag only when the control has a parent + * window, even though the selection is at the end. */ + cls.style = 0; + cls.lpfnWndProc = DefWindowProcA; + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + cls.hInstance = GetModuleHandleA(0); + cls.hIcon = 0; + cls.hCursor = LoadCursorA(0, IDC_ARROW); + cls.hbrBackground = GetStockObject(WHITE_BRUSH); + cls.lpszMenuName = NULL; + cls.lpszClassName = "ParentTestClass"; + if(!RegisterClassA(&cls)) assert(0); + + parent = CreateWindow(cls.lpszClassName, NULL, WS_POPUP|WS_VISIBLE, + 0, 0, 200, 60, NULL, NULL, NULL, NULL); + ok (parent != 0, "Failed to create parent window\n"); + + hwndRichEdit = CreateWindowEx(0, + RICHEDIT_CLASS, NULL, + ES_MULTILINE|WS_VSCROLL|WS_VISIBLE|WS_CHILD, + 0, 0, 200, 60, parent, NULL, + hmoduleRichEdit, NULL); + + setText.codepage = CP_ACP; + setText.flags = ST_SELECTION; + SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, + (LPARAM)"{\\rtf 1\\par 2\\par 3\\par 4\\par 5\\par 6\\par 7\\par 8\\par 9\\par}"); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + GetScrollInfo(hwndRichEdit, SB_VERT, &si); + todo_wine ok(si.nPos == 0, "Position is incorrectly at %d\n", si.nPos); + SendMessage(hwndRichEdit, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == 18, "Selection start incorrectly at %d\n", sel_start); + ok(sel_end == 18, "Selection end incorrectly at %d\n", sel_end); + + DestroyWindow(parent); + + /* Test without a parent window */ + hwndRichEdit = new_richedit(NULL); + setText.codepage = CP_ACP; + setText.flags = ST_SELECTION; + SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, + (LPARAM)"{\\rtf 1\\par 2\\par 3\\par 4\\par 5\\par 6\\par 7\\par 8\\par 9\\par}"); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + GetScrollInfo(hwndRichEdit, SB_VERT, &si); + ok(si.nPos != 0, "Position is incorrectly at %d\n", si.nPos); + SendMessage(hwndRichEdit, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == 18, "Selection start incorrectly at %d\n", sel_start); + ok(sel_end == 18, "Selection end incorrectly at %d\n", sel_end); + + /* The scroll position should also be 0 after EM_SETTEXTEX with ST_DEFAULT, + * but this time it is because the selection is at the beginning. */ + setText.codepage = CP_ACP; + setText.flags = ST_DEFAULT; + SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, + (LPARAM)"{\\rtf 1\\par 2\\par 3\\par 4\\par 5\\par 6\\par 7\\par 8\\par 9\\par}"); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + GetScrollInfo(hwndRichEdit, SB_VERT, &si); + ok(si.nPos == 0, "Position is incorrectly at %d\n", si.nPos); + SendMessage(hwndRichEdit, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end); + ok(sel_start == 0, "Selection start incorrectly at %d\n", sel_start); + ok(sel_end == 0, "Selection end incorrectly at %d\n", sel_end); setText.codepage = 1200; /* no constant for unicode */ getText.codepage = 1200; /* no constant for unicode */ @@ -3562,6 +3634,22 @@ static void test_EM_SETTEXTEX(void) ok(lstrcmpW(buf, TestItem1) == 0, "EM_GETTEXTEX results not what was set by EM_SETTEXTEX\n"); + /* The following test demonstrates that EM_SETTEXTEX treats text as ASCII if it + * starts with ASCII characters "{\rtf" even when the codepage is unicode. */ + setText.codepage = 1200; /* Lie about code page (actual ASCII) */ + getText.codepage = CP_ACP; + getText.cb = MAX_BUF_LEN; + getText.flags = GT_DEFAULT; + getText.lpDefaultChar = NULL; + getText.lpUsedDefChar = NULL; + + setText.flags = ST_SELECTION; + SendMessage(hwndRichEdit, EM_SETSEL, 0, -1); + result = SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, (LPARAM) "{\\rtf not unicode}"); + todo_wine ok(result == 11, "EM_SETTEXTEX incorrectly returned %d\n", result); + SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) bufACP); + ok(lstrcmpA(bufACP, "not unicode") == 0, "'%s' != 'not unicode'\n", bufACP); + /* The following test demonstrates that EM_SETTEXTEX supports RTF strings with a selection */ SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) "TestSomeText"); /* TestItem1 */ p = (char *)buf; @@ -5325,7 +5413,7 @@ static void test_eventMask(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "EventMaskParentClass"; @@ -5415,7 +5503,7 @@ static void test_WM_NOTIFY(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "WM_NOTIFY_ParentClass"; @@ -5851,12 +5939,12 @@ static void test_word_wrap(void) /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); - todo_wine ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); DestroyWindow(hwnd); diff --git a/rostests/winetests/riched20/txtsrv.c b/rostests/winetests/riched20/txtsrv.c index 07145357688..e4d6ae44822 100644 --- a/rostests/winetests/riched20/txtsrv.c +++ b/rostests/winetests/riched20/txtsrv.c @@ -32,6 +32,7 @@ #include #include #include +#include static HMODULE hmoduleRichEdit; @@ -434,12 +435,16 @@ static void WINAPI ITextHostImpl_TxImmReleaseContext(ITextHost *iface, HIMC himc TRACECALL("Call to TxImmReleaseContext(%p, himc=%p)\n", This, himc); } +/* This function must set the variable pointed to by *lSelBarWidth. + Otherwise an uninitalized value will be used to calculate + positions and sizes even if E_NOTIMPL is returned. */ static HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *iface, LONG *lSelBarWidth) { ITextHostTestImpl *This = (ITextHostTestImpl *)iface; TRACECALL("Call to TxGetSelectionBarWidth(%p, lSelBarWidth=%p)\n", This, lSelBarWidth); + *lSelBarWidth = 0; return E_NOTIMPL; } @@ -636,7 +641,7 @@ static void test_TxGetText(void) return; hres = ITextServices_TxGetText(txtserv, &rettext); - todo_wine ok(hres == S_OK, "ITextServices_TxGetText failed\n"); + ok(hres == S_OK, "ITextServices_TxGetText failed\n"); IUnknown_Release(txtserv); CoTaskMemFree(dummyTextHost); @@ -652,20 +657,88 @@ static void test_TxSetText(void) return; hres = ITextServices_TxSetText(txtserv, settext); - todo_wine ok(hres == S_OK, "ITextServices_TxSetText failed\n"); + ok(hres == S_OK, "ITextServices_TxSetText failed\n"); hres = ITextServices_TxGetText(txtserv, &rettext); - todo_wine ok(hres == S_OK, "ITextServices_TxGetText failed\n"); + ok(hres == S_OK, "ITextServices_TxGetText failed\n"); - todo_wine ok(SysStringLen(rettext) == 4, + ok(SysStringLen(rettext) == 4, "String returned of wrong length\n"); - todo_wine ok(memcmp(rettext,settext,SysStringByteLen(rettext)) == 0, + ok(memcmp(rettext,settext,SysStringByteLen(rettext)) == 0, "String returned differs\n"); IUnknown_Release(txtserv); CoTaskMemFree(dummyTextHost); } +static void test_TxGetNaturalSize(void) { + HRESULT result; + BOOL ret; + + /* This value is used when calling TxGetNaturalSize. MSDN says + that this is not supported however a null pointer cannot be + used as it will cause a segmentation violation. The values in + the structure being pointed to are required to be INT_MAX + otherwise calculations can give wrong values. */ + const SIZEL psizelExtent = {INT_MAX,INT_MAX}; + + static const WCHAR oneA[] = {'A',0}; + + /* Results of measurements */ + LONG xdim, ydim; + + /* The device context to do the tests in */ + HDC hdcDraw; + + /* Variables with the text metric information */ + INT charwidth_caps_text[26]; + TEXTMETRIC tmInfo_text; + + if (!init_texthost()) + return; + + hdcDraw = GetDC(NULL); + SaveDC(hdcDraw); + + /* Populate the metric strucs */ + SetMapMode(hdcDraw,MM_TEXT); + GetTextMetrics(hdcDraw, &tmInfo_text); + SetLastError(0xdeadbeef); + ret = GetCharWidth32(hdcDraw,'A','Z',charwidth_caps_text); + if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("GetCharWidth32 is not available\n"); + RestoreDC(hdcDraw,1); + ReleaseDC(NULL,hdcDraw); + return; + } + + /* Make measurements in MM_TEXT */ + SetMapMode(hdcDraw,MM_TEXT); + xdim = 0; ydim = 0; + + result = ITextServices_TxSetText(txtserv, oneA); + ok(result == S_OK, "ITextServices_TxSetText failed\n"); + + result = ITextServices_TxGetNaturalSize(txtserv, DVASPECT_CONTENT, + hdcDraw, NULL, NULL, + TXTNS_FITTOCONTENT, &psizelExtent, + &xdim, &ydim); + todo_wine ok(result == S_OK, "TxGetNaturalSize failed\n"); + todo_wine ok(ydim == tmInfo_text.tmHeight, + "Height calculated incorrectly (expected %d, got %d)\n", + tmInfo_text.tmHeight, ydim); + /* The native DLL adds one pixel extra when calculating widths. */ + todo_wine ok(xdim >= charwidth_caps_text[0] && xdim <= charwidth_caps_text[0] + 1, + "Width calculated incorrectly (expected %d {+1}, got %d)\n", + charwidth_caps_text[0], xdim); + + RestoreDC(hdcDraw,1); + ReleaseDC(NULL,hdcDraw); + + IUnknown_Release(txtserv); + CoTaskMemFree(dummyTextHost); +} + START_TEST( txtsrv ) { setup_thiscall_wrappers(); @@ -682,6 +755,7 @@ START_TEST( txtsrv ) test_TxGetText(); test_TxSetText(); + test_TxGetNaturalSize(); } if (wrapperCodeMem) VirtualFree(wrapperCodeMem, 0, MEM_RELEASE); } diff --git a/rostests/winetests/riched32/editor.c b/rostests/winetests/riched32/editor.c index 63a63f13018..6216001afd1 100644 --- a/rostests/winetests/riched32/editor.c +++ b/rostests/winetests/riched32/editor.c @@ -48,7 +48,7 @@ static HWND new_richedit(HWND parent) { return new_window(RICHEDIT_CLASS10A, ES_MULTILINE, parent); } -static void test_WM_SETTEXT() +static void test_WM_SETTEXT(void) { HWND hwndRichEdit = new_richedit(NULL); const char * TestItem1 = "TestSomeText"; @@ -71,23 +71,21 @@ static void test_WM_SETTEXT() LRESULT result; /* This test attempts to show that WM_SETTEXT on a riched32 control does not - attempt to modify the text that is pasted into the control, and should - return it as is. In particular, \r\r\n is NOT converted, unlike riched20. - Currently, builtin riched32 mangles solitary \r or \n when not part of - a \r\n pair. - - For riched32, the rules for breaking lines seem to be the following: - - \r\n is one line break. This is the normal case. - - \r{0,N}\n is one line break. In particular, \n by itself is a line break. - - \n{1,N} are that many line breaks. - - \r with text or other characters (except \n) past it, is a line break. That - is, a run of \r{N} without a terminating \n is considered N line breaks - - \r at the end of the text is NOT a line break. This differs from riched20, - where \r at the end of the text is a proper line break. This causes - TestItem2 to fail its test. + * attempt to modify the text that is pasted into the control, and should + * return it as is. In particular, \r\r\n is NOT converted, unlike riched20. + * + * For riched32, the rules for breaking lines seem to be the following: + * - \r\n is one line break. This is the normal case. + * - \r{0,2}\n is one line break. In particular, \n by itself is a line break. + * - \r{0,N-1}\r\r\n is N line breaks. + * - \n{1,N} are that many line breaks. + * - \r with text or other characters (except \n) past it, is a line break. That + * is, a run of \r{N} without a terminating \n is considered N line breaks + * - \r at the end of the text is NOT a line break. This differs from riched20, + * where \r at the end of the text is a proper line break. */ -#define TEST_SETTEXT(a, b, nlines, is_todo, is_todo2) \ +#define TEST_SETTEXT(a, b, nlines) \ result = SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) a); \ ok (result == 1, "WM_SETTEXT returned %ld instead of 1\n", result); \ result = SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buf); \ @@ -95,36 +93,27 @@ static void test_WM_SETTEXT() "WM_GETTEXT returned %ld instead of expected %u\n", \ result, lstrlen(buf)); \ result = strcmp(b, buf); \ - if (is_todo) todo_wine { \ ok(result == 0, \ "WM_SETTEXT round trip: strcmp = %ld\n", result); \ - } else { \ - ok(result == 0, \ - "WM_SETTEXT round trip: strcmp = %ld\n", result); \ - } \ result = SendMessage(hwndRichEdit, EM_GETLINECOUNT, 0, 0); \ - if (is_todo2) todo_wine { \ - ok(result == nlines, "EM_GETLINECOUNT returned %ld, expected %d\n", result, nlines); \ - } else { \ - ok(result == nlines, "EM_GETLINECOUNT returned %ld, expected %d\n", result, nlines); \ - } + ok(result == nlines, "EM_GETLINECOUNT returned %ld, expected %d\n", result, nlines); - TEST_SETTEXT(TestItem1, TestItem1, 1, 0, 0) - TEST_SETTEXT(TestItem2, TestItem2, 1, 0, 0) - TEST_SETTEXT(TestItem3, TestItem3, 2, 0, 0) - TEST_SETTEXT(TestItem4, TestItem4, 3, 0, 0) - TEST_SETTEXT(TestItem5, TestItem5, 2, 0, 0) - TEST_SETTEXT(TestItem6, TestItem6, 3, 0, 0) - TEST_SETTEXT(TestItem7, TestItem7, 4, 0, 0) - TEST_SETTEXT(TestItem8, TestItem8, 2, 0, 0) - TEST_SETTEXT(TestItem9, TestItem9, 3, 0, 0) - TEST_SETTEXT(TestItem10, TestItem10, 3, 0, 0) - TEST_SETTEXT(TestItem11, TestItem11, 1, 0, 0) - TEST_SETTEXT(TestItem12, TestItem12, 2, 0, 0) - TEST_SETTEXT(TestItem13, TestItem13, 3, 0, 0) - TEST_SETTEXT(TestItem14, TestItem14, 2, 0, 0) - TEST_SETTEXT(TestItem15, TestItem15, 3, 0, 0) - TEST_SETTEXT(TestItem16, TestItem16, 4, 0, 0) + TEST_SETTEXT(TestItem1, TestItem1, 1) + TEST_SETTEXT(TestItem2, TestItem2, 1) + TEST_SETTEXT(TestItem3, TestItem3, 2) + TEST_SETTEXT(TestItem4, TestItem4, 3) + TEST_SETTEXT(TestItem5, TestItem5, 2) + TEST_SETTEXT(TestItem6, TestItem6, 3) + TEST_SETTEXT(TestItem7, TestItem7, 4) + TEST_SETTEXT(TestItem8, TestItem8, 2) + TEST_SETTEXT(TestItem9, TestItem9, 3) + TEST_SETTEXT(TestItem10, TestItem10, 3) + TEST_SETTEXT(TestItem11, TestItem11, 1) + TEST_SETTEXT(TestItem12, TestItem12, 2) + TEST_SETTEXT(TestItem13, TestItem13, 3) + TEST_SETTEXT(TestItem14, TestItem14, 2) + TEST_SETTEXT(TestItem15, TestItem15, 3) + TEST_SETTEXT(TestItem16, TestItem16, 4) #undef TEST_SETTEXT DestroyWindow(hwndRichEdit); @@ -184,18 +173,18 @@ static void test_EM_STREAMIN(void) const char * streamText0b = "{\\rtf1 TestSomeText\\par\\par}"; const char * streamText1 = - "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang12298{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 System;}}\r\n" \ - "\\viewkind4\\uc1\\pard\\f0\\fs17 TestSomeText\\par\r\n" \ + "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang12298{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 System;}}\r\n" + "\\viewkind4\\uc1\\pard\\f0\\fs17 TestSomeText\\par\r\n" "}\r\n"; /* This should be accepted in richedit 1.0 emulation. See bug #8326 */ const char * streamText2 = - "{{\\colortbl;\\red0\\green255\\blue102;\\red255\\green255\\blue255;" \ - "\\red170\\green255\\blue255;\\red255\\green238\\blue0;\\red51\\green255" \ - "\\blue221;\\red238\\green238\\blue238;}\\tx0 \\tx424 \\tx848 \\tx1272 " \ - "\\tx1696 \\tx2120 \\tx2544 \\tx2968 \\tx3392 \\tx3816 \\tx4240 \\tx4664 " \ - "\\tx5088 \\tx5512 \\tx5936 \\tx6360 \\tx6784 \\tx7208 \\tx7632 \\tx8056 " \ - "\\tx8480 \\tx8904 \\tx9328 \\tx9752 \\tx10176 \\tx10600 \\tx11024 " \ + "{{\\colortbl;\\red0\\green255\\blue102;\\red255\\green255\\blue255;" + "\\red170\\green255\\blue255;\\red255\\green238\\blue0;\\red51\\green255" + "\\blue221;\\red238\\green238\\blue238;}\\tx0 \\tx424 \\tx848 \\tx1272 " + "\\tx1696 \\tx2120 \\tx2544 \\tx2968 \\tx3392 \\tx3816 \\tx4240 \\tx4664 " + "\\tx5088 \\tx5512 \\tx5936 \\tx6360 \\tx6784 \\tx7208 \\tx7632 \\tx8056 " + "\\tx8480 \\tx8904 \\tx9328 \\tx9752 \\tx10176 \\tx10600 \\tx11024 " "\\tx11448 \\tx11872 \\tx12296 \\tx12720 \\tx13144 \\cf2 RichEdit1\\line }"; const char * streamText3 = "RichEdit1"; @@ -365,17 +354,17 @@ static const struct getline_s { int line; size_t buffer_len; const char *text; - int wine_todo; } gl[] = { - {0, 10, "foo bar\r\n", 0}, - {1, 10, "\n", 0}, - {2, 10, "bar\n", 0}, - {3, 10, "\r\n", 0}, + {0, 10, "foo bar\r\n"}, + {1, 10, "\r"}, + {2, 10, "\r\r\n"}, + {3, 10, "bar\n"}, + {4, 10, "\r\n"}, /* Buffer smaller than line length */ - {0, 2, "foo bar\r", 0}, - {0, 1, "foo bar\r", 0}, - {0, 0, "foo bar\r", 0} + {0, 2, "foo bar\r"}, + {0, 1, "foo bar\r"}, + {0, 0, "foo bar\r"} }; static void test_EM_GETLINE(void) @@ -385,7 +374,8 @@ static void test_EM_GETLINE(void) static const int nBuf = 1024; char dest[1024], origdest[1024]; const char text[] = "foo bar\r\n" - "\n" + "\r" + "\r\r\n" "bar\n"; SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text); @@ -402,10 +392,6 @@ static void test_EM_GETLINE(void) /* EM_GETLINE appends a "\r\0" to the end of the line * nCopied counts up to and including the '\r' */ nCopied = SendMessage(hwndRichEdit, EM_GETLINE, gl[i].line, (LPARAM) dest); - if (gl[i].wine_todo) todo_wine { - ok(nCopied == expected_nCopied, "%d: %d!=%d\n", i, nCopied, - expected_nCopied); - } else ok(nCopied == expected_nCopied, "%d: %d!=%d\n", i, nCopied, expected_nCopied); /* two special cases since a parameter is passed via dest */ @@ -417,21 +403,11 @@ static void test_EM_GETLINE(void) !strncmp(dest+2, origdest+2, nBuf-2), "buffer_len=1\n"); else { - if (gl[i].wine_todo) todo_wine { ok(!strncmp(dest, gl[i].text, expected_bytes_written), "%d: expected_bytes_written=%d\n", i, expected_bytes_written); ok(!strncmp(dest + expected_bytes_written, origdest + expected_bytes_written, nBuf - expected_bytes_written), "%d: expected_bytes_written=%d\n", i, expected_bytes_written); - } - else - { - ok(!strncmp(dest, gl[i].text, expected_bytes_written), - "%d: expected_bytes_written=%d\n", i, expected_bytes_written); - ok(!strncmp(dest + expected_bytes_written, origdest - + expected_bytes_written, nBuf - expected_bytes_written), - "%d: expected_bytes_written=%d\n", i, expected_bytes_written); - } } } @@ -445,28 +421,45 @@ static void test_EM_LINELENGTH(void) "richedit1\r" "richedit1\n" "richedit1\r\n" - "richedit1\r\r\r\r\r\n"; - int offset_test[10][2] = { - {0, 9}, - {5, 9}, - {10, 9}, - {15, 9}, - {20, 9}, - {25, 9}, - {30, 9}, - {35, 9}, - {40, 9}, /* <----- in the middle of the \r run, but run not counted */ - {45, 0}, + "short\r" + "richedit1\r" + "\r" + "\r" + "\r\r\n"; + int offset_test[16][2] = { + {0, 9}, /* Line 1: |richedit1\r */ + {5, 9}, /* Line 1: riche|dit1\r */ + {10, 9}, /* Line 2: |richedit1\n */ + {15, 9}, /* Line 2: riche|dit1\n */ + {20, 9}, /* Line 3: |richedit1\r\n */ + {25, 9}, /* Line 3: riche|dit1\r\n */ + {30, 9}, /* Line 3: richedit1\r|\n */ + {31, 5}, /* Line 4: |short\r */ + {42, 9}, /* Line 5: riche|dit1\r */ + {46, 9}, /* Line 5: richedit1|\r */ + {47, 0}, /* Line 6: |\r */ + {48, 0}, /* Line 7: |\r */ + {49, 0}, /* Line 8: |\r\r\n */ + {50, 0}, /* Line 8: \r|\r\n */ + {51, 0}, /* Line 8: \r\r|\n */ + {52, 0}, /* Line 9: \r\r\n| */ }; int i; LRESULT result; SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text); - for (i = 0; i < 10; i++) { + result = SendMessage(hwndRichEdit, EM_GETLINECOUNT, 0, 0); + if (result == 4) { + win_skip("Win9x, WinME and NT4 don't handle '\\r only' correctly\n"); + return; + } + ok(result == 9, "Incorrect line count of %ld\n", result); + + for (i = 0; i < sizeof(offset_test)/sizeof(offset_test[0]); i++) { result = SendMessage(hwndRichEdit, EM_LINELENGTH, offset_test[i][0], 0); ok(result == offset_test[i][1], "Length of line at offset %d is %ld, expected %d\n", - offset_test[i][0], result, offset_test[i][1]); + offset_test[i][0], result, offset_test[i][1]); } DestroyWindow(hwndRichEdit); @@ -476,9 +469,10 @@ static void test_EM_GETTEXTRANGE(void) { HWND hwndRichEdit = new_richedit(NULL); const char * text1 = "foo bar\r\nfoo bar"; - const char * text2 = "foo bar\rfoo bar"; + const char * text3 = "foo bar\rfoo bar"; const char * expect1 = "bar\r\nfoo"; - const char * expect2 = "bar\rfoo"; + const char * expect2 = "\nfoo"; + const char * expect3 = "bar\rfoo"; char buffer[1024] = {0}; LRESULT result; TEXTRANGEA textRange; @@ -492,7 +486,14 @@ static void test_EM_GETTEXTRANGE(void) ok(result == 8, "EM_GETTEXTRANGE returned %ld\n", result); ok(!strcmp(expect1, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); - SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text2); + textRange.lpstrText = buffer; + textRange.chrg.cpMin = 8; + textRange.chrg.cpMax = 12; + result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); + ok(result == 4, "EM_GETTEXTRANGE returned %ld\n", result); + ok(!strcmp(expect2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + + SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)text3); textRange.lpstrText = buffer; textRange.chrg.cpMin = 4; @@ -500,7 +501,7 @@ static void test_EM_GETTEXTRANGE(void) result = SendMessage(hwndRichEdit, EM_GETTEXTRANGE, 0, (LPARAM)&textRange); ok(result == 7, "EM_GETTEXTRANGE returned %ld\n", result); - ok(!strcmp(expect2, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); + ok(!strcmp(expect3, buffer), "EM_GETTEXTRANGE filled %s\n", buffer); DestroyWindow(hwndRichEdit); @@ -538,90 +539,98 @@ static void test_EM_GETSELTEXT(void) static const char haystack[] = "WINEWine wineWine wine WineWine"; /* ^0 ^10 ^20 ^30 */ +static const char haystack2[] = "first\r\r\nsecond"; + struct find_s { int start; int end; const char *needle; int flags; int expected_loc; - int _todo_wine; }; struct find_s find_tests[] = { /* Find in empty text */ - {0, -1, "foo", FR_DOWN, -1, 0}, - {0, -1, "foo", 0, -1, 0}, - {0, -1, "", FR_DOWN, -1, 0}, - {20, 5, "foo", FR_DOWN, -1, 0}, - {5, 20, "foo", FR_DOWN, -1, 0} + {0, -1, "foo", FR_DOWN, -1}, + {0, -1, "foo", 0, -1}, + {0, -1, "", FR_DOWN, -1}, + {20, 5, "foo", FR_DOWN, -1}, + {5, 20, "foo", FR_DOWN, -1} }; struct find_s find_tests2[] = { /* No-result find */ - {0, -1, "foo", FR_DOWN | FR_MATCHCASE, -1, 0}, - {5, 20, "WINE", FR_DOWN | FR_MATCHCASE, -1, 0}, + {0, -1, "foo", FR_DOWN | FR_MATCHCASE, -1}, + {5, 20, "WINE", FR_DOWN | FR_MATCHCASE, -1}, /* Subsequent finds */ - {0, -1, "Wine", FR_DOWN | FR_MATCHCASE, 4, 0}, - {5, 31, "Wine", FR_DOWN | FR_MATCHCASE, 13, 0}, - {14, 31, "Wine", FR_DOWN | FR_MATCHCASE, 23, 0}, - {24, 31, "Wine", FR_DOWN | FR_MATCHCASE, 27, 0}, + {0, -1, "Wine", FR_DOWN | FR_MATCHCASE, 4}, + {5, 31, "Wine", FR_DOWN | FR_MATCHCASE, 13}, + {14, 31, "Wine", FR_DOWN | FR_MATCHCASE, 23}, + {24, 31, "Wine", FR_DOWN | FR_MATCHCASE, 27}, /* Find backwards */ - {19, 20, "Wine", FR_MATCHCASE, -1, 0}, - {10, 20, "Wine", FR_MATCHCASE, 13, 0}, - {20, 10, "Wine", FR_MATCHCASE, -1, 0}, + {19, 20, "Wine", FR_MATCHCASE, -1}, + {10, 20, "Wine", FR_MATCHCASE, 13}, + {20, 10, "Wine", FR_MATCHCASE, -1}, /* Case-insensitive */ - {1, 31, "wInE", FR_DOWN, 4, 0}, - {1, 31, "Wine", FR_DOWN, 4, 0}, + {1, 31, "wInE", FR_DOWN, 4}, + {1, 31, "Wine", FR_DOWN, 4}, /* High-to-low ranges */ - {20, 5, "Wine", FR_DOWN, -1, 0}, - {2, 1, "Wine", FR_DOWN, -1, 0}, - {30, 29, "Wine", FR_DOWN, -1, 0}, - {20, 5, "Wine", 0, /*13*/ -1, 0}, + {20, 5, "Wine", FR_DOWN, -1}, + {2, 1, "Wine", FR_DOWN, -1}, + {30, 29, "Wine", FR_DOWN, -1}, + {20, 5, "Wine", 0, /*13*/ -1}, /* Find nothing */ - {5, 10, "", FR_DOWN, -1, 0}, - {10, 5, "", FR_DOWN, -1, 0}, - {0, -1, "", FR_DOWN, -1, 0}, - {10, 5, "", 0, -1, 0}, + {5, 10, "", FR_DOWN, -1}, + {10, 5, "", FR_DOWN, -1}, + {0, -1, "", FR_DOWN, -1}, + {10, 5, "", 0, -1}, /* Whole-word search */ - {0, -1, "wine", FR_DOWN | FR_WHOLEWORD, 18, 0}, - {0, -1, "win", FR_DOWN | FR_WHOLEWORD, -1, 0}, - {13, -1, "wine", FR_DOWN | FR_WHOLEWORD, 18, 0}, - {0, -1, "winewine", FR_DOWN | FR_WHOLEWORD, 0, 0}, - {10, -1, "winewine", FR_DOWN | FR_WHOLEWORD, 23, 0}, - {11, -1, "winewine", FR_WHOLEWORD, 23, 0}, - {31, -1, "winewine", FR_WHOLEWORD, -1, 0}, + {0, -1, "wine", FR_DOWN | FR_WHOLEWORD, 18}, + {0, -1, "win", FR_DOWN | FR_WHOLEWORD, -1}, + {13, -1, "wine", FR_DOWN | FR_WHOLEWORD, 18}, + {0, -1, "winewine", FR_DOWN | FR_WHOLEWORD, 0}, + {10, -1, "winewine", FR_DOWN | FR_WHOLEWORD, 23}, + {11, -1, "winewine", FR_WHOLEWORD, 23}, + {31, -1, "winewine", FR_WHOLEWORD, -1}, /* Bad ranges */ - {5, 200, "XXX", FR_DOWN, -1, 0}, - {-20, 20, "Wine", FR_DOWN, -1, 0}, - {-20, 20, "Wine", FR_DOWN, -1, 0}, - {-15, -20, "Wine", FR_DOWN, -1, 0}, - {1<<12, 1<<13, "Wine", FR_DOWN, -1, 0}, + {5, 200, "XXX", FR_DOWN, -1}, + {-20, 20, "Wine", FR_DOWN, -1}, + {-20, 20, "Wine", FR_DOWN, -1}, + {-15, -20, "Wine", FR_DOWN, -1}, + {1<<12, 1<<13, "Wine", FR_DOWN, -1}, /* Check the case noted in bug 4479 where matches at end aren't recognized */ - {23, 31, "Wine", FR_DOWN | FR_MATCHCASE, 23, 0}, - {27, 31, "Wine", FR_DOWN | FR_MATCHCASE, 27, 0}, - {27, 32, "Wine", FR_DOWN | FR_MATCHCASE, 27, 0}, - {13, 31, "WineWine", FR_DOWN | FR_MATCHCASE, 23, 0}, - {13, 32, "WineWine", FR_DOWN | FR_MATCHCASE, 23, 0}, + {23, 31, "Wine", FR_DOWN | FR_MATCHCASE, 23}, + {27, 31, "Wine", FR_DOWN | FR_MATCHCASE, 27}, + {27, 32, "Wine", FR_DOWN | FR_MATCHCASE, 27}, + {13, 31, "WineWine", FR_DOWN | FR_MATCHCASE, 23}, + {13, 32, "WineWine", FR_DOWN | FR_MATCHCASE, 23}, /* The backwards case of bug 4479; bounds look right * Fails because backward find is wrong */ - {19, 20, "WINE", FR_MATCHCASE, -1, 0}, - {0, 20, "WINE", FR_MATCHCASE, 0, 0}, + {19, 20, "WINE", FR_MATCHCASE, -1}, + {0, 20, "WINE", FR_MATCHCASE, 0}, - {0, -1, "wineWine wine", FR_DOWN, 0, 0}, - {0, -1, "wineWine wine", 0, 0, 0}, - {0, -1, "INEW", 0, 1, 0}, - {0, 31, "INEW", 0, 1, 0}, - {4, -1, "INEW", 0, 10, 0}, + {0, -1, "wineWine wine", FR_DOWN, 0}, + {0, -1, "wineWine wine", 0, 0}, + {0, -1, "INEW", 0, 1}, + {0, 31, "INEW", 0, 1}, + {4, -1, "INEW", 0, 10}, +}; + +struct find_s find_tests3[] = { + /* Searching for end of line characters */ + {0, -1, "t\r\r\ns", FR_DOWN | FR_MATCHCASE, 4}, + {6, -1, "\r\n", FR_DOWN | FR_MATCHCASE, 6}, + {7, -1, "\n", FR_DOWN | FR_MATCHCASE, 7}, }; static void check_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *f, int id) { @@ -667,15 +676,8 @@ static void run_tests_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *fi int i; for (i = 0; i < num_tests; i++) { - if (find[i]._todo_wine) { - todo_wine { - check_EM_FINDTEXT(hwnd, name, &find[i], i); - check_EM_FINDTEXTEX(hwnd, name, &find[i], i); - } - } else { - check_EM_FINDTEXT(hwnd, name, &find[i], i); - check_EM_FINDTEXTEX(hwnd, name, &find[i], i); - } + check_EM_FINDTEXT(hwnd, name, &find[i], i); + check_EM_FINDTEXTEX(hwnd, name, &find[i], i); } } @@ -693,6 +695,12 @@ static void test_EM_FINDTEXT(void) run_tests_EM_FINDTEXT(hwndRichEdit, "2", find_tests2, sizeof(find_tests2)/sizeof(struct find_s)); + SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) haystack2); + + /* Haystack text 2 (with EOL characters) */ + run_tests_EM_FINDTEXT(hwndRichEdit, "3", find_tests3, + sizeof(find_tests3)/sizeof(struct find_s)); + DestroyWindow(hwndRichEdit); } @@ -742,9 +750,7 @@ static void test_EM_POSFROMCHAR(void) if (i == 0) { ok(pl.y == 0, "EM_POSFROMCHAR reports y=%d, expected 0\n", pl.y); - todo_wine { ok(pl.x == 1, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x); - } xpos = pl.x; } else if (i == 1) @@ -805,9 +811,7 @@ static void test_EM_POSFROMCHAR(void) result = SendMessage(hwndRichEdit, EM_POSFROMCHAR, (WPARAM)&pl, 0); ok(result == 0, "EM_POSFROMCHAR returned %ld, expected 0\n", result); ok(pl.y == 0, "EM_POSFROMCHAR reports y=%d, expected 0\n", pl.y); - todo_wine { ok(pl.x == 1, "EM_POSFROMCHAR reports x=%d, expected 1\n", pl.x); - } xpos = pl.x; SendMessage(hwndRichEdit, WM_HSCROLL, SB_LINERIGHT, 0); @@ -821,6 +825,163 @@ static void test_EM_POSFROMCHAR(void) DestroyWindow(hwndRichEdit); } +static void test_word_wrap(void) +{ + HWND hwnd; + POINTL point = {0, 60}; /* This point must be below the first line */ + const char *text = "Must be long enough to test line wrapping"; + DWORD dwCommonStyle = WS_VISIBLE|WS_POPUP|WS_VSCROLL|ES_MULTILINE; + int res, pos, lines; + + /* Test the effect of WS_HSCROLL and ES_AUTOHSCROLL styles on wrapping + * when specified on window creation and set later. */ + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, dwCommonStyle, + 0, 0, 200, 80, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); + res = SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) text); + ok(res, "WM_SETTEXT failed.\n"); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines > 1, "Line was expected to wrap (lines=%d).\n", lines); + + SetWindowLong(hwnd, GWL_STYLE, dwCommonStyle|WS_HSCROLL|ES_AUTOHSCROLL); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); + DestroyWindow(hwnd); + + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, dwCommonStyle|WS_HSCROLL, + 0, 0, 200, 80, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); + + res = SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) text); + ok(res, "WM_SETTEXT failed.\n"); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines > 1, "Line was expected to wrap (lines=%d).\n", lines); + + SetWindowLong(hwnd, GWL_STYLE, dwCommonStyle|WS_HSCROLL|ES_AUTOHSCROLL); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); + DestroyWindow(hwnd); + + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, dwCommonStyle|ES_AUTOHSCROLL, + 0, 0, 200, 80, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); + res = SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) text); + ok(res, "WM_SETTEXT failed.\n"); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + + SetWindowLong(hwnd, GWL_STYLE, dwCommonStyle); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + DestroyWindow(hwnd); + + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, + dwCommonStyle|WS_HSCROLL|ES_AUTOHSCROLL, + 0, 0, 200, 80, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); + res = SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) text); + ok(res, "WM_SETTEXT failed.\n"); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + + SetWindowLong(hwnd, GWL_STYLE, dwCommonStyle); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + + /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ + res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + + res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); + ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); + pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); + ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); + DestroyWindow(hwnd); + + /* Test to see if wrapping happens with redraw disabled. */ + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, dwCommonStyle, + 0, 0, 400, 80, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); + /* redraw is disabled by making the window invisible. */ + ok(!IsWindowVisible(hwnd), "Window shouldn't be visible.\n"); + res = SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) text); + ok(res, "EM_REPLACESEL failed.\n"); + MoveWindow(hwnd, 0, 0, 100, 80, TRUE); + SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); + /* Wrapping didn't happen while redraw was disabled. */ + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + todo_wine ok(lines == 1, "Line wasn't expected to wrap (lines=%d).\n", lines); + /* There isn't even a rewrap from resizing the window. */ + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + todo_wine ok(lines == 1, "Line wasn't expected to wrap (lines=%d).\n", lines); + res = SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) text); + ok(res, "EM_REPLACESEL failed.\n"); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines > 1, "Line was expected to wrap (lines=%d).\n", lines); + + DestroyWindow(hwnd); +} + +static void test_EM_GETOPTIONS(void) +{ + HWND hwnd; + DWORD options; + + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, + WS_POPUP, + 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); + options = SendMessage(hwnd, EM_GETOPTIONS, 0, 0); + ok(options == 0, "Incorrect options %x\n", options); + DestroyWindow(hwnd); + + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, + WS_POPUP|WS_VSCROLL|WS_HSCROLL, + 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); + options = SendMessage(hwnd, EM_GETOPTIONS, 0, 0); + ok(options == ECO_AUTOVSCROLL, + "Incorrect initial options %x\n", options); + DestroyWindow(hwnd); +} + +static void test_autoscroll(void) +{ + HWND hwnd; + UINT ret; + + /* The WS_VSCROLL and WS_HSCROLL styles implicitly set + * auto vertical/horizontal scrolling options. */ + hwnd = CreateWindowEx(0, RICHEDIT_CLASS10A, NULL, + WS_POPUP|ES_MULTILINE|WS_VSCROLL|WS_HSCROLL, + 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "class: %s, error: %d\n", RICHEDIT_CLASS, (int) GetLastError()); + ret = SendMessage(hwnd, EM_GETOPTIONS, 0, 0); + ok(ret & ECO_AUTOVSCROLL, "ECO_AUTOVSCROLL isn't set.\n"); + ok(!(ret & ECO_AUTOHSCROLL), "ECO_AUTOHSCROLL is set.\n"); + ret = GetWindowLong(hwnd, GWL_STYLE); + todo_wine ok(ret & ES_AUTOVSCROLL, "ES_AUTOVSCROLL isn't set.\n"); + ok(!(ret & ES_AUTOHSCROLL), "ES_AUTOHSCROLL is set.\n"); + DestroyWindow(hwnd); + + hwnd = CreateWindowEx(0, RICHEDIT_CLASS, NULL, + WS_POPUP|ES_MULTILINE, + 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "class: %s, error: %d\n", RICHEDIT_CLASS, (int) GetLastError()); + ret = SendMessage(hwnd, EM_GETOPTIONS, 0, 0); + ok(!(ret & ECO_AUTOVSCROLL), "ECO_AUTOVSCROLL is set.\n"); + ok(!(ret & ECO_AUTOHSCROLL), "ECO_AUTOHSCROLL is set.\n"); + ret = GetWindowLong(hwnd, GWL_STYLE); + ok(!(ret & ES_AUTOVSCROLL), "ES_AUTOVSCROLL is set.\n"); + ok(!(ret & ES_AUTOHSCROLL), "ES_AUTOHSCROLL is set.\n"); + DestroyWindow(hwnd); +} START_TEST( editor ) { @@ -842,6 +1003,9 @@ START_TEST( editor ) test_EM_LINELENGTH(); test_EM_FINDTEXT(); test_EM_POSFROMCHAR(); + test_word_wrap(); + test_EM_GETOPTIONS(); + test_autoscroll(); /* Set the environment variable WINETEST_RICHED32 to keep windows * responsive and open for 30 seconds. This is useful for debugging. diff --git a/rostests/winetests/rsaenh/rsaenh.c b/rostests/winetests/rsaenh/rsaenh.c index 60e8789475e..8e12b2a7d3e 100644 --- a/rostests/winetests/rsaenh/rsaenh.c +++ b/rostests/winetests/rsaenh/rsaenh.c @@ -112,7 +112,7 @@ static void trace_hex(BYTE *pbData, DWORD dwLen) { } */ -static int init_base_environment(void) +static int init_base_environment(DWORD dwKeyFlags) { HCRYPTKEY hKey; BOOL result; @@ -132,10 +132,10 @@ static int init_base_environment(void) CRYPT_NEWKEYSET); ok(result, "%08x\n", GetLastError()); if (!result) return 0; - result = CryptGenKey(hProv, AT_KEYEXCHANGE, 0, &hKey); + result = CryptGenKey(hProv, AT_KEYEXCHANGE, dwKeyFlags, &hKey); ok(result, "%08x\n", GetLastError()); if (result) CryptDestroyKey(hKey); - result = CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey); + result = CryptGenKey(hProv, AT_SIGNATURE, dwKeyFlags, &hKey); ok(result, "%08x\n", GetLastError()); if (result) CryptDestroyKey(hKey); } @@ -788,6 +788,16 @@ static void test_rc2(void) result = CryptGetKeyParam(hKey, KP_MODE_BITS, (BYTE*)&dwModeBits, &dwLen, 0); ok(result, "%08x\n", GetLastError()); + dwModeBits = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hKey, KP_PERMISSIONS, (BYTE*)&dwModeBits, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwModeBits == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwModeBits == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwModeBits); + dwLen = sizeof(DWORD); result = CryptGetKeyParam(hKey, KP_PERMISSIONS, (BYTE*)&dwModeBits, &dwLen, 0); ok(result, "%08x\n", GetLastError()); @@ -1177,7 +1187,7 @@ static BYTE abPlainPrivateKey[596] = { static void test_import_private(void) { - DWORD dwLen; + DWORD dwLen, dwVal; HCRYPTKEY hKeyExchangeKey, hSessionKey; BOOL result; static BYTE abSessionKey[148] = { @@ -1218,6 +1228,16 @@ static void test_import_private(void) ok(result, "%08x\n", GetLastError()); if (!result) return; + dwVal = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hSessionKey, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); + dwLen = (DWORD)sizeof(abEncryptedMessage); result = CryptDecrypt(hSessionKey, 0, TRUE, 0, abEncryptedMessage, &dwLen); ok(result && dwLen == 12 && !memcmp(abEncryptedMessage, "Wine rocks!",12), @@ -1522,7 +1542,7 @@ static void test_rsa_encrypt(void) HCRYPTKEY hRSAKey; BYTE abData[2048] = "Wine rocks!"; BOOL result; - DWORD dwLen; + DWORD dwVal, dwLen; /* It is allowed to use the key exchange key for encryption/decryption */ result = CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hRSAKey); @@ -1541,6 +1561,33 @@ static void test_rsa_encrypt(void) result = CryptDecrypt(hRSAKey, 0, TRUE, 0, abData, &dwLen); ok (result && dwLen == 12 && !memcmp(abData, "Wine rocks!", 12), "%08x\n", GetLastError()); + dwVal = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hRSAKey, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); + + /* The key exchange key's public key may be exported.. */ + result = CryptExportKey(hRSAKey, 0, PUBLICKEYBLOB, 0, NULL, &dwLen); + ok(result, "%08x\n", GetLastError()); + /* but its private key may not be. */ + SetLastError(0xdeadbeef); + result = CryptExportKey(hRSAKey, 0, PRIVATEKEYBLOB, 0, NULL, &dwLen); + ok((!result && GetLastError() == NTE_BAD_KEY_STATE) || + broken(result), /* Win9x/NT4 */ + "expected NTE_BAD_KEY_STATE, got %08x\n", GetLastError()); + /* Setting the permissions of the key exchange key isn't allowed, either. */ + dwVal |= CRYPT_EXPORT; + SetLastError(0xdeadbeef); + result = CryptSetKeyParam(hRSAKey, KP_PERMISSIONS, (BYTE *)&dwVal, 0); + ok(!result && + (GetLastError() == NTE_BAD_DATA || GetLastError() == NTE_BAD_FLAGS), + "expected NTE_BAD_DATA or NTE_BAD_FLAGS, got %08x\n", GetLastError()); + CryptDestroyKey(hRSAKey); /* It is not allowed to use the signature key for encryption/decryption */ @@ -1548,6 +1595,33 @@ static void test_rsa_encrypt(void) ok (result, "%08x\n", GetLastError()); if (!result) return; + dwVal = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hRSAKey, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); + + /* The signature key's public key may also be exported.. */ + result = CryptExportKey(hRSAKey, 0, PUBLICKEYBLOB, 0, NULL, &dwLen); + ok(result, "%08x\n", GetLastError()); + /* but its private key may not be. */ + SetLastError(0xdeadbeef); + result = CryptExportKey(hRSAKey, 0, PRIVATEKEYBLOB, 0, NULL, &dwLen); + ok((!result && GetLastError() == NTE_BAD_KEY_STATE) || + broken(result), /* Win9x/NT4 */ + "expected NTE_BAD_KEY_STATE, got %08x\n", GetLastError()); + /* Setting the permissions of the signature key isn't allowed, either. */ + dwVal |= CRYPT_EXPORT; + SetLastError(0xdeadbeef); + result = CryptSetKeyParam(hRSAKey, KP_PERMISSIONS, (BYTE *)&dwVal, 0); + ok(!result && + (GetLastError() == NTE_BAD_DATA || GetLastError() == NTE_BAD_FLAGS), + "expected NTE_BAD_DATA or NTE_BAD_FLAGS, got %08x\n", GetLastError()); + dwLen = 12; result = CryptEncrypt(hRSAKey, 0, TRUE, 0, abData, &dwLen, (DWORD)sizeof(abData)); ok (!result && GetLastError() == NTE_BAD_KEY, "%08x\n", GetLastError()); @@ -1557,7 +1631,7 @@ static void test_rsa_encrypt(void) static void test_import_export(void) { - DWORD dwLen, dwDataLen; + DWORD dwLen, dwDataLen, dwVal; HCRYPTKEY hPublicKey; BOOL result; ALG_ID algID; @@ -1585,6 +1659,15 @@ static void test_import_export(void) ok(result, "failed to get the KP_ALGID from the imported public key\n"); ok(algID == CALG_RSA_KEYX, "Expected CALG_RSA_KEYX, got %x\n", algID); + dwVal = 0xdeadbeef; + dwDataLen = sizeof(DWORD); + result = CryptGetKeyParam(hPublicKey, KP_PERMISSIONS, (BYTE*)&dwVal, &dwDataLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); result = CryptExportKey(hPublicKey, 0, PUBLICKEYBLOB, 0, emptyKey, &dwLen); ok(result, "failed to export the fresh imported public key\n"); ok(dwLen == 84, "Expected exported key to be 84 bytes long but got %d bytes.\n",dwLen); @@ -1950,8 +2033,12 @@ static void test_null_provider(void) uniquecontainer(container); todo_wine { - ok(dataLen == strlen(container)+1, "Expected a param length of 70, got %d\n", dataLen); - ok(!strcmp(container, szName), "Wrong container name : %s\n", szName); + ok(dataLen == strlen(container)+1 || + broken(dataLen == strlen(szContainer)+1) /* WinME */, + "Expected a param length of 70, got %d\n", dataLen); + ok(!strcmp(container, szName) || + broken(!strcmp(szName, szContainer)) /* WinME */, + "Wrong container name : %s\n", szName); } } result = CryptGetUserKey(prov, AT_KEYEXCHANGE, &key); @@ -2041,9 +2128,144 @@ static void test_null_provider(void) } +static void test_key_permissions(void) +{ + HCRYPTKEY hKey1, hKey2; + DWORD dwVal, dwLen; + BOOL result; + + /* Create keys that are exportable */ + if (!init_base_environment(CRYPT_EXPORTABLE)) + return; + + result = CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKey1); + ok (result, "%08x\n", GetLastError()); + if (!result) return; + + dwVal = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hKey1, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); + + /* The key exchange key's public key may be exported.. */ + result = CryptExportKey(hKey1, 0, PUBLICKEYBLOB, 0, NULL, &dwLen); + ok(result, "%08x\n", GetLastError()); + /* and its private key may be too. */ + result = CryptExportKey(hKey1, 0, PRIVATEKEYBLOB, 0, NULL, &dwLen); + ok(result, "%08x\n", GetLastError()); + /* Turning off the key's export permissions is "allowed".. */ + dwVal &= ~CRYPT_EXPORT; + result = CryptSetKeyParam(hKey1, KP_PERMISSIONS, (BYTE *)&dwVal, 0); + ok(result || + broken(!result && GetLastError() == NTE_BAD_DATA) || /* W2K */ + broken(!result && GetLastError() == NTE_BAD_FLAGS), /* Win9x/WinME/NT4 */ + "%08x\n", GetLastError()); + /* but it has no effect. */ + dwVal = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hKey1, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); + /* Thus, changing the export flag of the key doesn't affect whether the key + * may be exported. + */ + result = CryptExportKey(hKey1, 0, PRIVATEKEYBLOB, 0, NULL, &dwLen); + ok(result, "%08x\n", GetLastError()); + + result = CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKey2); + ok (result, "%08x\n", GetLastError()); + + /* A subsequent get of the same key, into a different handle, also doesn't + * show that the permissions have been changed. + */ + dwVal = 0xdeadbeef; + dwLen = sizeof(DWORD); + result = CryptGetKeyParam(hKey2, KP_PERMISSIONS, (BYTE*)&dwVal, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwVal == + (CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT) || + broken(dwVal == 0xffffffff), /* Win9x/NT4 */ + "expected CRYPT_MAC|CRYPT_WRITE|CRYPT_READ|CRYPT_EXPORT|CRYPT_DECRYPT|CRYPT_ENCRYPT," + " got %08x\n", dwVal); + + CryptDestroyKey(hKey2); + CryptDestroyKey(hKey1); + + clean_up_base_environment(); +} + +static void test_key_initialization(void) +{ + DWORD dwLen; + HCRYPTPROV prov1, prov2; + HCRYPTKEY hKeyExchangeKey, hSessionKey, hKey; + BOOL result; + static BYTE abSessionKey[148] = { + 0x01, 0x02, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, + 0x00, 0xa4, 0x00, 0x00, 0xb8, 0xa4, 0xdf, 0x5e, + 0x9e, 0xb1, 0xbf, 0x85, 0x3d, 0x24, 0x2d, 0x1e, + 0x69, 0xb7, 0x67, 0x13, 0x8e, 0x78, 0xf2, 0xdf, + 0xc6, 0x69, 0xce, 0x46, 0x7e, 0xf2, 0xf2, 0x33, + 0x20, 0x6f, 0xa1, 0xa5, 0x59, 0x83, 0x25, 0xcb, + 0x3a, 0xb1, 0x8a, 0x12, 0x63, 0x02, 0x3c, 0xfb, + 0x4a, 0xfa, 0xef, 0x8e, 0xf7, 0x29, 0x57, 0xb1, + 0x9e, 0xa7, 0xf3, 0x02, 0xfd, 0xca, 0xdf, 0x5a, + 0x1f, 0x71, 0xb6, 0x26, 0x09, 0x24, 0x39, 0xda, + 0xc0, 0xde, 0x2a, 0x0e, 0xcd, 0x1f, 0xe5, 0xb6, + 0x4f, 0x82, 0xa0, 0xa9, 0x90, 0xd3, 0xd9, 0x6a, + 0x43, 0x14, 0x2a, 0xf7, 0xac, 0xd5, 0xa0, 0x54, + 0x93, 0xc4, 0xb9, 0xe7, 0x24, 0x84, 0x4d, 0x69, + 0x5e, 0xcc, 0x2a, 0x32, 0xb5, 0xfb, 0xe4, 0xb4, + 0x08, 0xd5, 0x36, 0x58, 0x59, 0x40, 0xfb, 0x29, + 0x7f, 0xa7, 0x17, 0x25, 0xc4, 0x0d, 0x78, 0x37, + 0x04, 0x8c, 0x49, 0x92 + }; + + /* Like init_base_environment, but doesn't generate new keys, as they'll + * be imported instead. + */ + if (!CryptAcquireContext(&prov1, szContainer, szProvider, PROV_RSA_FULL, 0)) + { + result = CryptAcquireContext(&prov1, szContainer, szProvider, PROV_RSA_FULL, + CRYPT_NEWKEYSET); + ok(result, "%08x\n", GetLastError()); + } + dwLen = (DWORD)sizeof(abPlainPrivateKey); + result = CryptImportKey(prov1, abPlainPrivateKey, dwLen, 0, 0, &hKeyExchangeKey); + + dwLen = (DWORD)sizeof(abSessionKey); + result = CryptImportKey(prov1, abSessionKey, dwLen, hKeyExchangeKey, 0, &hSessionKey); + ok(result, "%08x\n", GetLastError()); + + /* Once the key has been imported, subsequently acquiring a context with + * the same name will allow retrieving the key. + */ + result = CryptAcquireContext(&prov2, szContainer, szProvider, PROV_RSA_FULL, 0); + ok(result, "%08x\n", GetLastError()); + result = CryptGetUserKey(prov2, AT_KEYEXCHANGE, &hKey); + ok(result, "%08x\n", GetLastError()); + if (result) CryptDestroyKey(hKey); + CryptReleaseContext(prov2, 0); + + CryptDestroyKey(hSessionKey); + CryptDestroyKey(hKeyExchangeKey); + CryptReleaseContext(prov1, 0); + CryptAcquireContext(&prov1, szContainer, NULL, PROV_RSA_FULL, + CRYPT_DELETEKEYSET); +} + START_TEST(rsaenh) { - if (!init_base_environment()) + if (!init_base_environment(0)) return; test_prov(); test_gen_random(); @@ -2062,6 +2284,8 @@ START_TEST(rsaenh) test_import_export(); test_enum_container(); clean_up_base_environment(); + test_key_permissions(); + test_key_initialization(); test_schannel_provider(); test_null_provider(); if (!init_aes_environment()) diff --git a/rostests/winetests/schannel/main.c b/rostests/winetests/schannel/main.c index 814b60a696c..ddfffc45d3f 100644 --- a/rostests/winetests/schannel/main.c +++ b/rostests/winetests/schannel/main.c @@ -144,11 +144,13 @@ static void testGetInfo(void) /* First package: Unified */ status = pTables->GetInfo(&PackageInfo); ok(status == STATUS_SUCCESS, "status: 0x%x\n", status); - ok(PackageInfo.fCapabilities == 0x107b3, "fCapabilities: 0x%lx\n", + ok(PackageInfo.fCapabilities == 0x107b3, "fCapabilities: 0x%x\n", PackageInfo.fCapabilities); ok(PackageInfo.wVersion == 1, "wVersion: %d\n", PackageInfo.wVersion); ok(PackageInfo.wRPCID == 14, "wRPCID: %d\n", PackageInfo.wRPCID); - ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%lx\n", + ok(PackageInfo.cbMaxToken == 0x4000 || + PackageInfo.cbMaxToken == 0x6000, /* Vista */ + "cbMaxToken: 0x%x\n", PackageInfo.cbMaxToken); /* Second package: SChannel */ @@ -162,11 +164,11 @@ static void testGetInfo(void) if (status == STATUS_SUCCESS) { - ok(PackageInfo.fCapabilities == 0x107b3, "fCapabilities: 0x%lx\n", + ok(PackageInfo.fCapabilities == 0x107b3, "fCapabilities: 0x%x\n", PackageInfo.fCapabilities); ok(PackageInfo.wVersion == 1, "wVersion: %d\n", PackageInfo.wVersion); ok(PackageInfo.wRPCID == 14, "wRPCID: %d\n", PackageInfo.wRPCID); - ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%lx\n", + ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%x\n", PackageInfo.cbMaxToken); } } @@ -175,7 +177,7 @@ START_TEST(main) { HMODULE hMod = LoadLibraryA("schannel.dll"); if (!hMod) { - skip("schannel.dll not found.\n"); + win_skip("schannel.dll not available\n"); return; } @@ -187,7 +189,7 @@ START_TEST(main) testInitialize(); testGetInfo(); } - else skip( "schannel functions not found\n" ); + else win_skip( "schannel functions not found\n" ); FreeLibrary(hMod); } diff --git a/rostests/winetests/setupapi/devinst.c b/rostests/winetests/setupapi/devinst.c index 727e4540c47..1ae0720198e 100644 --- a/rostests/winetests/setupapi/devinst.c +++ b/rostests/winetests/setupapi/devinst.c @@ -57,6 +57,9 @@ static BOOL (WINAPI *pSetupDiSetDeviceRegistryPropertyW)(HDEVINFO, PSP_DEVIN static BOOL (WINAPI *pSetupDiGetDeviceRegistryPropertyA)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD); static BOOL (WINAPI *pSetupDiGetDeviceRegistryPropertyW)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD); +/* This is a unique guid for testing purposes */ +static GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}}; + static void init_function_pointers(void) { hSetupAPI = GetModuleHandleA("setupapi.dll"); @@ -86,8 +89,68 @@ static void init_function_pointers(void) pSetupDiGetDeviceRegistryPropertyW = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceRegistryPropertyW"); } +static void change_reg_permissions(const WCHAR *regkey) +{ + HKEY hkey; + SID_IDENTIFIER_AUTHORITY ident = { SECURITY_WORLD_SID_AUTHORITY }; + SECURITY_DESCRIPTOR sd; + PSID EveryoneSid; + PACL pacl = NULL; + + RegOpenKeyExW(HKEY_LOCAL_MACHINE, regkey, 0, WRITE_DAC, &hkey); + + /* Initialize the 'Everyone' sid */ + AllocateAndInitializeSid(&ident, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid); + + pacl = HeapAlloc(GetProcessHeap(), 0, 256); + InitializeAcl(pacl, 256, ACL_REVISION); + + /* Add 'Full Control' for 'Everyone' */ + AddAccessAllowedAce(pacl, ACL_REVISION, KEY_ALL_ACCESS, EveryoneSid); + + InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); + + SetSecurityDescriptorDacl(&sd, TRUE, pacl, FALSE); + + /* Set the new security on the registry key */ + RegSetKeySecurity(hkey, DACL_SECURITY_INFORMATION, &sd); + + RegCloseKey(hkey); + + HeapFree(GetProcessHeap(), 0, pacl); + if (EveryoneSid) + FreeSid(EveryoneSid); +} + +static BOOL remove_device(void) +{ + HDEVINFO set; + SP_DEVINFO_DATA devInfo = { sizeof(devInfo), { 0 } }; + BOOL ret; + + SetLastError(0xdeadbeef); + set = pSetupDiGetClassDevsA(&guid, NULL, 0, 0); + ok(set != INVALID_HANDLE_VALUE, "SetupDiGetClassDevsA failed: %08x\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ok(pSetupDiEnumDeviceInfo(set, 0, &devInfo), + "SetupDiEnumDeviceInfo failed: %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = pSetupDiCallClassInstaller(DIF_REMOVE, set, &devInfo); + todo_wine + ok(ret, "SetupDiCallClassInstaller(DIF_REMOVE...) failed: %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + ok(pSetupDiDestroyDeviceInfoList(set), + "SetupDiDestroyDeviceInfoList failed: %08x\n", GetLastError()); + + return ret; +} + /* RegDeleteTreeW from dlls/advapi32/registry.c */ -LSTATUS WINAPI devinst_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey) +static LSTATUS devinst_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey) { LONG ret; DWORD dwMaxSubkeyLen, dwMaxValueLen; @@ -153,6 +216,33 @@ cleanup: return ret; } +static void clean_devclass_key(void) +{ + static const WCHAR devclass[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\','D','e','v','i','c','e','C','l','a','s','s','e','s','\\', + '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', + '1','1','d','b','-','b','7','0','4','-', + '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; + HKEY key; + DWORD subkeys; + + /* Check if we have subkeys as Windows 2000 doesn't delete + * the keys under the DeviceClasses key after a SetupDiDestroyDeviceInfoList. + */ + RegOpenKeyW(HKEY_LOCAL_MACHINE, devclass, &key); + RegQueryInfoKey(key, NULL, NULL, NULL, &subkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + if (subkeys > 0) + { + trace("We are most likely on Windows 2000\n"); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, devclass); + } + else + { + ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, devclass), + "Couldn't delete deviceclass key\n"); + } +} static void test_SetupDiCreateDeviceInfoListEx(void) { @@ -169,7 +259,7 @@ static void test_SetupDiCreateDeviceInfoListEx(void) error = GetLastError(); if (error == ERROR_CALL_NOT_IMPLEMENTED) { - skip("SetupDiCreateDeviceInfoListExW is not implemented\n"); + win_skip("SetupDiCreateDeviceInfoListExW is not implemented\n"); return; } ok(devlist == INVALID_HANDLE_VALUE, "SetupDiCreateDeviceInfoListExW failed : %p %d (expected %p)\n", devlist, error, INVALID_HANDLE_VALUE); @@ -181,7 +271,7 @@ static void test_SetupDiCreateDeviceInfoListEx(void) error = GetLastError(); ok(devlist == INVALID_HANDLE_VALUE, "SetupDiCreateDeviceInfoListExW failed : %p %d (expected %p)\n", devlist, error, INVALID_HANDLE_VALUE); - ok(error == ERROR_INVALID_MACHINENAME, "GetLastError returned wrong value : %d, (expected %d)\n", error, ERROR_INVALID_MACHINENAME); + ok(error == ERROR_INVALID_MACHINENAME || error == ERROR_MACHINE_UNAVAILABLE, "GetLastError returned wrong value : %d, (expected %d or %d)\n", error, ERROR_INVALID_MACHINENAME, ERROR_MACHINE_UNAVAILABLE); /* create empty DeviceInfoList */ devlist = pSetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); @@ -194,9 +284,6 @@ static void test_SetupDiCreateDeviceInfoListEx(void) static void test_SetupDiOpenClassRegKeyExA(void) { - /* This is a unique guid for testing purposes */ - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; static const CHAR guidString[] = "{6a55b5a4-3f65-11db-b704-0011955c2bdb}"; HKEY hkey; @@ -226,35 +313,30 @@ static void test_SetupDiOpenClassRegKeyExA(void) } else trace("failed to create registry key for test\n"); + + RegCloseKey(hkey); } else trace("failed to open classes key\n"); } -static void append_str(char **str, const char *data) -{ - sprintf(*str, data); - *str += strlen(*str); -} - static void create_inf_file(LPCSTR filename) { - char data[1024]; - char *ptr = data; DWORD dwNumberOfBytesWritten; HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - append_str(&ptr, "[Version]\n"); - append_str(&ptr, "Signature=\"$Chicago$\"\n"); - append_str(&ptr, "Class=Bogus\n"); - append_str(&ptr, "ClassGUID={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n"); - append_str(&ptr, "[ClassInstall32]\n"); - append_str(&ptr, "AddReg=BogusClass.NT.AddReg\n"); - append_str(&ptr, "[BogusClass.NT.AddReg]\n"); - append_str(&ptr, "HKR,,,,\"Wine test devices\"\n"); + static const char data[] = + "[Version]\n" + "Signature=\"$Chicago$\"\n" + "Class=Bogus\n" + "ClassGUID={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n" + "[ClassInstall32]\n" + "AddReg=BogusClass.NT.AddReg\n" + "[BogusClass.NT.AddReg]\n" + "HKR,,,,\"Wine test devices\"\n"; - WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL); + WriteFile(hf, data, sizeof(data) - 1, &dwNumberOfBytesWritten, NULL); CloseHandle(hf); } @@ -280,20 +362,9 @@ static void testInstallClass(void) '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', '1','1','d','b','-','b','7','0','4','-', '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; - static const CHAR classKey_win9x[] = - "System\\CurrentControlSet\\Services\\Class\\" - "{6a55b5a4-3f65-11db-b704-0011955c2bdb}"; - static const CHAR bogus_win9x[] = - "System\\CurrentControlSet\\Services\\Class\\Bogus"; char tmpfile[MAX_PATH]; BOOL ret; - HKEY hkey; - if (!pSetupDiInstallClassA) - { - skip("No SetupDiInstallClassA\n"); - return; - } tmpfile[0] = '.'; tmpfile[1] = '\\'; get_temp_filename(tmpfile + 2); @@ -316,21 +387,10 @@ static void testInstallClass(void) */ ret = pSetupDiInstallClassA(NULL, tmpfile, 0, NULL); ok(ret, "SetupDiInstallClassA failed: %08x\n", GetLastError()); - if (!RegOpenKeyA(HKEY_LOCAL_MACHINE, classKey_win9x, &hkey)) - { - /* We are on win9x */ - RegCloseKey(hkey); - ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, classKey_win9x), - "Couldn't delete win9x classkey\n"); - ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, bogus_win9x), - "Couldn't delete win9x bogus services class\n"); - } - else - { - /* NT4 and above */ - ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey), - "Couldn't delete NT classkey\n"); - } + + ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey), + "Couldn't delete classkey\n"); + DeleteFile(tmpfile); } @@ -338,19 +398,20 @@ static void testCreateDeviceInfo(void) { BOOL ret; HDEVINFO set; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; + HKEY key; + LONG res; + static const WCHAR bogus[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S',0}; - if (!pSetupDiCreateDeviceInfoList || !pSetupDiEnumDeviceInfo || - !pSetupDiDestroyDeviceInfoList || !pSetupDiCreateDeviceInfoA) - { - skip("No SetupDiCreateDeviceInfoA\n"); - return; - } SetLastError(0xdeadbeef); ret = pSetupDiCreateDeviceInfoA(NULL, NULL, NULL, NULL, NULL, 0, NULL); - ok(!ret && GetLastError() == ERROR_INVALID_DEVINST_NAME, - "Expected ERROR_INVALID_DEVINST_NAME, got %08x\n", GetLastError()); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_DEVINST_NAME || + GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */, + "Unexpected last error, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); ret = pSetupDiCreateDeviceInfoA(NULL, "Root\\LEGACY_BOGUS\\0000", NULL, NULL, NULL, 0, NULL); @@ -363,16 +424,52 @@ static void testCreateDeviceInfo(void) { SP_DEVINFO_DATA devInfo = { 0 }; DWORD i; + static GUID deadbeef = + {0xdeadbeef, 0xdead, 0xbeef, {0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef}}; + LONG res; + HKEY key; + static const WCHAR bogus0000[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S','\\','0','0','0','0',0}; + /* So we know we have a clean start */ + res = RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus0000, &key); + ok(res != ERROR_SUCCESS, "Expected key to not exist\n"); + /* No GUID given */ SetLastError(0xdeadbeef); ret = pSetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", NULL, NULL, NULL, 0, NULL); ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError()); + /* Even though NT4 fails it still adds some stuff to the registry that + * can't be deleted via normal setupapi functions. As the registry is written + * by a different user (SYSTEM) we have to do some magic to get rid of the key + */ + if (!RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus0000, &key)) + { + trace("NT4 created a bogus key on failure, will be removed now\n"); + change_reg_permissions(bogus0000); + ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, bogus0000), + "Could not delete LEGACY_BOGUS\\0000 key\n"); + } + /* We can't add device information to the set with a different GUID */ + SetLastError(0xdeadbeef); + ret = pSetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", + &deadbeef, NULL, NULL, 0, NULL); + ok(!ret && GetLastError() == ERROR_CLASS_MISMATCH, + "Expected ERROR_CLASS_MISMATCH, got %08x\n", GetLastError()); + if (!RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus0000, &key)) + { + trace("NT4 created a bogus key on failure, will be removed now\n"); + change_reg_permissions(bogus0000); + ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, bogus0000), + "Could not delete LEGACY_BOGUS\\0000 key\n"); + } /* Finally, with all three required parameters, this succeeds: */ ret = pSetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, NULL); - ok(ret, "pSetupDiCreateDeviceInfoA failed: %08x\n", GetLastError()); + ok(ret, "SetupDiCreateDeviceInfoA failed: %08x\n", GetLastError()); /* This fails because the device ID already exists.. */ SetLastError(0xdeadbeef); ret = pSetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, @@ -385,10 +482,10 @@ static void testCreateDeviceInfo(void) DICD_GENERATE_ID, &devInfo); ok(!ret && GetLastError() == ERROR_INVALID_USER_BUFFER, "Expected ERROR_INVALID_USER_BUFFER, got %08x\n", GetLastError()); + /* and this finally succeeds. */ devInfo.cbSize = sizeof(devInfo); ret = pSetupDiCreateDeviceInfoA(set, "LEGACY_BOGUS", &guid, NULL, NULL, DICD_GENERATE_ID, &devInfo); - /* and this finally succeeds. */ ok(ret, "SetupDiCreateDeviceInfoA failed: %08x\n", GetLastError()); /* There were three devices added, however - the second failure just * resulted in the SP_DEVINFO_DATA not getting copied. @@ -402,30 +499,59 @@ static void testCreateDeviceInfo(void) "SetupDiEnumDeviceInfo failed: %08x\n", GetLastError()); pSetupDiDestroyDeviceInfoList(set); } + + /* The bogus registry key shouldn't be there after this test. The only + * reasons this key would still be present: + * + * - We are running on Wine which has to be fixed + * - We have leftovers from old tests + */ + res = RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key); + todo_wine + ok(res == ERROR_FILE_NOT_FOUND, "Expected key to not exist\n"); + if (res == ERROR_SUCCESS) + { + DWORD subkeys; + + /* Check if we have subkeys */ + RegQueryInfoKey(key, NULL, NULL, NULL, &subkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + if (subkeys > 0) + { + int i; + + /* Leftovers from old tests */ + trace("Going to remove %d devices\n", subkeys); + for (i = 0; i < subkeys; i++) + { + BOOL ret; + + ret = remove_device(); + ok(ret, "Expected a device to be removed\n"); + } + } + else + { + /* Wine doesn't delete the bogus key itself currently */ + trace("We are most likely on Wine\n"); + RegDeleteKeyW(HKEY_LOCAL_MACHINE, bogus); + } + } } static void testGetDeviceInstanceId(void) { BOOL ret; HDEVINFO set; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; SP_DEVINFO_DATA devInfo = { 0 }; - if (!pSetupDiCreateDeviceInfoList || !pSetupDiDestroyDeviceInfoList || - !pSetupDiCreateDeviceInfoA || !pSetupDiGetDeviceInstanceIdA) - { - skip("No SetupDiGetDeviceInstanceIdA\n"); - return; - } SetLastError(0xdeadbeef); ret = pSetupDiGetDeviceInstanceIdA(NULL, NULL, NULL, 0, NULL); ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLEHANDLE, got %08x\n", GetLastError()); + "Expected ERROR_INVALID_HANDLE, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = pSetupDiGetDeviceInstanceIdA(NULL, &devInfo, NULL, 0, NULL); ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLEHANDLE, got %08x\n", GetLastError()); + "Expected ERROR_INVALID_HANDLE, got %08x\n", GetLastError()); set = pSetupDiCreateDeviceInfoList(&guid, NULL); ok(set != NULL, "SetupDiCreateDeviceInfoList failed: %08x\n", GetLastError()); @@ -469,7 +595,8 @@ static void testGetDeviceInstanceId(void) ret = pSetupDiGetDeviceInstanceIdA(set, &devInfo, instanceID, sizeof(instanceID), NULL); ok(ret, "SetupDiGetDeviceInstanceIdA failed: %08x\n", GetLastError()); - ok(!lstrcmpA(instanceID, "ROOT\\LEGACY_BOGUS\\0001"), + /* NT4 returns 'Root' and W2K and above 'ROOT' */ + ok(!lstrcmpiA(instanceID, "ROOT\\LEGACY_BOGUS\\0001"), "Unexpected instance ID %s\n", instanceID); pSetupDiDestroyDeviceInfoList(set); } @@ -478,21 +605,12 @@ static void testGetDeviceInstanceId(void) static void testRegisterDeviceInfo(void) { BOOL ret; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; HDEVINFO set; - if (!pSetupDiCreateDeviceInfoList || !pSetupDiDestroyDeviceInfoList || - !pSetupDiRegisterDeviceInfo) - { - skip("No SetupDiRegisterDeviceInfo\n"); - return; - } SetLastError(0xdeadbeef); ret = pSetupDiRegisterDeviceInfo(NULL, NULL, 0, NULL, NULL, NULL); ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); - ret = pSetupDiRegisterDeviceInfo(NULL, NULL, 0, NULL, NULL, NULL); set = pSetupDiCreateDeviceInfoList(&guid, NULL); ok(set != NULL, "SetupDiCreateDeviceInfoList failed: %d\n", GetLastError()); if (set) @@ -524,8 +642,7 @@ static void testRegisterDeviceInfo(void) ok(ret, "SetupDiCreateDeviceInfoA failed: %d\n", GetLastError()); } /* FIXME: On Win2K+ systems, this is now persisted to registry in - * HKLM\System\CCS\Enum\USB\Bogus\0000. I don't check because the - * Win9x location is different. + * HKLM\System\CCS\Enum\USB\Bogus\0000. * FIXME: the key also becomes undeletable. How to get rid of it? */ pSetupDiDestroyDeviceInfoList(set); @@ -535,15 +652,22 @@ static void testRegisterDeviceInfo(void) static void testCreateDeviceInterface(void) { BOOL ret; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; HDEVINFO set; + HKEY key; + static const WCHAR bogus[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S',0}; + static const WCHAR devclass[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\','D','e','v','i','c','e','C','l','a','s','s','e','s','\\', + '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', + '1','1','d','b','-','b','7','0','4','-', + '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; - if (!pSetupDiCreateDeviceInfoList || !pSetupDiDestroyDeviceInfoList || - !pSetupDiCreateDeviceInfoA || !pSetupDiCreateDeviceInterfaceA || - !pSetupDiEnumDeviceInterfaces) + if (!pSetupDiCreateDeviceInterfaceA || !pSetupDiEnumDeviceInterfaces) { - skip("No SetupDiCreateDeviceInterfaceA\n"); + win_skip("SetupDiCreateDeviceInterfaceA and/or SetupDiEnumDeviceInterfaces are not available\n"); return; } SetLastError(0xdeadbeef); @@ -601,22 +725,46 @@ static void testCreateDeviceInterface(void) ok(i == 2, "expected 2 interfaces, got %d\n", i); ok(GetLastError() == ERROR_NO_MORE_ITEMS, "SetupDiEnumDeviceInterfaces failed: %08x\n", GetLastError()); - pSetupDiDestroyDeviceInfoList(set); + ret = pSetupDiDestroyDeviceInfoList(set); + ok(ret, "SetupDiDestroyDeviceInfoList failed: %08x\n", GetLastError()); + + /* Cleanup */ + /* FIXME: On Wine we still have the bogus entry in Enum\Root and + * subkeys, as well as the deviceclass key with subkeys. + * Only clean the deviceclass key once Wine if fixed. + */ + if (!RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key)) + { + /* Wine doesn't delete the information currently */ + trace("We are most likely on Wine\n"); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, bogus); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, devclass); + } + else + { + clean_devclass_key(); + } } } static void testGetDeviceInterfaceDetail(void) { BOOL ret; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; HDEVINFO set; + static const WCHAR bogus[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S',0}; + static const WCHAR devclass[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\','D','e','v','i','c','e','C','l','a','s','s','e','s','\\', + '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', + '1','1','d','b','-','b','7','0','4','-', + '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; - if (!pSetupDiCreateDeviceInfoList || !pSetupDiDestroyDeviceInfoList || - !pSetupDiCreateDeviceInfoA || !pSetupDiCreateDeviceInterfaceA || - !pSetupDiGetDeviceInterfaceDetailA) + if (!pSetupDiCreateDeviceInterfaceA || !pSetupDiGetDeviceInterfaceDetailA) { - skip("No SetupDiGetDeviceInterfaceDetailA\n"); + win_skip("SetupDiCreateDeviceInterfaceA and/or SetupDiGetDeviceInterfaceDetailA are not available\n"); return; } SetLastError(0xdeadbeef); @@ -631,6 +779,7 @@ static void testGetDeviceInterfaceDetail(void) SP_DEVICE_INTERFACE_DATA interfaceData = { sizeof(interfaceData), { 0 } }; DWORD size = 0; + HKEY key; SetLastError(0xdeadbeef); ret = pSetupDiGetDeviceInterfaceDetailA(set, NULL, NULL, 0, NULL, @@ -663,10 +812,12 @@ static void testGetDeviceInterfaceDetail(void) { static const char path[] = "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}"; + static const char path_w2k[] = + "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}\\"; LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, size); SP_DEVICE_INTERFACE_DETAIL_DATA_A *detail = (SP_DEVICE_INTERFACE_DETAIL_DATA_A *)buf; - DWORD expectedsize = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath) + sizeof(WCHAR)*(1 + strlen(path)); + DWORD expectedsize = FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath) + sizeof(WCHAR)*(1 + strlen(path)); detail->cbSize = 0; SetLastError(0xdeadbeef); @@ -682,33 +833,42 @@ static void testGetDeviceInterfaceDetail(void) "Expected ERROR_INVALID_USER_BUFFER, got %08x\n", GetLastError()); detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); SetLastError(0xdeadbeef); - ret = pSetupDiGetDeviceInterfaceDetailA(set, &interfaceData, detail, - size, &size, NULL); - ok(!ret && GetLastError() == ERROR_INVALID_USER_BUFFER, - "Expected ERROR_INVALID_USER_BUFFER, got %08x\n", GetLastError()); - /* Windows 2000 and up check for the exact size. Win9x returns ERROR_INVALID_PARAMETER - * on every call (so doesn't get here) and NT4 doesn't have this function. - */ - detail->cbSize = FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath[1]); ret = pSetupDiGetDeviceInterfaceDetailA(set, &interfaceData, detail, size, &size, NULL); ok(ret, "SetupDiGetDeviceInterfaceDetailA failed: %d\n", GetLastError()); - ok(!lstrcmpiA(path, detail->DevicePath), "Unexpected path %s\n", - detail->DevicePath); + ok(!lstrcmpiA(path, detail->DevicePath) || + !lstrcmpiA(path_w2k, detail->DevicePath), "Unexpected path %s\n", + detail->DevicePath); /* Check SetupDiGetDeviceInterfaceDetailW */ - if (pSetupDiGetDeviceInterfaceDetailW) - { - ret = pSetupDiGetDeviceInterfaceDetailW(set, &interfaceData, NULL, 0, &size, NULL); - ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got error code: %d\n", GetLastError()); - ok(expectedsize == size, "SetupDiGetDeviceInterfaceDetailW returned wrong reqsize: expected %d, got %d\n", expectedsize, size); - } - else - skip("SetupDiGetDeviceInterfaceDetailW is not available\n"); + ret = pSetupDiGetDeviceInterfaceDetailW(set, &interfaceData, NULL, 0, &size, NULL); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected ERROR_INSUFFICIENT_BUFFER, got error code: %d\n", GetLastError()); + ok(expectedsize == size || + (expectedsize + sizeof(WCHAR)) == size /* W2K adds a backslash */, + "SetupDiGetDeviceInterfaceDetailW returned wrong reqsize, got %d\n", + size); HeapFree(GetProcessHeap(), 0, buf); } pSetupDiDestroyDeviceInfoList(set); + + /* Cleanup */ + /* FIXME: On Wine we still have the bogus entry in Enum\Root and + * subkeys, as well as the deviceclass key with subkeys. + * Only do the RegDeleteKey, once Wine is fixed. + */ + if (!RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key)) + { + /* Wine doesn't delete the information currently */ + trace("We are most likely on Wine\n"); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, bogus); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, devclass); + } + else + { + clean_devclass_key(); + } } } @@ -720,33 +880,46 @@ static void testDevRegKey(void) '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', '1','1','d','b','-','b','7','0','4','-', '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; + static const WCHAR bogus[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S',0}; BOOL ret; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; HDEVINFO set; + HKEY key = NULL; + BOOL classKeyCreated; + + SetLastError(0xdeadbeef); + key = pSetupDiCreateDevRegKeyW(NULL, NULL, 0, 0, 0, NULL, NULL); + ok(key == INVALID_HANDLE_VALUE, + "Expected INVALID_HANDLE_VALUE, got %p\n", key); + ok(GetLastError() == ERROR_INVALID_HANDLE, + "Expected ERROR_INVALID_HANDLE, got %08x\n", GetLastError()); - if (!pSetupDiCreateDeviceInfoList || !pSetupDiDestroyDeviceInfoList || - !pSetupDiCreateDeviceInfoA || !pSetupDiOpenDevRegKey || - !pSetupDiRegisterDeviceInfo || !pSetupDiCreateDevRegKeyW || - !pSetupDiCallClassInstaller) - { - skip("No SetupDiOpenDevRegKey\n"); - return; - } set = pSetupDiCreateDeviceInfoList(&guid, NULL); ok(set != NULL, "SetupDiCreateDeviceInfoList failed: %d\n", GetLastError()); if (set) { SP_DEVINFO_DATA devInfo = { sizeof(devInfo), { 0 } }; - HKEY key = INVALID_HANDLE_VALUE; + LONG res; + /* The device info key shouldn't be there */ + res = RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key); + ok(res != ERROR_SUCCESS, "Expected key to not exist\n"); + RegCloseKey(key); + /* Create the device information */ ret = pSetupDiCreateDeviceInfoA(set, "ROOT\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &devInfo); ok(ret, "SetupDiCreateDeviceInfoA failed: %08x\n", GetLastError()); + /* The device info key should have been created */ + ok(!RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key), + "Expected registry key to exist\n"); + RegCloseKey(key); SetLastError(0xdeadbeef); key = pSetupDiOpenDevRegKey(NULL, NULL, 0, 0, 0, 0); - ok(key == INVALID_HANDLE_VALUE && - GetLastError() == ERROR_INVALID_HANDLE, + ok(!key || key == INVALID_HANDLE_VALUE, + "Expected INVALID_HANDLE_VALUE or a NULL key (NT4)\n"); + ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); SetLastError(0xdeadbeef); key = pSetupDiOpenDevRegKey(set, NULL, 0, 0, 0, 0); @@ -785,46 +958,102 @@ static void testDevRegKey(void) todo_wine ok(key == INVALID_HANDLE_VALUE && GetLastError() == ERROR_KEY_DOES_NOT_EXIST, - "Expected ERROR_KEY_DOES_NOT_EXIST_EXIST, got %08x\n", GetLastError()); + "Expected ERROR_KEY_DOES_NOT_EXIST, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); key = pSetupDiOpenDevRegKey(set, &devInfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, 0); todo_wine ok(key == INVALID_HANDLE_VALUE && GetLastError() == ERROR_KEY_DOES_NOT_EXIST, - "Expected ERROR_KEY_DOES_NOT_EXIST_EXIST, got %08x\n", GetLastError()); + "Expected ERROR_KEY_DOES_NOT_EXIST, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); + /* The class key shouldn't be there */ + res = RegOpenKeyW(HKEY_LOCAL_MACHINE, classKey, &key); + todo_wine + ok(res != ERROR_SUCCESS, "Expected key to not exist\n"); + RegCloseKey(key); + /* Create the device reg key */ key = pSetupDiCreateDevRegKeyW(set, &devInfo, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL); - ok(key != INVALID_HANDLE_VALUE, "SetupDiCreateDevRegKey failed: %08x\n", - GetLastError()); - RegCloseKey(key); - SetLastError(0xdeadbeef); - key = pSetupDiOpenDevRegKey(set, &devInfo, DICS_FLAG_GLOBAL, 0, - DIREG_DRV, 0); + /* Vista and higher don't actually create the key */ + ok(key != INVALID_HANDLE_VALUE || GetLastError() == ERROR_KEY_DOES_NOT_EXIST, + "SetupDiCreateDevRegKey failed: %08x\n", GetLastError()); + if (key != INVALID_HANDLE_VALUE) + { + classKeyCreated = TRUE; + RegCloseKey(key); + /* The class key should have been created */ + ok(!RegOpenKeyW(HKEY_LOCAL_MACHINE, classKey, &key), + "Expected registry key to exist\n"); + RegCloseKey(key); + SetLastError(0xdeadbeef); + key = pSetupDiOpenDevRegKey(set, &devInfo, DICS_FLAG_GLOBAL, 0, + DIREG_DRV, 0); + todo_wine + ok(key == INVALID_HANDLE_VALUE && + (GetLastError() == ERROR_INVALID_DATA || + GetLastError() == ERROR_ACCESS_DENIED), /* win2k3 */ + "Expected ERROR_INVALID_DATA or ERROR_ACCESS_DENIED, got %08x\n", GetLastError()); + key = pSetupDiOpenDevRegKey(set, &devInfo, DICS_FLAG_GLOBAL, 0, + DIREG_DRV, KEY_READ); + ok(key != INVALID_HANDLE_VALUE, "SetupDiOpenDevRegKey failed: %08x\n", + GetLastError()); + pSetupDiDestroyDeviceInfoList(set); + } + else + classKeyCreated = FALSE; + + /* Cleanup */ + ret = remove_device(); todo_wine - ok(key == INVALID_HANDLE_VALUE && - GetLastError() == ERROR_INVALID_DATA, - "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); - key = pSetupDiOpenDevRegKey(set, &devInfo, DICS_FLAG_GLOBAL, 0, - DIREG_DRV, KEY_READ); - ok(key != INVALID_HANDLE_VALUE, "SetupDiOpenDevRegKey failed: %08x\n", - GetLastError()); - ret = pSetupDiCallClassInstaller(DIF_REMOVE, set, &devInfo); - pSetupDiDestroyDeviceInfoList(set); + ok(ret, "Expected the device to be removed: %08x\n", GetLastError()); + + /* FIXME: Only do the RegDeleteKey, once Wine is fixed */ + if (!ret) + { + /* Wine doesn't delete the information currently */ + trace("We are most likely on Wine\n"); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, bogus); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, classKey); + } + else if (classKeyCreated) + { + /* There should only be a class key entry, so a simple + * RegDeleteKey should work + * + * This could fail if it's the first time for this new test + * after running the old tests. + */ + ok(!RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey), + "Couldn't delete classkey\n"); + } } - devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, classKey); } static void testRegisterAndGetDetail(void) { HDEVINFO set; BOOL ret; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; SP_DEVINFO_DATA devInfo = { sizeof(SP_DEVINFO_DATA), { 0 } }; SP_DEVICE_INTERFACE_DATA interfaceData = { sizeof(interfaceData), { 0 } }; DWORD dwSize = 0; + static const WCHAR bogus[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S',0}; + static const WCHAR devclass[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\','D','e','v','i','c','e','C','l','a','s','s','e','s','\\', + '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', + '1','1','d','b','-','b','7','0','4','-', + '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; + + if (!pSetupDiCreateDeviceInterfaceA || !pSetupDiEnumDeviceInterfaces || + !pSetupDiGetDeviceInterfaceDetailA) + { + win_skip("Needed functions are not available\n"); + return; + } SetLastError(0xdeadbeef); set = pSetupDiGetClassDevsA(&guid, NULL, 0, DIGCF_ALLCLASSES); @@ -860,30 +1089,53 @@ static void testRegisterAndGetDetail(void) { static const char path[] = "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}"; + static const char path_w2k[] = + "\\\\?\\root#legacy_bogus#0000#{6a55b5a4-3f65-11db-b704-0011955c2bdb}\\"; PSP_DEVICE_INTERFACE_DETAIL_DATA_A detail = NULL; - detail = (PSP_DEVICE_INTERFACE_DETAIL_DATA_A)HeapAlloc(GetProcessHeap(), 0, dwSize); + detail = HeapAlloc(GetProcessHeap(), 0, dwSize); if (detail) { - detail->cbSize = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath) + sizeof(char); + detail->cbSize = sizeof(*detail); SetLastError(0xdeadbeef); ret = pSetupDiGetDeviceInterfaceDetailA(set, &interfaceData, detail, dwSize, &dwSize, NULL); ok(ret, "SetupDiGetDeviceInterfaceDetailA failed: %08x\n", GetLastError()); - ok(!lstrcmpiA(path, detail->DevicePath), "Unexpected path %s\n", - detail->DevicePath); + /* FIXME: This one only worked because old data wasn't removed properly. As soon + * as all the tests are cleaned up correctly this has to be (or should be) fixed + */ + todo_wine + ok(!lstrcmpiA(path, detail->DevicePath) || + !lstrcmpiA(path_w2k, detail->DevicePath), "Unexpected path %s\n", + detail->DevicePath); HeapFree(GetProcessHeap(), 0, detail); } } pSetupDiDestroyDeviceInfoList(set); + + /* Cleanup */ + ret = remove_device(); + todo_wine + ok(ret, "Expected the device to be removed: %08x\n", GetLastError()); + + /* FIXME: Only do the RegDeleteKey, once Wine is fixed */ + if (!ret) + { + /* Wine doesn't delete the information currently */ + trace("We are most likely on Wine\n"); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, bogus); + devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, devclass); + } + else + { + clean_devclass_key(); + } } -static void testDeviceRegistryPropertyA() +static void testDeviceRegistryPropertyA(void) { HDEVINFO set; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; SP_DEVINFO_DATA devInfo = { sizeof(SP_DEVINFO_DATA), { 0 } }; CHAR devName[] = "LEGACY_BOGUS"; CHAR friendlyName[] = "Bogus"; @@ -892,6 +1144,10 @@ static void testDeviceRegistryPropertyA() DWORD size; DWORD regType; BOOL ret; + LONG res; + HKEY key; + static const CHAR bogus[] = + "System\\CurrentControlSet\\Enum\\Root\\LEGACY_BOGUS"; SetLastError(0xdeadbeef); set = pSetupDiGetClassDevsA(&guid, NULL, 0, DIGCF_DEVICEINTERFACE); @@ -914,12 +1170,11 @@ static void testDeviceRegistryPropertyA() todo_wine ok(!ret && GetLastError() == ERROR_INVALID_REG_PROPERTY, "Expected ERROR_INVALID_REG_PROPERTY, got %08x\n", GetLastError()); - SetLastError(0xdeadbeef); + /* GetLastError() returns nonsense in win2k3 */ ret = pSetupDiSetDeviceRegistryPropertyA(set, &devInfo, SPDRP_FRIENDLYNAME, NULL, 0); todo_wine - ok(!ret && GetLastError() == ERROR_INVALID_DATA, - "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); + ok(!ret, "Expected failure, got %d\n", ret); SetLastError(0xdeadbeef); ret = pSetupDiSetDeviceRegistryPropertyA(set, &devInfo, SPDRP_FRIENDLYNAME, (PBYTE)friendlyName, buflen); @@ -937,11 +1192,10 @@ static void testDeviceRegistryPropertyA() todo_wine ok(!ret && GetLastError() == ERROR_INVALID_REG_PROPERTY, "Expected ERROR_INVALID_REG_PROPERTY, got %08x\n", GetLastError()); - SetLastError(0xdeadbeef); + /* GetLastError() returns nonsense in win2k3 */ ret = pSetupDiGetDeviceRegistryPropertyA(set, &devInfo, SPDRP_FRIENDLYNAME, NULL, NULL, buflen, NULL); - ok(!ret && GetLastError() == ERROR_INVALID_DATA, - "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); + ok(!ret, "Expected failure, got %d\n", ret); SetLastError(0xdeadbeef); ret = pSetupDiGetDeviceRegistryPropertyA(set, &devInfo, SPDRP_FRIENDLYNAME, NULL, NULL, 0, &size); @@ -970,13 +1224,22 @@ static void testDeviceRegistryPropertyA() ok(!ret && GetLastError() == ERROR_INVALID_DATA, "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); pSetupDiDestroyDeviceInfoList(set); + + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, bogus, &key); + todo_wine + ok(res == ERROR_FILE_NOT_FOUND, "Expected key to not exist\n"); + /* FIXME: Remove when Wine is fixed */ + if (res == ERROR_SUCCESS) + { + /* Wine doesn't delete the information currently */ + trace("We are most likely on Wine\n"); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, bogus); + } } -static void testDeviceRegistryPropertyW() +static void testDeviceRegistryPropertyW(void) { HDEVINFO set; - GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04, - 0x00,0x11,0x95,0x5c,0x2b,0xdb}}; SP_DEVINFO_DATA devInfo = { sizeof(SP_DEVINFO_DATA), { 0 } }; WCHAR devName[] = {'L','E','G','A','C','Y','_','B','O','G','U','S',0}; WCHAR friendlyName[] = {'B','o','g','u','s',0}; @@ -985,14 +1248,15 @@ static void testDeviceRegistryPropertyW() DWORD size; DWORD regType; BOOL ret; + LONG res; + HKEY key; + static const WCHAR bogus[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'E','n','u','m','\\','R','o','o','t','\\', + 'L','E','G','A','C','Y','_','B','O','G','U','S',0}; SetLastError(0xdeadbeef); set = pSetupDiGetClassDevsW(&guid, NULL, 0, DIGCF_DEVICEINTERFACE); - if (set == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - { - skip("W-functions are not implemented\n"); - return; - } ok(set != INVALID_HANDLE_VALUE, "SetupDiGetClassDevsW failed: %08x\n", GetLastError()); SetLastError(0xdeadbeef); @@ -1012,12 +1276,11 @@ static void testDeviceRegistryPropertyW() todo_wine ok(!ret && GetLastError() == ERROR_INVALID_REG_PROPERTY, "Expected ERROR_INVALID_REG_PROPERTY, got %08x\n", GetLastError()); - SetLastError(0xdeadbeef); + /* GetLastError() returns nonsense in win2k3 */ ret = pSetupDiSetDeviceRegistryPropertyW(set, &devInfo, SPDRP_FRIENDLYNAME, NULL, 0); todo_wine - ok(!ret && GetLastError() == ERROR_INVALID_DATA, - "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); + ok(!ret, "Expected failure, got %d\n", ret); SetLastError(0xdeadbeef); ret = pSetupDiSetDeviceRegistryPropertyW(set, &devInfo, SPDRP_FRIENDLYNAME, (PBYTE)friendlyName, buflen); @@ -1035,11 +1298,10 @@ static void testDeviceRegistryPropertyW() todo_wine ok(!ret && GetLastError() == ERROR_INVALID_REG_PROPERTY, "Expected ERROR_INVALID_REG_PROPERTY, got %08x\n", GetLastError()); - SetLastError(0xdeadbeef); + /* GetLastError() returns nonsense in win2k3 */ ret = pSetupDiGetDeviceRegistryPropertyW(set, &devInfo, SPDRP_FRIENDLYNAME, NULL, NULL, buflen, NULL); - ok(!ret && GetLastError() == ERROR_INVALID_DATA, - "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); + ok(!ret, "Expected failure, got %d\n", ret); SetLastError(0xdeadbeef); ret = pSetupDiGetDeviceRegistryPropertyW(set, &devInfo, SPDRP_FRIENDLYNAME, NULL, NULL, 0, &size); @@ -1068,21 +1330,47 @@ static void testDeviceRegistryPropertyW() ok(!ret && GetLastError() == ERROR_INVALID_DATA, "Expected ERROR_INVALID_DATA, got %08x\n", GetLastError()); pSetupDiDestroyDeviceInfoList(set); + + res = RegOpenKeyW(HKEY_LOCAL_MACHINE, bogus, &key); + todo_wine + ok(res == ERROR_FILE_NOT_FOUND, "Expected key to not exist\n"); + /* FIXME: Remove when Wine is fixed */ + if (res == ERROR_SUCCESS) + { + /* Wine doesn't delete the information currently */ + trace("We are most likely on Wine\n"); + RegDeleteKeyW(HKEY_LOCAL_MACHINE, bogus); + } } START_TEST(devinst) { - init_function_pointers(); + HDEVINFO set; - if (pSetupDiCreateDeviceInfoListExW && pSetupDiDestroyDeviceInfoList) + init_function_pointers(); + + /* Win9x/WinMe does things totally different so we skip all the tests + * + * We don't want to exclude NT4 so hence this check. + */ + SetLastError(0xdeadbeef); + set = pSetupDiGetClassDevsW(NULL, NULL, 0, 0); + if (set == INVALID_HANDLE_VALUE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("Win9x/WinMe has totally different behavior\n"); + return; + } + + if (pSetupDiCreateDeviceInfoListExW) test_SetupDiCreateDeviceInfoListEx(); else - skip("SetupDiCreateDeviceInfoListExW and/or SetupDiDestroyDeviceInfoList not available\n"); + win_skip("SetupDiCreateDeviceInfoListExW is not available\n"); if (pSetupDiOpenClassRegKeyExA) test_SetupDiOpenClassRegKeyExA(); else - skip("SetupDiOpenClassRegKeyExA is not available\n"); + win_skip("SetupDiOpenClassRegKeyExA is not available\n"); + testInstallClass(); testCreateDeviceInfo(); testGetDeviceInstanceId(); diff --git a/rostests/winetests/setupapi/install.c b/rostests/winetests/setupapi/install.c index 0044f019e4b..5361238fb3b 100644 --- a/rostests/winetests/setupapi/install.c +++ b/rostests/winetests/setupapi/install.c @@ -30,6 +30,7 @@ #include "winreg.h" #include "winsvc.h" #include "setupapi.h" +#include "shlobj.h" #include "wine/test.h" @@ -137,6 +138,44 @@ static void test_cmdline(void) ok(DeleteFile(infwithspaces), "Expected source inf to exist, last error was %d\n", GetLastError()); } +static const char *cmdline_inf_reg = "[Version]\n" + "Signature=\"$Chicago$\"\n" + "[DefaultInstall]\n" + "DelReg=Del.Settings\n" + "[Del.Settings]\n" + "HKCU,Software\\Wine\\setupapitest\n"; + +static void test_registry(void) +{ + HKEY key; + LONG res; + char path[MAX_PATH]; + + /* First create a registry structure we would like to be deleted */ + ok(!RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine\\setupapitest\\setupapitest", &key), + "Expected RegCreateKeyA to succeed\n"); + + /* Doublecheck if the registry key is present */ + ok(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\setupapitest\\setupapitest", &key), + "Expected registry key to exist\n"); + + create_inf_file(inffile, cmdline_inf_reg); + sprintf(path, "%s\\%s", CURR_DIR, inffile); + run_cmdline("DefaultInstall", 128, path); + + /* Check if the registry key is recursively deleted */ + res = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\setupapitest", &key); + todo_wine + ok(res == ERROR_FILE_NOT_FOUND, "Didn't expect the registry key to exist\n"); + /* Just in case */ + if (res == ERROR_SUCCESS) + { + RegDeleteKeyA(HKEY_CURRENT_USER, "Software\\Wine\\setupapitest\\setupapitest"); + RegDeleteKeyA(HKEY_CURRENT_USER, "Software\\Wine\\setupapitest"); + } + ok(DeleteFile(inffile), "Expected source inf to exist, last error was %d\n", GetLastError()); +} + static void test_install_svc_from(void) { char inf[2048]; @@ -151,7 +190,7 @@ static void test_install_svc_from(void) if (!scm_handle && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); + win_skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); return; } CloseServiceHandle(scm_handle); @@ -249,6 +288,13 @@ static void test_install_svc_from(void) infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); SetLastError(0xdeadbeef); ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + if (!ret && GetLastError() == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to install the service\n"); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + return; + } ok(ret, "Expected success\n"); ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); @@ -302,7 +348,12 @@ static void test_driver_install(void) if (!scm_handle && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) { - skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); + win_skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); + return; + } + else if (!scm_handle && (GetLastError() == ERROR_ACCESS_DENIED)) + { + skip("Not enough rights to install the service\n"); return; } CloseServiceHandle(scm_handle); @@ -344,6 +395,77 @@ static void test_driver_install(void) DeleteFile(driver); } +static void test_profile_items(void) +{ + char path[MAX_PATH], commonprogs[MAX_PATH]; + HMODULE hShell32; + BOOL (WINAPI *pSHGetFolderPathA)(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwFlags, LPSTR pszPath); + + static const char *inf = + "[Version]\n" + "Signature=\"$Chicago$\"\n" + "[DefaultInstall]\n" + "ProfileItems=TestItem,TestItem2,TestGroup\n" + "[TestItem]\n" + "Name=TestItem\n" + "CmdLine=11,,notepad.exe\n" + "[TestItem2]\n" + "Name=TestItem2\n" + "CmdLine=11,,notepad.exe\n" + "SubDir=TestDir\n" + "[TestGroup]\n" + "Name=TestGroup,4\n" + ; + + hShell32 = LoadLibraryA("shell32"); + pSHGetFolderPathA = (void*)GetProcAddress(hShell32, "SHGetFolderPathA"); + if (!pSHGetFolderPathA) + { + win_skip("SHGetFolderPathA is not available\n"); + goto cleanup; + } + + if (S_OK != pSHGetFolderPathA(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, commonprogs)) + { + skip("No common program files directory exists\n"); + goto cleanup; + } + + create_inf_file(inffile, inf); + sprintf(path, "%s\\%s", CURR_DIR, inffile); + run_cmdline("DefaultInstall", 128, path); + + snprintf(path, MAX_PATH, "%s\\TestItem.lnk", commonprogs); + if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(path)) + { + win_skip("ProfileItems not implemented on this system\n"); + } + else + { + snprintf(path, MAX_PATH, "%s\\TestDir", commonprogs); + ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "directory not created\n"); + snprintf(path, MAX_PATH, "%s\\TestDir\\TestItem2.lnk", commonprogs); + ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "link not created\n"); + snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs); + ok(INVALID_FILE_ATTRIBUTES != GetFileAttributes(path), "group not created\n"); + } + + snprintf(path, MAX_PATH, "%s\\TestItem.lnk", commonprogs); + DeleteFile(path); + snprintf(path, MAX_PATH, "%s\\TestDir\\TestItem2.lnk", commonprogs); + DeleteFile(path); + snprintf(path, MAX_PATH, "%s\\TestItem2.lnk", commonprogs); + DeleteFile(path); + snprintf(path, MAX_PATH, "%s\\TestDir", commonprogs); + RemoveDirectory(path); + snprintf(path, MAX_PATH, "%s\\TestGroup", commonprogs); + RemoveDirectory(path); + +cleanup: + if (hShell32) FreeLibrary(hShell32); + DeleteFile(inffile); +} + START_TEST(install) { HMODULE hsetupapi = GetModuleHandle("setupapi.dll"); @@ -378,7 +500,7 @@ START_TEST(install) ok(DeleteFile(inffile), "Expected source inf to exist, last error was %d\n", GetLastError()); } if (!pInstallHinfSectionW && !pInstallHinfSectionA) - skip("InstallHinfSectionA and InstallHinfSectionW are not available\n"); + win_skip("InstallHinfSectionA and InstallHinfSectionW are not available\n"); else { /* Set CBT hook to disallow MessageBox creation in current thread */ @@ -386,10 +508,15 @@ START_TEST(install) assert(hhook != 0); test_cmdline(); + test_registry(); test_install_svc_from(); test_driver_install(); UnhookWindowsHookEx(hhook); + + /* We have to run this test after the CBT hook is disabled because + ProfileItems needs to create a window on Windows XP. */ + test_profile_items(); } SetCurrentDirectory(prev_path); diff --git a/rostests/winetests/setupapi/misc.c b/rostests/winetests/setupapi/misc.c index f8750b60154..726d1eb01de 100644 --- a/rostests/winetests/setupapi/misc.c +++ b/rostests/winetests/setupapi/misc.c @@ -47,29 +47,22 @@ static BOOL (WINAPI *pSetupGetFileCompressionInfoExA)(PCSTR, PSTR, DWORD, PDWORD static BOOL (WINAPI *pSetupCopyOEMInfA)(PCSTR, PCSTR, DWORD, DWORD, PSTR, DWORD, PDWORD, PSTR *); static BOOL (WINAPI *pSetupQueryInfOriginalFileInformationA)(PSP_INF_INFORMATION, UINT, PSP_ALTPLATFORM_INFO, PSP_ORIGINAL_FILE_INFO_A); -static void append_str(char **str, const char *data) -{ - sprintf(*str, data); - *str += strlen(*str); -} - static void create_inf_file(LPCSTR filename) { - char data[1024]; - char *ptr = data; DWORD dwNumberOfBytesWritten; HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - append_str(&ptr, "[Version]\n"); - append_str(&ptr, "Signature=\"$Chicago$\"\n"); - append_str(&ptr, "AdvancedINF=2.5\n"); - append_str(&ptr, "[DefaultInstall]\n"); - append_str(&ptr, "RegisterOCXs=RegisterOCXsSection\n"); - append_str(&ptr, "[RegisterOCXsSection]\n"); - append_str(&ptr, "%%11%%\\ole32.dll\n"); + static const char data[] = + "[Version]\n" + "Signature=\"$Chicago$\"\n" + "AdvancedINF=2.5\n" + "[DefaultInstall]\n" + "RegisterOCXs=RegisterOCXsSection\n" + "[RegisterOCXsSection]\n" + "%%11%%\\ole32.dll\n"; - WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL); + WriteFile(hf, data, sizeof(data) - 1, &dwNumberOfBytesWritten, NULL); CloseHandle(hf); } @@ -114,7 +107,7 @@ static void test_original_file_name(LPCSTR original, LPCSTR dest) if (!pSetupQueryInfOriginalFileInformationA) { - skip("SetupQueryInfOriginalFileInformationA is not available\n"); + win_skip("SetupQueryInfOriginalFileInformationA is not available\n"); return; } @@ -166,8 +159,10 @@ static void test_SetupCopyOEMInf(void) SetLastError(0xdeadbeef); res = pSetupCopyOEMInfA("", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); ok(res == FALSE, "Expected FALSE, got %d\n", res); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_BAD_PATHNAME || /* Win98 */ + GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */ + "Unexpected error : %d\n", GetLastError()); /* try a relative nonexistent SourceInfFileName */ SetLastError(0xdeadbeef); @@ -191,8 +186,9 @@ static void test_SetupCopyOEMInf(void) SetLastError(0xdeadbeef); res = pSetupCopyOEMInfA(toolong, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); ok(res == FALSE, "Expected FALSE, got %d\n", res); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_FILENAME_EXCED_RANGE, /* Win98 */ + "Expected ERROR_FILE_NOT_FOUND or ERROR_FILENAME_EXCED_RANGE, got %d\n", GetLastError()); get_temp_filename(tmpfile); create_inf_file(tmpfile); @@ -201,8 +197,20 @@ static void test_SetupCopyOEMInf(void) SetLastError(0xdeadbeef); res = pSetupCopyOEMInfA(tmpfile, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); ok(res == FALSE, "Expected FALSE, got %d\n", res); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); + if (GetLastError() == ERROR_WRONG_INF_TYPE) + { + /* FIXME: + * Vista needs a [Manufacturer] entry in the inf file. Doing this will give some + * popups during the installation though as it also needs a catalog file (signed?). + */ + win_skip("Needs a different inf file on Vista/W2K8\n"); + DeleteFile(tmpfile); + return; + } + + ok(GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_FILE_EXISTS, /* Win98 */ + "Expected ERROR_FILE_NOT_FOUND or ERROR_FILE_EXISTS, got %d\n", GetLastError()); ok(file_exists(tmpfile), "Expected tmpfile to exist\n"); /* try SP_COPY_REPLACEONLY, dest does not exist */ @@ -400,6 +408,7 @@ static void test_SetupGetFileCompressionInfo(void) ok(target_size == sizeof(uncompressed), "got %d\n", target_size); ok(type == FILE_COMPRESSION_NONE, "got %d, expected FILE_COMPRESSION_NONE\n", type); + MyFree(name); DeleteFileA(source); } @@ -582,14 +591,14 @@ START_TEST(misc) if (pSetupCopyOEMInfA) test_SetupCopyOEMInf(); else - skip("SetupCopyOEMInfA is not available\n"); + win_skip("SetupCopyOEMInfA is not available\n"); test_SetupGetFileCompressionInfo(); if (pSetupGetFileCompressionInfoExA) test_SetupGetFileCompressionInfoEx(); else - skip("SetupGetFileCompressionInfoExA is not available\n"); + win_skip("SetupGetFileCompressionInfoExA is not available\n"); test_SetupDecompressOrCopyFile(); } diff --git a/rostests/winetests/setupapi/parser.c b/rostests/winetests/setupapi/parser.c index 6341222819e..0aa78c12d53 100644 --- a/rostests/winetests/setupapi/parser.c +++ b/rostests/winetests/setupapi/parser.c @@ -33,12 +33,14 @@ /* function pointers */ static HMODULE hSetupAPI; static LPCWSTR (WINAPI *pSetupGetField)(PINFCONTEXT,DWORD); +static BOOL (WINAPI *pSetupEnumInfSectionsA)( HINF hinf, UINT index, PSTR buffer, DWORD size, UINT *need ); static void init_function_pointers(void) { hSetupAPI = GetModuleHandleA("setupapi.dll"); - pSetupGetField = (void *)GetProcAddress(hSetupAPI, "pSetupGetField"); + pSetupGetField = (void *)GetProcAddress(hSetupAPI, "pSetupGetField"); + pSetupEnumInfSectionsA = (void *)GetProcAddress(hSetupAPI, "SetupEnumInfSectionsA" ); } static const char tmpfilename[] = ".\\tmp.inf"; @@ -52,6 +54,7 @@ static const char tmpfilename[] = ".\\tmp.inf"; #define A400 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ "aaaaaaaaaaaaaaaa" A256 +#define A1200 A400 A400 A400 #define A511 A255 A256 #define A4097 "a" A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 A256 @@ -61,7 +64,7 @@ static const char tmpfilename[] = ".\\tmp.inf"; "per%%cent=abcd\nper=1\ncent=2\n22=foo\n" \ "big=" A400 "\n" \ "mydrive=\"C:\\\"\n" \ - "verybig=" A400 A400 A400 "\n" + "verybig=" A1200 "\n" /* create a new file with specified contents and open it */ static HINF test_file_contents( const char *data, UINT *err_line ) @@ -245,6 +248,52 @@ static void test_section_names(void) } } +static void test_enum_sections(void) +{ + static const char *contents = STD_HEADER "[s1]\nfoo=bar\n[s2]\nbar=foo\n[s3]\n[strings]\na=b\n"; + + BOOL ret; + DWORD len; + HINF hinf; + UINT err, index; + char buffer[256]; + + if (!pSetupEnumInfSectionsA) + { + win_skip( "SetupEnumInfSectionsA not available\n" ); + return; + } + + hinf = test_file_contents( contents, &err ); + ok( hinf != NULL, "Expected valid INF file\n" ); + + for (index = 0; ; index++) + { + SetLastError( 0xdeadbeef ); + ret = pSetupEnumInfSectionsA( hinf, index, NULL, 0, &len ); + err = GetLastError(); + if (!ret && GetLastError() == ERROR_NO_MORE_ITEMS) break; + ok( ret, "SetupEnumInfSectionsA failed\n" ); + ok( len == 3 || len == 8, "wrong len %u\n", len ); + + SetLastError( 0xdeadbeef ); + ret = pSetupEnumInfSectionsA( hinf, index, NULL, sizeof(buffer), &len ); + err = GetLastError(); + ok( !ret, "SetupEnumInfSectionsA succeeded\n" ); + ok( err == ERROR_INVALID_USER_BUFFER, "wrong error %u\n", err ); + ok( len == 3 || len == 8, "wrong len %u\n", len ); + + SetLastError( 0xdeadbeef ); + ret = pSetupEnumInfSectionsA( hinf, index, buffer, sizeof(buffer), &len ); + ok( ret, "SetupEnumInfSectionsA failed err %u\n", GetLastError() ); + ok( len == 3 || len == 8, "wrong len %u\n", len ); + ok( !lstrcmpi( buffer, "version" ) || !lstrcmpi( buffer, "s1" ) || + !lstrcmpi( buffer, "s2" ) || !lstrcmpi( buffer, "s3" ) || !lstrcmpi( buffer, "strings" ), + "bad section '%s'\n", buffer ); + } + SetupCloseInfFile( hinf ); +} + /* Test various key and value names */ @@ -315,7 +364,7 @@ static const struct { "loop=%loop%\n" STR_SECTION, "loop", { "%loop2%" } }, { "%per%%cent%=100\n" STR_SECTION, "12", { "100" } }, { "a=%big%\n" STR_SECTION, "a", { A400 } }, - { "a=%verybig%\n" STR_SECTION, "a", { A511 } }, /* truncated to 511 */ + { "a=%verybig%\n" STR_SECTION, "a", { A511 } }, /* truncated to 511, not on Vista/W2K8 */ { "a=%big%%big%%big%%big%\n" STR_SECTION, "a", { A400 A400 A400 A400 } }, { "a=%big%%big%%big%%big%%big%%big%%big%%big%%big%\n" STR_SECTION, "a", { A400 A400 A400 A400 A400 A400 A400 A400 A400 } }, { "a=%big%%big%%big%%big%%big%%big%%big%%big%%big%%big%%big%\n" STR_SECTION, "a", { A4097 /*MAX_INF_STRING_LENGTH+1*/ } }, @@ -384,8 +433,21 @@ static void test_key_names(void) { ok( err == 0, "line %u: bad error %u\n", i, err ); if (key_names[i].fields[index]) - ok( !strcmp( field, key_names[i].fields[index] ), "line %u: bad field %s/%s\n", - i, field, key_names[i].fields[index] ); + { + if (i == 49) + ok( !strcmp( field, key_names[i].fields[index] ) || + !strcmp( field, A1200), /* Vista, W2K8 */ + "line %u: bad field %s/%s\n", + i, field, key_names[i].fields[index] ); + else /* don't compare drive letter of paths */ + if (field[0] && field[1] == ':' && field[2] == '\\') + ok( !strcmp( field + 1, key_names[i].fields[index] + 1 ), + "line %u: bad field %s/%s\n", + i, field, key_names[i].fields[index] ); + else + ok( !strcmp( field, key_names[i].fields[index] ), "line %u: bad field %s/%s\n", + i, field, key_names[i].fields[index] ); + } else ok( 0, "line %u: got extra field %s\n", i, field ); strcat( buffer, "," ); @@ -416,12 +478,15 @@ static void test_close_inf_file(void) { SetLastError(0xdeadbeef); SetupCloseInfFile(NULL); - ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %u\n", GetLastError()); + ok(GetLastError() == 0xdeadbeef || + GetLastError() == ERROR_INVALID_PARAMETER, /* Win9x, WinMe */ + "Expected 0xdeadbeef, got %u\n", GetLastError()); SetLastError(0xdeadbeef); SetupCloseInfFile(INVALID_HANDLE_VALUE); - ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %u\n", GetLastError()); - + ok(GetLastError() == 0xdeadbeef || + GetLastError() == ERROR_INVALID_PARAMETER, /* Win9x, WinMe */ + "Expected 0xdeadbeef, got %u\n", GetLastError()); } static const char *contents = "[Version]\n" @@ -447,6 +512,7 @@ static void test_pSetupGetField(void) LPCWSTR field; INFCONTEXT context; int i; + int len; hinf = test_file_contents( contents, &err ); ok( hinf != NULL, "Expected valid INF file\n" ); @@ -465,7 +531,11 @@ static void test_pSetupGetField(void) field = pSetupGetField( &context, 3 ); ok( field != NULL, "Failed to get field 3\n" ); - ok( lstrlenW( field ) == 511, "Expected 511, got %d\n", lstrlenW( field ) ); + len = lstrlenW( field ); + ok( len == 511 /* NT4, W2K, XP and W2K3 */ || + len == 4096 /* Vista */ || + len == 256 /* Win9x and WinME */, + "Unexpected length, got %d\n", len ); field = pSetupGetField( &context, 4 ); ok( field == NULL, "Expected NULL, got %p\n", field ); @@ -519,18 +589,18 @@ static void test_SetupGetIntField(void) retb = SetupGetIntField( &context, keys[i].index, &intfield ); if ( keys[i].err == ERROR_SUCCESS ) { - ok( retb, "Expected success\n" ); + ok( retb, "%u: Expected success\n", i ); ok( GetLastError() == ERROR_SUCCESS || GetLastError() == 0xdeadbeef /* win9x, NT4 */, - "Expected ERROR_SUCCESS or 0xdeadbeef, got %u\n", GetLastError() ); + "%u: Expected ERROR_SUCCESS or 0xdeadbeef, got %u\n", i, GetLastError() ); } else { - ok( !retb, "Expected failure\n" ); + ok( !retb, "%u: Expected failure\n", i ); ok( GetLastError() == keys[i].err, - "Expected %d, got %u\n", keys[i].err, GetLastError() ); + "%u: Expected %d, got %u\n", i, keys[i].err, GetLastError() ); } - ok( intfield == keys[i].value, "Expected %d, got %d\n", keys[i].value, intfield ); + ok( intfield == keys[i].value, "%u: Expected %d, got %d\n", i, keys[i].value, intfield ); SetupCloseInfFile( hinf ); } @@ -655,6 +725,7 @@ START_TEST(parser) init_function_pointers(); test_invalid_files(); test_section_names(); + test_enum_sections(); test_key_names(); test_close_inf_file(); test_pSetupGetField(); diff --git a/rostests/winetests/setupapi/query.c b/rostests/winetests/setupapi/query.c index 87f167306ca..0b7883c6289 100644 --- a/rostests/winetests/setupapi/query.c +++ b/rostests/winetests/setupapi/query.c @@ -43,56 +43,68 @@ static void get_directories(void) WIN_DIR[len-1] = 0; } -static void append_str(char **str, const char *data) -{ - sprintf(*str, data); - *str += strlen(*str); -} +static const char inf_data1[] = + "[Version]\n" + "Signature=\"$Chicago$\"\n" + "AdvancedINF=2.5\n" + "[SourceDisksNames]\n" + "2 = %SrcDiskName%, LANCOM\\LANtools\\lanconf.cab\n" + "[SourceDisksFiles]\n" + "lanconf.exe = 2\n" + "[DestinationDirs]\n" + "DefaultDestDir = 24, %DefaultDest%\n" + "[Strings]\n" + "LangDir = english\n" + "DefaultDest = LANCOM\n" + "SrcDiskName = \"LANCOM Software CD\"\n"; -static void create_inf_file(LPSTR filename) +static const char inf_data2[] = + "[SourceFileInfo]\n" + "sp1qfe\\bitsinst.exe=250B3702C7CCD7C2F9E4DAA1555C933E,000600060A28062C,27136,SP1QFE\n" + "sp1qfe\\bitsprx2.dll=4EBEA67F4BB4EB402E725CA7CA2857AE,000600060A280621,7680,SP1QFE\n" + "sp1qfe\\bitsprx3.dll=C788A1D9330DA011EF25E95D3BC7BDE5,000600060A280621,7168,SP1QFE\n" + "sp1qfe\\qmgr.dll=696AC82FB290A03F205901442E0E9589,000600060A280621,361984,SP1QFE\n" + "sp1qfe\\qmgrprxy.dll=8B5848144829E1BC985EA4C3D8CA7E3F,000600060A280621,17408,SP1QFE\n" + "sp1qfe\\winhttp.dll=3EC6F518114606CA59D4160322077437,000500010A280615,331776,SP1QFE\n" + "sp1qfe\\xpob2res.dll=DB83156B9F496F20D1EA70E4ABEC0166,000500010A280622,158720,SP1QFE\n"; + +static const char inf_data3[] = + "[Version]\n" + "Signature = \"$Windows NT$\"\n" + "[DestinationDirs]\n" + "CopyAlways.Windir.files = 10\n" + "[CopyAlways.Windir.Files]\n" + "WindowsCodecs.dll\n"; + +static const char inf_data4[] = + "[Version]\n" + "Signature = \"$Windows NT$\"\n" + "[CopyAlways.System32.Files]\n" + "WindowsCodecs.dll\n"; + +static const char inf_data5[] = + "[Version]\n" + "Signature = \"$Windows NT$\"\n" + "[DestinationDirs]\n" + "DefaultDestDir = 11\n" + "CopyAlways.Windir.files = 10\n" + "[CopyAlways.Windir.Files]\n" + "WindowsCodecs.dll\n"; + +static const char inf_data6[] = + "[Version]\n" + "Signature = \"$Windows NT$\"\n" + "[DestinationDirs]\n" + "DefaultDestDir = 10\n" + "[CopyAlways.Windir.Files]\n" + "WindowsCodecs.dll\n"; + +static void create_inf_file(LPSTR filename, const char *data, DWORD size) { - char data[1024]; - char *ptr = data; DWORD dwNumberOfBytesWritten; HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - append_str(&ptr, "[Version]\n"); - append_str(&ptr, "Signature=\"$Chicago$\"\n"); - append_str(&ptr, "AdvancedINF=2.5\n"); - append_str(&ptr, "[SourceDisksNames]\n"); - append_str(&ptr, "2 = %%SrcDiskName%%, LANCOM\\LANtools\\lanconf.cab\n"); - append_str(&ptr, "[SourceDisksFiles]\n"); - append_str(&ptr, "lanconf.exe = 2\n"); - append_str(&ptr, "[DestinationDirs]\n"); - append_str(&ptr, "DefaultDestDir = 24, %%DefaultDest%%\n"); - append_str(&ptr, "[Strings]\n"); - append_str(&ptr, "LangDir = english\n"); - append_str(&ptr, "DefaultDest = LANCOM\n"); - append_str(&ptr, "SrcDiskName = \"LANCOM Software CD\"\n"); - - WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL); - CloseHandle(hf); -} - -static void create_inf_file2(LPSTR filename) -{ - char data[1024]; - char *ptr = data; - DWORD dwNumberOfBytesWritten; - HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - append_str(&ptr, "[SourceFileInfo]\n"); - append_str(&ptr, "sp1qfe\\bitsinst.exe=250B3702C7CCD7C2F9E4DAA1555C933E,000600060A28062C,27136,SP1QFE\n"); - append_str(&ptr, "sp1qfe\\bitsprx2.dll=4EBEA67F4BB4EB402E725CA7CA2857AE,000600060A280621,7680,SP1QFE\n"); - append_str(&ptr, "sp1qfe\\bitsprx3.dll=C788A1D9330DA011EF25E95D3BC7BDE5,000600060A280621,7168,SP1QFE\n"); - append_str(&ptr, "sp1qfe\\qmgr.dll=696AC82FB290A03F205901442E0E9589,000600060A280621,361984,SP1QFE\n"); - append_str(&ptr, "sp1qfe\\qmgrprxy.dll=8B5848144829E1BC985EA4C3D8CA7E3F,000600060A280621,17408,SP1QFE\n"); - append_str(&ptr, "sp1qfe\\winhttp.dll=3EC6F518114606CA59D4160322077437,000500010A280615,331776,SP1QFE\n"); - append_str(&ptr, "sp1qfe\\xpob2res.dll=DB83156B9F496F20D1EA70E4ABEC0166,000500010A280622,158720,SP1QFE\n"); - - WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL); + WriteFile(hf, data, size, &dwNumberOfBytesWritten, NULL); CloseHandle(hf); } @@ -136,6 +148,7 @@ static void test_SetupGetInfInformation(void) PSP_INF_INFORMATION info; CHAR inf_filename[MAX_PATH]; CHAR inf_one[MAX_PATH], inf_two[MAX_PATH]; + LPSTR revfile; DWORD size; HINF hinf; BOOL ret; @@ -149,20 +162,30 @@ static void test_SetupGetInfInformation(void) SetLastError(0xbeefcafe); ret = SetupGetInfInformationA(NULL, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size); ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n"); - ok(GetLastError() == ERROR_INVALID_HANDLE, + ok(GetLastError() == ERROR_INVALID_HANDLE || + broken(GetLastError() == ERROR_BAD_PATHNAME) || /* win95 */ + broken(GetLastError() == ERROR_FILE_NOT_FOUND) || /* win98 */ + broken(GetLastError() == ERROR_PATH_NOT_FOUND) || /* NT4 */ + broken(GetLastError() == ERROR_INVALID_NAME) || /* win2k */ + broken(GetLastError() == ERROR_GENERAL_SYNTAX), /* another win2k */ "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); ok(size == 0xdeadbeef, "Expected size to remain unchanged\n"); /* try an invalid inf filename */ - size = 0xdeadbeef; - SetLastError(0xbeefcafe); - ret = SetupGetInfInformationA(NULL, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size); - ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); - ok(size == 0xdeadbeef, "Expected size to remain unchanged\n"); + /* do not use NULL as absolute inf filename on win9x (crash) */ + if ((GetLastError() != ERROR_BAD_PATHNAME) && /* win95 */ + (GetLastError() != ERROR_FILE_NOT_FOUND)) /* win98 */ + { + size = 0xdeadbeef; + SetLastError(0xbeefcafe); + ret = SetupGetInfInformationA(NULL, INFINFO_INF_NAME_IS_ABSOLUTE, NULL, 0, &size); + ok(ret == FALSE, "Expected SetupGetInfInformation to fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + ok(size == 0xdeadbeef, "Expected size to remain unchanged\n"); + } - create_inf_file(inf_filename); + create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1); /* try an invalid search flag */ size = 0xdeadbeef; @@ -231,22 +254,32 @@ static void test_SetupGetInfInformation(void) ok(check_info_filename(info, inf_filename), "Expected returned filename to be equal\n"); SetupCloseInfFile(hinf); - lstrcpyA(inf_one, WIN_DIR); - lstrcatA(inf_one, "\\inf\\"); - lstrcatA(inf_one, "test.inf"); - create_inf_file(inf_one); - lstrcpyA(inf_two, WIN_DIR); lstrcatA(inf_two, "\\system32\\"); lstrcatA(inf_two, "test.inf"); - create_inf_file(inf_two); + create_inf_file(inf_two, inf_data1, sizeof(inf_data1) - 1); + + HeapFree(GetProcessHeap(), 0, info); + info = alloc_inf_info("test.inf", INFINFO_DEFAULT_SEARCH, &size); + + /* check if system32 is searched for inf */ + ret = SetupGetInfInformationA("test.inf", INFINFO_DEFAULT_SEARCH, info, size, &size); + if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) + revfile = inf_one; /* Vista */ + else + revfile = inf_two; + + lstrcpyA(inf_one, WIN_DIR); + lstrcatA(inf_one, "\\inf\\"); + lstrcatA(inf_one, "test.inf"); + create_inf_file(inf_one, inf_data1, sizeof(inf_data1) - 1); HeapFree(GetProcessHeap(), 0, info); info = alloc_inf_info("test.inf", INFINFO_DEFAULT_SEARCH, &size); /* test the INFINFO_DEFAULT_SEARCH search flag */ ret = SetupGetInfInformationA("test.inf", INFINFO_DEFAULT_SEARCH, info, size, &size); - ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n"); + ok(ret == TRUE, "Expected SetupGetInfInformation to succeed: %d\n", GetLastError()); ok(check_info_filename(info, inf_one), "Expected returned filename to be equal\n"); HeapFree(GetProcessHeap(), 0, info); @@ -255,7 +288,9 @@ static void test_SetupGetInfInformation(void) /* test the INFINFO_REVERSE_DEFAULT_SEARCH search flag */ ret = SetupGetInfInformationA("test.inf", INFINFO_REVERSE_DEFAULT_SEARCH, info, size, &size); ok(ret == TRUE, "Expected SetupGetInfInformation to succeed\n"); - ok(check_info_filename(info, inf_two), "Expected returned filename to be equal\n"); + ok(check_info_filename(info, revfile), "Expected returned filename to be equal\n"); + + HeapFree(GetProcessHeap(), 0, info); DeleteFileA(inf_filename); DeleteFileA(inf_one); @@ -274,7 +309,7 @@ static void test_SetupGetSourceFileLocation(void) lstrcatA(inf_filename, "\\"); lstrcatA(inf_filename, "test.inf"); - create_inf_file(inf_filename); + create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1); hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); @@ -292,7 +327,7 @@ static void test_SetupGetSourceFileLocation(void) SetupCloseInfFile(hinf); DeleteFileA(inf_filename); - create_inf_file2(inf_filename); + create_inf_file(inf_filename, inf_data2, sizeof(inf_data2) - 1); SetLastError(0xdeadbeef); hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); @@ -321,7 +356,7 @@ static void test_SetupGetSourceInfo(void) lstrcatA(inf_filename, "\\"); lstrcatA(inf_filename, "test.inf"); - create_inf_file(inf_filename); + create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1); hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); @@ -359,6 +394,7 @@ static void test_SetupGetSourceInfo(void) static void test_SetupGetTargetPath(void) { char buffer[MAX_PATH], inf_filename[MAX_PATH]; + char destfile[MAX_PATH]; DWORD required; HINF hinf; INFCONTEXT ctx; @@ -368,7 +404,7 @@ static void test_SetupGetTargetPath(void) lstrcatA(inf_filename, "\\"); lstrcatA(inf_filename, "test.inf"); - create_inf_file(inf_filename); + create_inf_file(inf_filename, inf_data1, sizeof(inf_data1) - 1); hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); @@ -382,9 +418,86 @@ static void test_SetupGetTargetPath(void) ret = SetupGetTargetPathA(hinf, &ctx, NULL, buffer, sizeof(buffer), &required); ok(ret, "SetupGetTargetPathA failed\n"); - ok(required == 10, "unexpected required size: %d\n", required); - ok(!lstrcmpiA("C:\\LANCOM", buffer), "unexpected result string: %s\n", buffer); + /* Retrieve the system drive from the windows directory. + * (%SystemDrive% is not available on Win9x) + */ + lstrcpyA(destfile, WIN_DIR); + destfile[3] = '\0'; + lstrcatA(destfile, "LANCOM"); + ok(!lstrcmpiA(destfile, buffer), "unexpected result string: %s\n", buffer); + + SetupCloseInfFile(hinf); + DeleteFileA(inf_filename); + + create_inf_file(inf_filename, inf_data3, sizeof(inf_data3) - 1); + + hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); + ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); + + required = 0; + + ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required); + ok(ret, "SetupGetTargetPathA failed\n"); + + lstrcpyA(destfile, WIN_DIR); + + ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required); + ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer); + + SetupCloseInfFile(hinf); + DeleteFileA(inf_filename); + + create_inf_file(inf_filename, inf_data4, sizeof(inf_data4) - 1); + + hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); + ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); + + required = 0; + + ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.System32.Files", buffer, sizeof(buffer), &required); + ok(ret, "SetupGetTargetPathA failed\n"); + + GetSystemDirectoryA(destfile, MAX_PATH); + + ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required); + ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer); + + SetupCloseInfFile(hinf); + DeleteFileA(inf_filename); + + create_inf_file(inf_filename, inf_data5, sizeof(inf_data5) - 1); + + hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); + ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); + + required = 0; + + ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required); + ok(ret, "SetupGetTargetPathA failed\n"); + + lstrcpyA(destfile, WIN_DIR); + + ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required); + ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer); + + SetupCloseInfFile(hinf); + DeleteFileA(inf_filename); + + create_inf_file(inf_filename, inf_data6, sizeof(inf_data6) - 1); + + hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_WIN4, NULL); + ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n"); + + required = 0; + + ret = SetupGetTargetPathA(hinf, NULL, "CopyAlways.Windir.Files", buffer, sizeof(buffer), &required); + ok(ret, "SetupGetTargetPathA failed\n"); + + lstrcpyA(destfile, WIN_DIR); + + ok(required == lstrlenA(destfile) + 1, "unexpected required size: %d\n", required); + ok(!lstrcmpiA(buffer, destfile), "unexpected path: %s\n", buffer); SetupCloseInfFile(hinf); DeleteFileA(inf_filename); diff --git a/rostests/winetests/setupapi/stringtable.c b/rostests/winetests/setupapi/stringtable.c index 4eca3318553..cecfc237188 100644 --- a/rostests/winetests/setupapi/stringtable.c +++ b/rostests/winetests/setupapi/stringtable.c @@ -37,10 +37,13 @@ #define ST_CASE_SENSITIVE_COMPARE 0x00000001 static DWORD (WINAPI *pStringTableAddString)(HSTRING_TABLE, LPWSTR, DWORD); +static DWORD (WINAPI *pStringTableAddStringEx)(HSTRING_TABLE, LPWSTR, DWORD, LPVOID, DWORD); static VOID (WINAPI *pStringTableDestroy)(HSTRING_TABLE); static HSTRING_TABLE (WINAPI *pStringTableDuplicate)(HSTRING_TABLE hStringTable); static HSTRING_TABLE (WINAPI *pStringTableInitialize)(VOID); +static HSTRING_TABLE (WINAPI *pStringTableInitializeEx)(DWORD, DWORD); static DWORD (WINAPI *pStringTableLookUpString)(HSTRING_TABLE, LPWSTR, DWORD); +static DWORD (WINAPI *pStringTableLookUpStringEx)(HSTRING_TABLE, LPWSTR, DWORD, LPVOID, DWORD); static LPWSTR (WINAPI *pStringTableStringFromId)(HSTRING_TABLE, DWORD); #if 0 static BOOL (WINAPI *pStringTableStringFromIdEx)(HSTRING_TABLE, DWORD, LPWSTR, LPDWORD); @@ -51,8 +54,6 @@ HMODULE hdll; static WCHAR string[] = {'s','t','r','i','n','g',0}; static WCHAR String[] = {'S','t','r','i','n','g',0}; static WCHAR foo[] = {'f','o','o',0}; -DWORD hstring, hString, hfoo; /* Handles pointing to our strings */ -HANDLE table, table2; /* Handles pointing to our tables */ static void load_it_up(void) { @@ -62,10 +63,18 @@ static void load_it_up(void) if (!pStringTableInitialize) pStringTableInitialize = (void*)GetProcAddress(hdll, "pSetupStringTableInitialize"); + pStringTableInitializeEx = (void*)GetProcAddress(hdll, "StringTableInitializeEx"); + if (!pStringTableInitializeEx) + pStringTableInitializeEx = (void*)GetProcAddress(hdll, "pSetupStringTableInitializeEx"); + pStringTableAddString = (void*)GetProcAddress(hdll, "StringTableAddString"); if (!pStringTableAddString) pStringTableAddString = (void*)GetProcAddress(hdll, "pSetupStringTableAddString"); + pStringTableAddStringEx = (void*)GetProcAddress(hdll, "StringTableAddStringEx"); + if (!pStringTableAddStringEx) + pStringTableAddStringEx = (void*)GetProcAddress(hdll, "pSetupStringTableAddStringEx"); + pStringTableDuplicate = (void*)GetProcAddress(hdll, "StringTableDuplicate"); if (!pStringTableDuplicate) pStringTableDuplicate = (void*)GetProcAddress(hdll, "pSetupStringTableDuplicate"); @@ -78,20 +87,22 @@ static void load_it_up(void) if (!pStringTableLookUpString) pStringTableLookUpString = (void*)GetProcAddress(hdll, "pSetupStringTableLookUpString"); + pStringTableLookUpStringEx = (void*)GetProcAddress(hdll, "StringTableLookUpStringEx"); + if (!pStringTableLookUpStringEx) + pStringTableLookUpStringEx = (void*)GetProcAddress(hdll, "pSetupStringTableLookUpStringEx"); + pStringTableStringFromId = (void*)GetProcAddress(hdll, "StringTableStringFromId"); if (!pStringTableStringFromId) pStringTableStringFromId = (void*)GetProcAddress(hdll, "pSetupStringTableStringFromId"); } -static void test_StringTableInitialize(void) -{ - table=pStringTableInitialize(); - ok(table!=NULL,"Failed to Initialize String Table\n"); -} - static void test_StringTableAddString(void) { - DWORD retval; + DWORD retval, hstring, hString, hfoo; + HANDLE table; + + table = pStringTableInitialize(); + ok(table != NULL, "failed to initialize string table\n"); /* case insensitive */ hstring=pStringTableAddString(table,string,0); @@ -108,18 +119,71 @@ static void test_StringTableAddString(void) /* case sensitive */ hString=pStringTableAddString(table,String,ST_CASE_SENSITIVE_COMPARE); ok(hstring!=hString,"String handle and string share same ID %x in Table\n", hstring); + + pStringTableDestroy(table); +} + +static void test_StringTableAddStringEx(void) +{ + DWORD retval, hstring, hString, hfoo; + HANDLE table; + + table = pStringTableInitialize(); + ok(table != NULL,"Failed to Initialize String Table\n"); + + /* case insensitive */ + hstring = pStringTableAddStringEx(table, string, 0, NULL, 0); + ok(hstring != ~0u, "Failed to add string to String Table\n"); + + retval = pStringTableAddStringEx(table, String, 0, NULL, 0); + ok(retval != ~0u, "Failed to add String to String Table\n"); + ok(hstring == retval, "string handle %x != String handle %x in String Table\n", hstring, retval); + + hfoo = pStringTableAddStringEx(table, foo, 0, NULL, 0); + ok(hfoo != ~0u, "Failed to add foo to String Table\n"); + ok(hfoo != hstring, "foo and string share the same ID %x in String Table\n", hfoo); + + /* case sensitive */ + hString = pStringTableAddStringEx(table, String, ST_CASE_SENSITIVE_COMPARE, NULL, 0); + ok(hstring != hString, "String handle and string share same ID %x in Table\n", hstring); + + pStringTableDestroy(table); } static void test_StringTableDuplicate(void) { + HANDLE table, table2; + + table = pStringTableInitialize(); + ok(table != NULL,"Failed to Initialize String Table\n"); + table2=pStringTableDuplicate(table); ok(table2!=NULL,"Failed to duplicate String Table\n"); + + pStringTableDestroy(table); + pStringTableDestroy(table2); } static void test_StringTableLookUpString(void) { - DWORD retval, retval2; - + DWORD retval, retval2, hstring, hString, hfoo; + HANDLE table, table2; + + table = pStringTableInitialize(); + ok(table != NULL,"failed to initialize string table\n"); + + hstring = pStringTableAddString(table, string, 0); + ok(hstring != ~0u, "failed to add 'string' to string table\n"); + + hString = pStringTableAddString(table, String, 0); + ok(hString != ~0u,"failed to add 'String' to string table\n"); + + hfoo = pStringTableAddString(table, foo, 0); + ok(hfoo != ~0u, "failed to add 'foo' to string table\n"); + + table2 = pStringTableDuplicate(table); + ok(table2 != NULL, "Failed to duplicate String Table\n"); + /* case insensitive */ retval=pStringTableLookUpString(table,string,0); ok(retval!=-1,"Failed find string in String Table 1\n"); @@ -149,16 +213,109 @@ static void test_StringTableLookUpString(void) retval=pStringTableLookUpString(table,string,ST_CASE_SENSITIVE_COMPARE); retval2=pStringTableLookUpString(table,String,ST_CASE_SENSITIVE_COMPARE); ok(retval!=retval2,"Lookup of string equals String in Table 1\n"); - ok(retval2==hString, + ok(retval==hString, "Lookup for String (%x) does not match previous handle (%x) in String Table 1\n", - retval, hString); + retval, hString); + + pStringTableDestroy(table); + pStringTableDestroy(table2); +} + +static void test_StringTableLookUpStringEx(void) +{ + static WCHAR uilevel[] = {'U','I','L','E','V','E','L',0}; + DWORD retval, retval2, hstring, hString, hfoo, data; + HANDLE table, table2; + char buffer[4]; + + table = pStringTableInitialize(); + ok(table != NULL,"Failed to Initialize String Table\n"); + + hstring = pStringTableAddString(table, string, 0); + ok(hstring != ~0u, "failed to add 'string' to string table\n"); + + hString = pStringTableAddString(table, String, 0); + ok(hString != ~0u,"failed to add 'String' to string table\n"); + + hfoo = pStringTableAddString(table, foo, 0); + ok(hfoo != ~0u, "failed to add 'foo' to string table\n"); + + table2 = pStringTableDuplicate(table); + ok(table2 != NULL, "Failed to duplicate String Table\n"); + + /* case insensitive */ + retval = pStringTableLookUpStringEx(table, string, 0, NULL, 0); + ok(retval != ~0u, "Failed find string in String Table 1\n"); + ok(retval == hstring, + "Lookup for string (%x) does not match previous handle (%x) in String Table 1\n", + retval, hstring); + + retval = pStringTableLookUpStringEx(table2, string, 0, NULL, 0); + ok(retval != ~0u, "Failed find string in String Table 2\n"); + + retval = pStringTableLookUpStringEx(table, String, 0, NULL, 0); + ok(retval != ~0u, "Failed find String in String Table 1\n"); + + retval = pStringTableLookUpStringEx(table2, String, 0, NULL, 0); + ok(retval != ~0u, "Failed find String in String Table 2\n"); + + retval=pStringTableLookUpStringEx(table, foo, 0, NULL, 0); + ok(retval != ~0u, "Failed find foo in String Table 1\n"); + ok(retval == hfoo, + "Lookup for foo (%x) does not match previous handle (%x) in String Table 1\n", + retval, hfoo); + + retval = pStringTableLookUpStringEx(table2, foo, 0, NULL, 0); + ok(retval != ~0u, "Failed find foo in String Table 2\n"); + + /* case sensitive */ + retval = pStringTableLookUpStringEx(table, string,ST_CASE_SENSITIVE_COMPARE, NULL, 0); + retval2 = pStringTableLookUpStringEx(table, String, ST_CASE_SENSITIVE_COMPARE, NULL, 0); + ok(retval != retval2, "Lookup of string equals String in Table 1\n"); + ok(retval == hString, + "Lookup for String (%x) does not match previous handle (%x) in String Table 1\n", + retval, hString); + + pStringTableDestroy(table); + + table = pStringTableInitializeEx(0x1000, 0); + ok(table != NULL, "failed to initialize string table\n"); + + data = 0xaaaaaaaa; + retval = pStringTableAddStringEx(table, uilevel, 0x5, &data, sizeof(data)); + ok(retval != ~0u, "failed to add 'UILEVEL' to string table\n"); + + memset(buffer, 0x55, sizeof(buffer)); + retval = pStringTableLookUpStringEx(table, uilevel, ST_CASE_SENSITIVE_COMPARE, buffer, 0); + ok(retval != ~0u, "failed find 'UILEVEL' in string table\n"); + ok(memcmp(buffer, &data, 4), "unexpected data\n"); + + memset(buffer, 0x55, sizeof(buffer)); + retval = pStringTableLookUpStringEx(table, uilevel, ST_CASE_SENSITIVE_COMPARE, buffer, 2); + ok(retval != ~0u, "failed find 'UILEVEL' in string table\n"); + ok(!memcmp(buffer, &data, 2), "unexpected data\n"); + + memset(buffer, 0x55, sizeof(buffer)); + retval = pStringTableLookUpStringEx(table, uilevel, ST_CASE_SENSITIVE_COMPARE, buffer, sizeof(buffer)); + ok(retval != ~0u, "failed find 'UILEVEL' in string table\n"); + ok(!memcmp(buffer, &data, 4), "unexpected data\n"); + + pStringTableDestroy(table); } static void test_StringTableStringFromId(void) { - WCHAR *string2, *string3; + HANDLE table; + DWORD hstring; + WCHAR *string2; int result; + table = pStringTableInitialize(); + ok(table != NULL,"Failed to Initialize String Table\n"); + + hstring = pStringTableAddString(table, string, 0); + ok(hstring != ~0u,"failed to add 'string' to string table\n"); + /* correct */ string2=pStringTableStringFromId(table,pStringTableLookUpString(table,string,0)); ok(string2!=NULL,"Failed to look up string by ID from String Table\n"); @@ -166,25 +323,17 @@ static void test_StringTableStringFromId(void) result=lstrcmpiW(string, string2); ok(result==0,"StringID %p does not match requested StringID %p\n",string,string2); - /* This should never work */ - string3=pStringTableStringFromId(table,0); - ok(string3!=NULL,"Failed to look up string by ID from String Table\n"); - - result=lstrcmpiW(string, string3); - ok(result!=0,"StringID %p matches requested StringID %p\n",string,string3); + pStringTableDestroy(table); } START_TEST(stringtable) { load_it_up(); - test_StringTableInitialize(); test_StringTableAddString(); + test_StringTableAddStringEx(); test_StringTableDuplicate(); test_StringTableLookUpString(); + test_StringTableLookUpStringEx(); test_StringTableStringFromId(); - - /* assume we can always destroy */ - pStringTableDestroy(table); - pStringTableDestroy(table2); } diff --git a/rostests/winetests/shdocvw/webbrowser.c b/rostests/winetests/shdocvw/webbrowser.c index 64c5bab2f6f..2f1c7d717b7 100644 --- a/rostests/winetests/shdocvw/webbrowser.c +++ b/rostests/winetests/shdocvw/webbrowser.c @@ -30,6 +30,7 @@ #include "exdisp.h" #include "htiframe.h" #include "mshtmhst.h" +#include "mshtmcid.h" #include "idispids.h" #include "olectl.h" #include "mshtmdid.h" @@ -104,6 +105,11 @@ DEFINE_EXPECT(Invoke_ONTOOLBAR); DEFINE_EXPECT(Invoke_ONFULLSCREEN); DEFINE_EXPECT(Invoke_ONTHEATERMODE); DEFINE_EXPECT(Invoke_WINDOWSETRESIZABLE); +DEFINE_EXPECT(Invoke_TITLECHANGE); +DEFINE_EXPECT(Invoke_NAVIGATECOMPLETE2); +DEFINE_EXPECT(Invoke_PROGRESSCHANGE); +DEFINE_EXPECT(Invoke_DOCUMENTCOMPLETE); +DEFINE_EXPECT(Invoke_282); DEFINE_EXPECT(EnableModeless_TRUE); DEFINE_EXPECT(EnableModeless_FALSE); DEFINE_EXPECT(GetHostInfo); @@ -116,6 +122,10 @@ DEFINE_EXPECT(Exec_SETDOWNLOADSTATE_1); DEFINE_EXPECT(Exec_SETPROGRESSMAX); DEFINE_EXPECT(Exec_SETPROGRESSPOS); DEFINE_EXPECT(QueryStatus_SETPROGRESSTEXT); +DEFINE_EXPECT(QueryStatus_STOP); +DEFINE_EXPECT(DocHost_EnableModeless_TRUE); +DEFINE_EXPECT(DocHost_EnableModeless_FALSE); +DEFINE_EXPECT(GetDropTarget); static const WCHAR wszItem[] = {'i','t','e','m',0}; static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; @@ -125,6 +135,7 @@ static VARIANT_BOOL exvb; static IWebBrowser2 *wb; static HWND container_hwnd, shell_embedding_hwnd; +static BOOL is_downloading = FALSE; static const char *debugstr_w(LPCWSTR str) { @@ -194,6 +205,10 @@ static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, con ok(!pCmdText, "pCmdText != NULL\n"); switch(prgCmds[0].cmdID) { + case OLECMDID_STOP: + CHECK_EXPECT2(QueryStatus_STOP); + prgCmds[0].cmdf = OLECMDF_SUPPORTED; + return S_OK; case OLECMDID_SETPROGRESSTEXT: CHECK_EXPECT(QueryStatus_SETPROGRESSTEXT); prgCmds[0].cmdf = OLECMDF_ENABLED; @@ -211,7 +226,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID if(!pguidCmdGroup) { switch(nCmdID) { case OLECMDID_SETPROGRESSMAX: - CHECK_EXPECT(Exec_SETPROGRESSMAX); + CHECK_EXPECT2(Exec_SETPROGRESSMAX); ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt); ok(pvaIn != NULL, "pvaIn == NULL\n"); if(pvaIn) @@ -219,7 +234,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut); return S_OK; case OLECMDID_SETPROGRESSPOS: - CHECK_EXPECT(Exec_SETPROGRESSPOS); + CHECK_EXPECT2(Exec_SETPROGRESSPOS); ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt); ok(pvaIn != NULL, "pvaIn == NULL\n"); if(pvaIn) @@ -227,13 +242,17 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut); return S_OK; case OLECMDID_SETDOWNLOADSTATE: - ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt); + if(is_downloading) + ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER || !nCmdexecopt, + "nCmdexecopts=%08x\n", nCmdexecopt); + else + ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt); ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut); ok(pvaIn != NULL, "pvaIn == NULL\n"); ok(V_VT(pvaIn) == VT_I4, "V_VT(pvaIn)=%d\n", V_VT(pvaIn)); switch(V_I4(pvaIn)) { case 0: - CHECK_EXPECT(Exec_SETDOWNLOADSTATE_0); + CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_0); break; case 1: CHECK_EXPECT2(Exec_SETDOWNLOADSTATE_1); @@ -247,12 +266,14 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID } }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) { switch(nCmdID) { - case 24: - return E_FAIL; /* TODO */ - case 25: - return E_FAIL; /* IE5 */ - case 66: - return E_FAIL; /* TODO */ + case 24: /* TODO */ + case 25: /* IE5 */ + case 37: /* TODO */ + case 39: /* TODO */ + case 66: /* TODO */ + case 67: /* TODO */ + case 69: /* TODO */ + return E_FAIL; default: ok(0, "unexpected nCmdID %d\n", nCmdID); } @@ -650,6 +671,30 @@ static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMe test_invoke_bool(pDispParams, TRUE); break; + case DISPID_TITLECHANGE: + CHECK_EXPECT2(Invoke_TITLECHANGE); + /* FIXME */ + break; + + case DISPID_NAVIGATECOMPLETE2: + CHECK_EXPECT(Invoke_NAVIGATECOMPLETE2); + /* FIXME */ + break; + + case DISPID_PROGRESSCHANGE: + CHECK_EXPECT(Invoke_PROGRESSCHANGE); + /* FIXME */ + break; + + case DISPID_DOCUMENTCOMPLETE: + CHECK_EXPECT(Invoke_DOCUMENTCOMPLETE); + /* FIXME */ + break; + + case 282: /* FIXME */ + CHECK_EXPECT2(Invoke_282); + break; + default: ok(0, "unexpected dispIdMember %d\n", dispIdMember); } @@ -850,9 +895,9 @@ static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLE static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable) { if(fEnable) - CHECK_EXPECT(EnableModeless_TRUE); + CHECK_EXPECT2(EnableModeless_TRUE); else - CHECK_EXPECT(EnableModeless_FALSE); + CHECK_EXPECT2(EnableModeless_FALSE); return S_OK; } @@ -1118,8 +1163,12 @@ static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface) static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + if(fEnable) + CHECK_EXPECT(DocHost_EnableModeless_TRUE); + else + CHECK_EXPECT(DocHost_EnableModeless_FALSE); + + return S_OK; } static HRESULT WINAPI DocHostUIHandler_OnDocWindowActivate(IDocHostUIHandler2 *iface, BOOL fActivate) @@ -1162,7 +1211,7 @@ static HRESULT WINAPI DocHostUIHandler_GetOptionKeyPath(IDocHostUIHandler2 *ifac static HRESULT WINAPI DocHostUIHandler_GetDropTarget(IDocHostUIHandler2 *iface, IDropTarget *pDropTarget, IDropTarget **ppDropTarget) { - ok(0, "unexpected call\n"); + CHECK_EXPECT(GetDropTarget); return E_NOTIMPL; } @@ -1371,7 +1420,7 @@ static void test_ClientSite(IUnknown *unk, IOleClientSite *client) SET_EXPECT(Site_GetWindow); SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); SET_EXPECT(Invoke_AMBIENT_SILENT); - }else { + }else if(!is_downloading) { SET_EXPECT(Invoke_DOWNLOADCOMPLETE); SET_EXPECT(Exec_SETDOWNLOADSTATE_0); SET_EXPECT(Invoke_COMMANDSTATECHANGE); @@ -1385,7 +1434,7 @@ static void test_ClientSite(IUnknown *unk, IOleClientSite *client) CHECK_CALLED(Site_GetWindow); CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED); CHECK_CALLED(Invoke_AMBIENT_SILENT); - }else { + }else if(!is_downloading) { todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE); todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE); @@ -2023,6 +2072,88 @@ static void test_Navigate2(IUnknown *unk) IWebBrowser2_Release(webbrowser); } +static void test_download(void) +{ + MSG msg; + + is_downloading = TRUE; + + SET_EXPECT(Exec_SETPROGRESSMAX); + SET_EXPECT(Exec_SETPROGRESSPOS); + SET_EXPECT(Exec_SETDOWNLOADSTATE_1); + SET_EXPECT(DocHost_EnableModeless_FALSE); + SET_EXPECT(DocHost_EnableModeless_TRUE); + SET_EXPECT(Invoke_SETSECURELOCKICON); + SET_EXPECT(Invoke_282); + SET_EXPECT(EnableModeless_FALSE); + SET_EXPECT(Invoke_COMMANDSTATECHANGE); + SET_EXPECT(Invoke_STATUSTEXTCHANGE); + SET_EXPECT(SetStatusText); + SET_EXPECT(EnableModeless_TRUE); + SET_EXPECT(QueryStatus_STOP); + SET_EXPECT(Exec_SETDOWNLOADSTATE_0); + SET_EXPECT(Invoke_TITLECHANGE); + SET_EXPECT(Invoke_NAVIGATECOMPLETE2); + SET_EXPECT(GetDropTarget); + SET_EXPECT(Invoke_PROGRESSCHANGE); + SET_EXPECT(Invoke_DOCUMENTCOMPLETE); + + while(!called_Invoke_DOCUMENTCOMPLETE && GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX); + todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS); + todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1); + CLEAR_CALLED(DocHost_EnableModeless_FALSE); /* IE 7 */ + CLEAR_CALLED(DocHost_EnableModeless_TRUE); /* IE 7 */ + todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON); + CLEAR_CALLED(Invoke_282); /* IE 7 */ + todo_wine CHECK_CALLED(EnableModeless_FALSE); + todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE); + todo_wine CHECK_CALLED(Invoke_STATUSTEXTCHANGE); + todo_wine CHECK_CALLED(SetStatusText); + todo_wine CHECK_CALLED(EnableModeless_TRUE); + todo_wine CHECK_CALLED(QueryStatus_STOP); + todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); + todo_wine CHECK_CALLED(Invoke_TITLECHANGE); + CHECK_CALLED(Invoke_NAVIGATECOMPLETE2); + todo_wine CHECK_CALLED(GetDropTarget); + todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE); + CHECK_CALLED(Invoke_DOCUMENTCOMPLETE); +} + +static void test_olecmd(IUnknown *unk, BOOL loaded) +{ + IOleCommandTarget *cmdtrg; + OLECMD cmds[3]; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IOleCommandTarget, (void**)&cmdtrg); + ok(hres == S_OK, "Could not get IOleCommandTarget iface: %08x\n", hres); + if(FAILED(hres)) + return; + + cmds[0].cmdID = OLECMDID_SPELL; + cmds[0].cmdf = 0xdeadbeef; + cmds[1].cmdID = OLECMDID_REFRESH; + cmds[1].cmdf = 0xdeadbeef; + hres = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 2, cmds, NULL); + if(loaded) { + ok(hres == S_OK, "QueryStatus failed: %08x\n", hres); + ok(cmds[0].cmdf == OLECMDF_SUPPORTED, "OLECMDID_SPELL cmdf = %x\n", cmds[0].cmdf); + ok(cmds[1].cmdf == (OLECMDF_ENABLED|OLECMDF_SUPPORTED), + "OLECMDID_REFRESH cmdf = %x\n", cmds[1].cmdf); + }else { + ok(hres == 0x80040104, "QueryStatus failed: %08x\n", hres); + ok(cmds[0].cmdf == 0xdeadbeef, "OLECMDID_SPELL cmdf = %x\n", cmds[0].cmdf); + ok(cmds[1].cmdf == 0xdeadbeef, "OLECMDID_REFRESH cmdf = %x\n", cmds[0].cmdf); + } + + IOleCommandTarget_Release(cmdtrg); +} + static void test_IServiceProvider(IUnknown *unk) { IServiceProvider *servprov = (void*)0xdeadbeef; @@ -2088,7 +2219,7 @@ static void test_QueryInterface(IUnknown *unk) } -static void test_WebBrowser(void) +static void test_WebBrowser(BOOL do_download) { IUnknown *unk = NULL; ULONG ref; @@ -2100,6 +2231,8 @@ static void test_WebBrowser(void) if(FAILED(hres)) return; + is_downloading = FALSE; + hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb); ok(hres == S_OK, "Could not get IWebBrowser2 iface: %08x\n", hres); @@ -2111,7 +2244,14 @@ static void test_WebBrowser(void) test_Extent(unk); test_wb_funcs(unk, TRUE); test_DoVerb(unk); + test_olecmd(unk, FALSE); test_Navigate2(unk); + + if(do_download) { + test_download(); + test_olecmd(unk, TRUE); + } + test_ClientSite(unk, NULL); test_ie_funcs(unk); test_GetControlInfo(unk); @@ -2162,7 +2302,10 @@ START_TEST(webbrowser) OleInitialize(NULL); - test_WebBrowser(); + trace("Testing WebBrowser (no download)...\n"); + test_WebBrowser(FALSE); + trace("Testing WebBrowser...\n"); + test_WebBrowser(TRUE); OleUninitialize(); diff --git a/rostests/winetests/urlmon/generated.c b/rostests/winetests/urlmon/generated.c index d29c226ca17..8a2f353b043 100644 --- a/rostests/winetests/urlmon/generated.c +++ b/rostests/winetests/urlmon/generated.c @@ -1,4 +1,4 @@ -/* File generated automatically from tools/winapi/test.dat; do not edit! */ +/* File generated automatically from tools/winapi/tests.dat; do not edit! */ /* This file can be copied, modified and distributed without restriction. */ /* @@ -30,22 +30,14 @@ * Windows API extension */ -#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) -# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field) -#elif defined(__GNUC__) -# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field) -#else -/* FIXME: Not sure if is possible to do without compiler extension */ -#endif - #if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) # define _TYPE_ALIGNMENT(type) __alignof(type) #elif defined(__GNUC__) # define _TYPE_ALIGNMENT(type) __alignof__(type) #else /* - * FIXME: Not sure if is possible to do without compiler extension - * (if type is not just a name that is, if so the normal) + * FIXME: May not be possible without a compiler extension + * (if type is not just a name that is, otherwise the normal * TYPE_ALIGNMENT can be used) */ #endif @@ -62,65 +54,51 @@ * Test helper macros */ -#ifdef FIELD_ALIGNMENT -# define TEST_FIELD_ALIGNMENT(type, field, align) \ - ok(FIELD_ALIGNMENT(type, field) == align, \ - "FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \ - (int)FIELD_ALIGNMENT(type, field)) +#ifdef _WIN64 + +# define TEST_TYPE_SIZE(type, size) +# define TEST_TYPE_ALIGN(type, align) +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# define TEST_FIELD_OFFSET(type, field, offset) + #else -# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0) + +# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); + +# ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +# else +# define TEST_TYPE_ALIGN(type, align) +# endif + +# ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +# else +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# endif + +# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #endif -#define TEST_FIELD_OFFSET(type, field, offset) \ - ok(FIELD_OFFSET(type, field) == offset, \ - "FIELD_OFFSET(" #type ", " #field ") == %ld (expected " #offset ")\n", \ - (long int)FIELD_OFFSET(type, field)) +#define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) +#define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) +#define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); +#define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); -#ifdef _TYPE_ALIGNMENT -#define TEST__TYPE_ALIGNMENT(type, align) \ - ok(_TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)_TYPE_ALIGNMENT(type)) -#else -# define TEST__TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#ifdef TYPE_ALIGNMENT -#define TEST_TYPE_ALIGNMENT(type, align) \ - ok(TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)TYPE_ALIGNMENT(type)) -#else -# define TEST_TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#define TEST_TYPE_SIZE(type, size) \ - ok(sizeof(type) == size, "sizeof(" #type ") == %d (expected " #size ")\n", ((int) sizeof(type))) - -/*********************************************************************** - * Test macros - */ - -#define TEST_FIELD(type, field_type, field_name, field_offset, field_size, field_align) \ - TEST_TYPE_SIZE(field_type, field_size); \ - TEST_FIELD_ALIGNMENT(type, field_name, field_align); \ - TEST_FIELD_OFFSET(type, field_name, field_offset); \ - -#define TEST_TYPE(type, size, align) \ - TEST_TYPE_ALIGNMENT(type, align); \ - TEST_TYPE_SIZE(type, size) - -#define TEST_TYPE_POINTER(type, size, align) \ - TEST__TYPE_ALIGNMENT(*(type)0, align); \ - TEST_TYPE_SIZE(*(type)0, size) - -#define TEST_TYPE_SIGNED(type) \ - ok((type) -1 < 0, "(" #type ") -1 < 0\n"); - -#define TEST_TYPE_UNSIGNED(type) \ - ok((type) -1 > 0, "(" #type ") -1 > 0\n"); static void test_pack_BINDINFO(void) { /* BINDINFO (pack 4) */ - TEST_FIELD(BINDINFO, ULONG, cbSize, 0, 4, 4); - TEST_FIELD(BINDINFO, LPWSTR, szExtraInfo, 4, 4, 4); + TEST_FIELD_SIZE (BINDINFO, cbSize, 4) + TEST_FIELD_ALIGN (BINDINFO, cbSize, 4) + TEST_FIELD_OFFSET(BINDINFO, cbSize, 0) + TEST_FIELD_SIZE (BINDINFO, szExtraInfo, 4) + TEST_FIELD_ALIGN (BINDINFO, szExtraInfo, 4) + TEST_FIELD_OFFSET(BINDINFO, szExtraInfo, 4) } static void test_pack_IBindHost(void) @@ -206,106 +184,162 @@ static void test_pack_IWinInetInfoVtbl(void) static void test_pack_LPBINDHOST(void) { /* LPBINDHOST */ - TEST_TYPE(LPBINDHOST, 4, 4); + TEST_TYPE_SIZE (LPBINDHOST, 4) + TEST_TYPE_ALIGN (LPBINDHOST, 4) } static void test_pack_LPBINDING(void) { /* LPBINDING */ - TEST_TYPE(LPBINDING, 4, 4); + TEST_TYPE_SIZE (LPBINDING, 4) + TEST_TYPE_ALIGN (LPBINDING, 4) } static void test_pack_LPBINDSTATUSCALLBACK(void) { /* LPBINDSTATUSCALLBACK */ - TEST_TYPE(LPBINDSTATUSCALLBACK, 4, 4); + TEST_TYPE_SIZE (LPBINDSTATUSCALLBACK, 4) + TEST_TYPE_ALIGN (LPBINDSTATUSCALLBACK, 4) } static void test_pack_LPIINTERNETPROTOCOLINFO(void) { /* LPIINTERNETPROTOCOLINFO */ - TEST_TYPE(LPIINTERNETPROTOCOLINFO, 4, 4); + TEST_TYPE_SIZE (LPIINTERNETPROTOCOLINFO, 4) + TEST_TYPE_ALIGN (LPIINTERNETPROTOCOLINFO, 4) } static void test_pack_LPIINTERNETSESSION(void) { /* LPIINTERNETSESSION */ - TEST_TYPE(LPIINTERNETSESSION, 4, 4); + TEST_TYPE_SIZE (LPIINTERNETSESSION, 4) + TEST_TYPE_ALIGN (LPIINTERNETSESSION, 4) } static void test_pack_LPPERSISTMONIKER(void) { /* LPPERSISTMONIKER */ - TEST_TYPE(LPPERSISTMONIKER, 4, 4); + TEST_TYPE_SIZE (LPPERSISTMONIKER, 4) + TEST_TYPE_ALIGN (LPPERSISTMONIKER, 4) } static void test_pack_LPREMFORMATETC(void) { /* LPREMFORMATETC */ - TEST_TYPE(LPREMFORMATETC, 4, 4); + TEST_TYPE_SIZE (LPREMFORMATETC, 4) + TEST_TYPE_ALIGN (LPREMFORMATETC, 4) } static void test_pack_LPREMSECURITY_ATTRIBUTES(void) { /* LPREMSECURITY_ATTRIBUTES */ - TEST_TYPE(LPREMSECURITY_ATTRIBUTES, 4, 4); + TEST_TYPE_SIZE (LPREMSECURITY_ATTRIBUTES, 4) + TEST_TYPE_ALIGN (LPREMSECURITY_ATTRIBUTES, 4) } static void test_pack_LPWININETHTTPINFO(void) { /* LPWININETHTTPINFO */ - TEST_TYPE(LPWININETHTTPINFO, 4, 4); + TEST_TYPE_SIZE (LPWININETHTTPINFO, 4) + TEST_TYPE_ALIGN (LPWININETHTTPINFO, 4) } static void test_pack_LPWININETINFO(void) { /* LPWININETINFO */ - TEST_TYPE(LPWININETINFO, 4, 4); + TEST_TYPE_SIZE (LPWININETINFO, 4) + TEST_TYPE_ALIGN (LPWININETINFO, 4) } static void test_pack_PREMSECURITY_ATTRIBUTES(void) { /* PREMSECURITY_ATTRIBUTES */ - TEST_TYPE(PREMSECURITY_ATTRIBUTES, 4, 4); + TEST_TYPE_SIZE (PREMSECURITY_ATTRIBUTES, 4) + TEST_TYPE_ALIGN (PREMSECURITY_ATTRIBUTES, 4) } static void test_pack_REMSECURITY_ATTRIBUTES(void) { /* REMSECURITY_ATTRIBUTES (pack 4) */ - TEST_TYPE(REMSECURITY_ATTRIBUTES, 12, 4); - TEST_FIELD(REMSECURITY_ATTRIBUTES, DWORD, nLength, 0, 4, 4); - TEST_FIELD(REMSECURITY_ATTRIBUTES, DWORD, lpSecurityDescriptor, 4, 4, 4); - TEST_FIELD(REMSECURITY_ATTRIBUTES, BOOL, bInheritHandle, 8, 4, 4); + TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12) + TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, nLength, 0) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, bInheritHandle, 8) } static void test_pack_RemBINDINFO(void) { /* RemBINDINFO (pack 4) */ - TEST_TYPE(RemBINDINFO, 72, 4); - TEST_FIELD(RemBINDINFO, ULONG, cbSize, 0, 4, 4); - TEST_FIELD(RemBINDINFO, LPWSTR, szExtraInfo, 4, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, grfBindInfoF, 8, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, dwBindVerb, 12, 4, 4); - TEST_FIELD(RemBINDINFO, LPWSTR, szCustomVerb, 16, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, cbstgmedData, 20, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, dwOptions, 24, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, dwOptionsFlags, 28, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, dwCodePage, 32, 4, 4); - TEST_FIELD(RemBINDINFO, REMSECURITY_ATTRIBUTES, securityAttributes, 36, 12, 4); - TEST_FIELD(RemBINDINFO, IID, iid, 48, 16, 4); - TEST_FIELD(RemBINDINFO, IUnknown *, pUnk, 64, 4, 4); - TEST_FIELD(RemBINDINFO, DWORD, dwReserved, 68, 4, 4); + TEST_TYPE_SIZE (RemBINDINFO, 72) + TEST_TYPE_ALIGN (RemBINDINFO, 4) + TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4) + TEST_FIELD_ALIGN (RemBINDINFO, cbSize, 4) + TEST_FIELD_OFFSET(RemBINDINFO, cbSize, 0) + TEST_FIELD_SIZE (RemBINDINFO, szExtraInfo, 4) + TEST_FIELD_ALIGN (RemBINDINFO, szExtraInfo, 4) + TEST_FIELD_OFFSET(RemBINDINFO, szExtraInfo, 4) + TEST_FIELD_SIZE (RemBINDINFO, grfBindInfoF, 4) + TEST_FIELD_ALIGN (RemBINDINFO, grfBindInfoF, 4) + TEST_FIELD_OFFSET(RemBINDINFO, grfBindInfoF, 8) + TEST_FIELD_SIZE (RemBINDINFO, dwBindVerb, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwBindVerb, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwBindVerb, 12) + TEST_FIELD_SIZE (RemBINDINFO, szCustomVerb, 4) + TEST_FIELD_ALIGN (RemBINDINFO, szCustomVerb, 4) + TEST_FIELD_OFFSET(RemBINDINFO, szCustomVerb, 16) + TEST_FIELD_SIZE (RemBINDINFO, cbstgmedData, 4) + TEST_FIELD_ALIGN (RemBINDINFO, cbstgmedData, 4) + TEST_FIELD_OFFSET(RemBINDINFO, cbstgmedData, 20) + TEST_FIELD_SIZE (RemBINDINFO, dwOptions, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwOptions, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwOptions, 24) + TEST_FIELD_SIZE (RemBINDINFO, dwOptionsFlags, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwOptionsFlags, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwOptionsFlags, 28) + TEST_FIELD_SIZE (RemBINDINFO, dwCodePage, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwCodePage, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwCodePage, 32) + TEST_FIELD_SIZE (RemBINDINFO, securityAttributes, 12) + TEST_FIELD_ALIGN (RemBINDINFO, securityAttributes, 4) + TEST_FIELD_OFFSET(RemBINDINFO, securityAttributes, 36) + TEST_FIELD_SIZE (RemBINDINFO, iid, 16) + TEST_FIELD_ALIGN (RemBINDINFO, iid, 4) + TEST_FIELD_OFFSET(RemBINDINFO, iid, 48) + TEST_FIELD_SIZE (RemBINDINFO, pUnk, 4) + TEST_FIELD_ALIGN (RemBINDINFO, pUnk, 4) + TEST_FIELD_OFFSET(RemBINDINFO, pUnk, 64) + TEST_FIELD_SIZE (RemBINDINFO, dwReserved, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwReserved, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwReserved, 68) } static void test_pack_RemFORMATETC(void) { /* RemFORMATETC (pack 4) */ - TEST_TYPE(RemFORMATETC, 20, 4); - TEST_FIELD(RemFORMATETC, DWORD, cfFormat, 0, 4, 4); - TEST_FIELD(RemFORMATETC, DWORD, ptd, 4, 4, 4); - TEST_FIELD(RemFORMATETC, DWORD, dwAspect, 8, 4, 4); - TEST_FIELD(RemFORMATETC, LONG, lindex, 12, 4, 4); - TEST_FIELD(RemFORMATETC, DWORD, tymed, 16, 4, 4); + TEST_TYPE_SIZE (RemFORMATETC, 20) + TEST_TYPE_ALIGN (RemFORMATETC, 4) + TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4) + TEST_FIELD_ALIGN (RemFORMATETC, cfFormat, 4) + TEST_FIELD_OFFSET(RemFORMATETC, cfFormat, 0) + TEST_FIELD_SIZE (RemFORMATETC, ptd, 4) + TEST_FIELD_ALIGN (RemFORMATETC, ptd, 4) + TEST_FIELD_OFFSET(RemFORMATETC, ptd, 4) + TEST_FIELD_SIZE (RemFORMATETC, dwAspect, 4) + TEST_FIELD_ALIGN (RemFORMATETC, dwAspect, 4) + TEST_FIELD_OFFSET(RemFORMATETC, dwAspect, 8) + TEST_FIELD_SIZE (RemFORMATETC, lindex, 4) + TEST_FIELD_ALIGN (RemFORMATETC, lindex, 4) + TEST_FIELD_OFFSET(RemFORMATETC, lindex, 12) + TEST_FIELD_SIZE (RemFORMATETC, tymed, 4) + TEST_FIELD_ALIGN (RemFORMATETC, tymed, 4) + TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16) } static void test_pack(void) @@ -345,5 +379,9 @@ static void test_pack(void) START_TEST(generated) { +#ifdef _WIN64 + ok(0, "The type size / alignment tests don't support Win64 yet\n"); +#else test_pack(); +#endif } diff --git a/rostests/winetests/urlmon/misc.c b/rostests/winetests/urlmon/misc.c index 6d3305e5752..2123392ebce 100644 --- a/rostests/winetests/urlmon/misc.c +++ b/rostests/winetests/urlmon/misc.c @@ -823,6 +823,27 @@ static void test_SecurityManager(void) IInternetSecurityManager_Release(secmgr); } +/* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */ +/* Note: this code is duplicated in dlls/mshtml/tests/dom.c, dlls/mshtml/tests/script.c and dlls/urlmon/tests/misc.c */ +static BOOL is_ie_hardened(void) +{ + HKEY zone_map; + DWORD ie_harden, type, size; + + ie_harden = 0; + if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap", + 0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) { + size = sizeof(DWORD); + if (RegQueryValueEx(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS || + type != REG_DWORD) { + ie_harden = 0; + } + RegCloseKey(zone_map); + } + + return ie_harden != 0; +} + static void test_url_action(IInternetSecurityManager *secmgr, IInternetZoneManager *zonemgr, DWORD action) { DWORD res, size, policy, reg_policy; @@ -863,15 +884,19 @@ static void test_url_action(IInternetSecurityManager *secmgr, IInternetZoneManag ok(policy == reg_policy, "(%x) policy=%x, expected %x\n", action, policy, reg_policy); if(policy != URLPOLICY_QUERY) { - policy = 0xdeadbeef; - hres = IInternetSecurityManager_ProcessUrlAction(secmgr, url9, action, (BYTE*)&policy, - sizeof(WCHAR), NULL, 0, 0, 0); - if(reg_policy == URLPOLICY_DISALLOW) - ok(hres == S_FALSE, "ProcessUrlAction(%x) failed: %08x, expected S_FALSE\n", action, hres); - else - ok(hres == S_OK, "ProcessUrlAction(%x) failed: %08x\n", action, hres); - ok(policy == 0xdeadbeef, "(%x) policy=%x\n", action, policy); - } + if(winetest_interactive || ! is_ie_hardened()) { + policy = 0xdeadbeef; + hres = IInternetSecurityManager_ProcessUrlAction(secmgr, url9, action, (BYTE*)&policy, + sizeof(WCHAR), NULL, 0, 0, 0); + if(reg_policy == URLPOLICY_DISALLOW) + ok(hres == S_FALSE, "ProcessUrlAction(%x) failed: %08x, expected S_FALSE\n", action, hres); + else + ok(hres == S_OK, "ProcessUrlAction(%x) failed: %08x\n", action, hres); + ok(policy == 0xdeadbeef, "(%x) policy=%x\n", action, policy); + }else { + skip("IE running in Enhanced Security Configuration\n"); + } + } } static void test_special_url_action(IInternetSecurityManager *secmgr, IInternetZoneManager *zonemgr, DWORD action) @@ -1305,18 +1330,20 @@ static void test_ReleaseBindInfo(void) static void test_CopyStgMedium(void) { STGMEDIUM src, dst; + HGLOBAL empty; HRESULT hres; static WCHAR fileW[] = {'f','i','l','e',0}; memset(&src, 0xf0, sizeof(src)); memset(&dst, 0xe0, sizeof(dst)); + memset(&empty, 0xf0, sizeof(empty)); src.tymed = TYMED_NULL; src.pUnkForRelease = NULL; hres = CopyStgMedium(&src, &dst); ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres); ok(dst.tymed == TYMED_NULL, "tymed=%d\n", dst.tymed); - ok(dst.u.hGlobal == (void*)0xf0f0f0f0, "u=%p\n", dst.u.hGlobal); + ok(dst.u.hGlobal == empty, "u=%p\n", dst.u.hGlobal); ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease); memset(&dst, 0xe0, sizeof(dst)); diff --git a/rostests/winetests/urlmon/protocol.c b/rostests/winetests/urlmon/protocol.c index 55a605230cf..eb422828cdc 100644 --- a/rostests/winetests/urlmon/protocol.c +++ b/rostests/winetests/urlmon/protocol.c @@ -74,6 +74,9 @@ DEFINE_EXPECT(ReportProgress_VERIFIEDMIMETYPEAVAILABLE); DEFINE_EXPECT(ReportProgress_PROTOCOLCLASSID); DEFINE_EXPECT(ReportProgress_COOKIE_SENT); DEFINE_EXPECT(ReportProgress_REDIRECTING); +DEFINE_EXPECT(ReportProgress_ENCODING); +DEFINE_EXPECT(ReportProgress_ACCEPTRANGES); +DEFINE_EXPECT(ReportProgress_PROXYDETECTING); DEFINE_EXPECT(ReportData); DEFINE_EXPECT(ReportResult); DEFINE_EXPECT(GetBindString_ACCEPT_MIMES); @@ -124,6 +127,7 @@ static DWORD prot_read; static enum { FILE_TEST, HTTP_TEST, + HTTPS_TEST, MK_TEST, BIND_TEST } tested_protocol; @@ -163,6 +167,13 @@ static const char *debugstr_guid(REFIID riid) return buf; } +static int strcmp_wa(LPCWSTR strw, const char *stra) +{ + WCHAR buf[512]; + MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR)); + return lstrcmpW(strw, buf); +} + static HRESULT WINAPI HttpNegotiate_QueryInterface(IHttpNegotiate2 *iface, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IUnknown, riid) @@ -346,8 +357,9 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL if (!state) { if (http_is_first) { - CHECK_CALLED(ReportProgress_FINDINGRESOURCE); - CHECK_CALLED(ReportProgress_CONNECTING); + CLEAR_CALLED(ReportProgress_FINDINGRESOURCE); + CLEAR_CALLED(ReportProgress_CONNECTING); + CLEAR_CALLED(ReportProgress_PROXYDETECTING); } else todo_wine { CHECK_NOT_CALLED(ReportProgress_FINDINGRESOURCE); /* IE7 does call this */ @@ -355,6 +367,8 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL } CHECK_CALLED(ReportProgress_SENDINGREQUEST); SET_EXPECT(OnResponse); + if(tested_protocol == HTTPS_TEST) + SET_EXPECT(ReportProgress_ACCEPTRANGES); SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); if(bindf & BINDF_NEEDFILE) SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -368,6 +382,8 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL if (!state) { state = 1; CHECK_CALLED(OnResponse); + if(tested_protocol == HTTPS_TEST) + CHECK_CALLED(ReportProgress_ACCEPTRANGES); CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); if(bindf & BINDF_NEEDFILE) CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -384,12 +400,6 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, static const WCHAR null_guid[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-', '0','0','0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0','0','}',0}; static const WCHAR text_plain[] = {'t','e','x','t','/','p','l','a','i','n',0}; - static const WCHAR post_host[] = - {'c','r','o','s','s','o','v','e','r','.','c','o','d','e', - 'w','e','a','v','e','r','s','.','c','o','m',0}; - static const WCHAR wszCrossoverIP[] = - {'2','0','9','.','4','6','.','2','5','.','1','3','2',0}; - /* I'm not sure if it's a good idea to hardcode here the IP address... */ switch(ulStatusCode) { case BINDSTATUS_MIMETYPEAVAILABLE: @@ -435,23 +445,10 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, case BINDSTATUS_FINDINGRESOURCE: CHECK_EXPECT(ReportProgress_FINDINGRESOURCE); ok(szStatusText != NULL, "szStatusText == NULL\n"); - if(szStatusText) - { - if (!http_post_test) - ok(!lstrcmpW(szStatusText, hostW), - "szStatustext != \"www.winehq.org\"\n"); - else - ok(!lstrcmpW(szStatusText, post_host), - "szStatustext != \"crossover.codeweavers.com\"\n"); - } break; case BINDSTATUS_CONNECTING: CHECK_EXPECT(ReportProgress_CONNECTING); ok(szStatusText != NULL, "szStatusText == NULL\n"); - if(szStatusText) - ok(!lstrcmpW(szStatusText, http_post_test ? - wszCrossoverIP : winehq_ipW), - "Unexpected szStatusText\n"); break; case BINDSTATUS_SENDINGREQUEST: CHECK_EXPECT(ReportProgress_SENDINGREQUEST); @@ -478,7 +475,20 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, break; case BINDSTATUS_REDIRECTING: CHECK_EXPECT(ReportProgress_REDIRECTING); - ok(szStatusText == NULL, "szStatusText != NULL\n"); + ok(szStatusText == NULL, "szStatusText = %s\n", debugstr_w(szStatusText)); + break; + case BINDSTATUS_ENCODING: + CHECK_EXPECT(ReportProgress_ENCODING); + ok(!strcmp_wa(szStatusText, "gzip"), "szStatusText = %s\n", debugstr_w(szStatusText)); + break; + case BINDSTATUS_ACCEPTRANGES: + CHECK_EXPECT(ReportProgress_ACCEPTRANGES); + ok(!szStatusText, "szStatusText = %s\n", debugstr_w(szStatusText)); + break; + case BINDSTATUS_PROXYDETECTING: + CHECK_EXPECT(ReportProgress_PROXYDETECTING); + SET_EXPECT(ReportProgress_CONNECTING); + ok(!szStatusText, "szStatusText = %s\n", debugstr_w(szStatusText)); break; default: ok(0, "Unexpected status %d\n", ulStatusCode); @@ -498,8 +508,8 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR ok(ulProgressMax == 13, "ulProgressMax=%d, expected 13\n", ulProgressMax); ok(grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION), "grcfBSCF = %08x\n", grfBSCF); - }else if(!binding_test && tested_protocol == HTTP_TEST) { - if(!(grfBSCF & BSCF_LASTDATANOTIFICATION)) + }else if(!binding_test && (tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST)) { + if(!(grfBSCF & BSCF_LASTDATANOTIFICATION) || (grfBSCF & BSCF_DATAFULLYAVAILABLE)) CHECK_EXPECT(ReportData); else if (http_post_test) ok(ulProgress == 13, "Read %u bytes instead of 13\n", ulProgress); @@ -507,11 +517,14 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR ok(ulProgress, "ulProgress == 0\n"); if(first_data_notif) { - ok(grfBSCF == BSCF_FIRSTDATANOTIFICATION, "grcfBSCF = %08x\n", grfBSCF); + ok(grfBSCF == BSCF_FIRSTDATANOTIFICATION + || grfBSCF == (BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE), + "grcfBSCF = %08x\n", grfBSCF); first_data_notif = FALSE; } else { ok(grfBSCF == BSCF_INTERMEDIATEDATANOTIFICATION - || grfBSCF == (BSCF_LASTDATANOTIFICATION|BSCF_INTERMEDIATEDATANOTIFICATION), + || grfBSCF == (BSCF_LASTDATANOTIFICATION|BSCF_INTERMEDIATEDATANOTIFICATION) + || broken(grfBSCF == (BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION)), "grcfBSCF = %08x\n", grfBSCF); } @@ -870,7 +883,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, ok(hres == S_OK, "ReportProgress(BINDSTATUS_SENDINGREQUEST) failed: %08x\n", hres); CHECK_CALLED(ReportProgress_SENDINGREQUEST); - if(tested_protocol == HTTP_TEST) { + if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) { IServiceProvider *service_provider; IHttpNegotiate *http_negotiate; IHttpNegotiate2 *http_negotiate2; @@ -1084,7 +1097,7 @@ static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv, } if((b = !b)) - return tested_protocol == HTTP_TEST ? E_PENDING : S_FALSE; + return tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST ? E_PENDING : S_FALSE; memset(pv, 'x', 100); prot_read += *pcbRead = 100; @@ -1547,7 +1560,7 @@ static BOOL http_protocol_start(LPCWSTR url, BOOL is_first) /* is_first refers to whether this is the first call to this function * _for this url_ */ -static void test_http_protocol_url(LPCWSTR url, BOOL is_first) +static void test_http_protocol_url(LPCWSTR url, BOOL is_https, BOOL is_first) { IInternetProtocolInfo *protocol_info; IClassFactory *factory; @@ -1557,7 +1570,8 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_first) http_url = url; http_is_first = is_first; - hres = CoGetClassObject(&CLSID_HttpProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); + hres = CoGetClassObject(is_https ? &CLSID_HttpSProtocol : &CLSID_HttpProtocol, + CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "CoGetClassObject failed: %08x\n", hres); if(FAILED(hres)) return; @@ -1585,6 +1599,9 @@ static void test_http_protocol_url(LPCWSTR url, BOOL is_first) SET_EXPECT(ReportProgress_FINDINGRESOURCE); SET_EXPECT(ReportProgress_CONNECTING); SET_EXPECT(ReportProgress_SENDINGREQUEST); + SET_EXPECT(ReportProgress_PROXYDETECTING); + if(! is_https) + SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); if(!(bindf & BINDF_FROMURLMON)) { SET_EXPECT(OnResponse); SET_EXPECT(ReportProgress_RAWMIMETYPE); @@ -1676,25 +1693,37 @@ static void test_http_protocol(void) trace("Testing http protocol (not from urlmon)...\n"); tested_protocol = HTTP_TEST; bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; - test_http_protocol_url(winehq_url, TRUE); + test_http_protocol_url(winehq_url, FALSE, TRUE); trace("Testing http protocol (from urlmon)...\n"); bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON; - test_http_protocol_url(winehq_url, FALSE); + test_http_protocol_url(winehq_url, FALSE, FALSE); trace("Testing http protocol (to file)...\n"); bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NEEDFILE; - test_http_protocol_url(winehq_url, FALSE); + test_http_protocol_url(winehq_url, FALSE, FALSE); trace("Testing http protocol (post data)...\n"); http_post_test = TRUE; /* Without this flag we get a ReportProgress_CACHEFILENAMEAVAILABLE * notification with BINDVERB_POST */ bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; - test_http_protocol_url(posttest_url, TRUE); + test_http_protocol_url(posttest_url, FALSE, TRUE); http_post_test = FALSE; } +static void test_https_protocol(void) +{ + static const WCHAR codeweavers_url[] = + {'h','t','t','p','s',':','/','/','w','w','w','.','c','o','d','e','w','e','a','v','e','r','s', + '.','c','o','m','/','t','e','s','t','.','h','t','m','l',0}; + + trace("Testing https protocol (from urlmon)...\n"); + tested_protocol = HTTPS_TEST; + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; + test_http_protocol_url(codeweavers_url, TRUE, TRUE); +} + static void test_mk_protocol(void) { IInternetProtocolInfo *protocol_info; @@ -1939,7 +1968,7 @@ static void test_binding(int prot) CHECK_CALLED(SetPriority); CHECK_CALLED(Start); - if(prot == HTTP_TEST) { + if(prot == HTTP_TEST || prot == HTTPS_TEST) { while(prot_state < 4) { WaitForSingleObject(event_complete, INFINITE); SET_EXPECT(Continue); @@ -1981,6 +2010,7 @@ START_TEST(protocol) test_file_protocol(); test_http_protocol(); + test_https_protocol(); test_mk_protocol(); test_CreateBinding(); test_binding(FILE_TEST); diff --git a/rostests/winetests/urlmon/url.c b/rostests/winetests/urlmon/url.c index 830ef1a1f49..094d21dd546 100644 --- a/rostests/winetests/urlmon/url.c +++ b/rostests/winetests/urlmon/url.c @@ -69,6 +69,12 @@ DEFINE_GUID(IID_IBindStatusCallbackHolder,0x79eac9cc,0xbaf9,0x11ce,0x8c,0x82,0x0 expect_ ## func = called_ ## func = FALSE; \ }while(0) +#define CHECK_CALLED_BROKEN(func) \ + do { \ + ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + #define CLEAR_CALLED(func) \ expect_ ## func = called_ ## func = FALSE @@ -138,6 +144,10 @@ static const WCHAR ITS_URL[] = {'i','t','s',':','t','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0}; static const WCHAR MK_URL[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':', 't','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0}; +static const WCHAR https_urlW[] = + {'h','t','t','p','s',':','/','/','w','w','w','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m', + '/','t','e','s','t','.','h','t','m','l',0}; + static const WCHAR wszTextHtml[] = {'t','e','x','t','/','h','t','m','l',0}; @@ -168,7 +178,8 @@ static LPCWSTR urls[] = { ABOUT_BLANK, INDEX_HTML, ITS_URL, - MK_URL + MK_URL, + https_urlW }; static WCHAR file_url[INTERNET_MAX_URL_LENGTH]; @@ -178,7 +189,8 @@ static enum { ABOUT_TEST, FILE_TEST, ITS_TEST, - MK_TEST + MK_TEST, + HTTPS_TEST } test_protocol; static enum { @@ -307,7 +319,7 @@ static DWORD WINAPI thread_proc(PVOID arg) CHECK_CALLED(Obj_OnProgress_BEGINSYNCOPERATION); CHECK_CALLED(CreateInstance); CHECK_CALLED(PutProperty_MIMETYPEPROP); - CLEAR_CALLED(PutProperty_CLASSIDPROP); + CHECK_CALLED_BROKEN(PutProperty_CLASSIDPROP); CHECK_CALLED(Load); CHECK_CALLED(Obj_OnProgress_ENDSYNCOPERATION); CHECK_CALLED(OnObjectAvailable); @@ -397,7 +409,8 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, if(filedwl_api) { ok(bindf == (BINDF_PULLDATA|BINDF_FROMURLMON|BINDF_NEEDFILE), "bindf=%08x\n", bindf); }else if(tymed == TYMED_ISTREAM - && (test_protocol == FILE_TEST || test_protocol == MK_TEST || test_protocol == HTTP_TEST)) { + && (test_protocol == FILE_TEST || test_protocol == MK_TEST + || test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST)) { ok(bindf == (BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE|BINDF_PULLDATA |BINDF_FROMURLMON), "bindf=%08x\n", bindf); @@ -447,7 +460,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, break; } - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { IServiceProvider *service_provider; IHttpNegotiate *http_negotiate; IHttpNegotiate2 *http_negotiate2; @@ -605,7 +618,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, CHECK_CALLED(Obj_OnProgress_BEGINSYNCOPERATION); CHECK_CALLED(CreateInstance); CHECK_CALLED(PutProperty_MIMETYPEPROP); - CLEAR_CALLED(PutProperty_CLASSIDPROP); + CHECK_CALLED_BROKEN(PutProperty_CLASSIDPROP); CHECK_CALLED(Load); CHECK_CALLED(Obj_OnProgress_ENDSYNCOPERATION); CHECK_CALLED(OnObjectAvailable); @@ -672,6 +685,11 @@ static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface, IHttpNegotiate_Release(http_negotiate); ok(hres == S_OK, "OnResponse failed: %08x\n", hres); + if(test_protocol == HTTPS_TEST) { + hres = IInternetProtocolSink_ReportProgress(protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL); + ok(hres == S_OK, "ReportProgress(BINDSTATUS_ACCEPTRANGES) failed: %08x\n", hres); + } + hres = IInternetProtocolSink_ReportProgress(protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, wszTextHtml); ok(hres == S_OK, @@ -772,7 +790,7 @@ static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv, CHECK_EXPECT2(Read); - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { HRESULT hres; static BOOL pending = TRUE; @@ -1206,7 +1224,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP download_state = END_DOWNLOAD; break; case BINDSTATUS_CACHEFILENAMEAVAILABLE: - if(test_protocol != HTTP_TEST) { + if(test_protocol != HTTP_TEST && test_protocol != HTTPS_TEST) { if(iface == &objbsc) CHECK_EXPECT(Obj_OnProgress_CACHEFILENAMEAVAILABLE); else @@ -1248,6 +1266,9 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallback *iface, ULONG ulP ok(0, "unexpected call\n"); ok(szStatusText == NULL, "Expected szStatusText to be NULL\n"); break; + case BINDSTATUS_PROXYDETECTING: + trace("BINDSTATUS_PROXYDETECTING\n"); + break; default: ok(0, "unexpected code %d\n", ulStatusCode); }; @@ -1276,7 +1297,7 @@ static HRESULT WINAPI statusclb_OnStopBinding(IBindStatusCallback *iface, HRESUL ok(hresult == binding_hres, "binding failed: %08x, expected %08x\n", hresult, binding_hres); ok(szError == NULL, "szError should be NULL\n"); - if(test_protocol == HTTP_TEST && emulate_protocol) { + if((test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) && emulate_protocol) { SetEvent(complete_event); if(iface != &objbsc) WaitForSingleObject(complete_event2, INFINITE); @@ -1376,7 +1397,8 @@ static HRESULT WINAPI statusclb_OnDataAvailable(IBindStatusCallback *iface, DWOR ok(pstgmed->u.lpszFileName != NULL, "lpszFileName == NULL\n"); } - if(test_protocol == HTTP_TEST && emulate_protocol && prot_state < 4 && (!bind_to_object || prot_state > 1)) + if((test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) + && emulate_protocol && prot_state < 4 && (!bind_to_object || prot_state > 1)) SetEvent(complete_event); return S_OK; @@ -1505,7 +1527,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva CHECK_EXPECT(Load); ok(GetCurrentThreadId() == thread_id, "wrong thread %d\n", GetCurrentThreadId()); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) ok(!fFullyAvailable, "fFulyAvailable = %x\n", fFullyAvailable); else ok(fFullyAvailable, "fFulyAvailable = %x\n", fFullyAvailable); @@ -1535,11 +1557,11 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva SET_EXPECT(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) SET_EXPECT(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol != HTTP_TEST) + if(test_protocol != HTTP_TEST && test_protocol != HTTPS_TEST) SET_EXPECT(OnProgress_ENDDOWNLOADDATA); SET_EXPECT(LockRequest); SET_EXPECT(OnDataAvailable); - if(test_protocol != HTTP_TEST) + if(test_protocol != HTTP_TEST && test_protocol != HTTPS_TEST) SET_EXPECT(OnStopBinding); hres = IMoniker_BindToStorage(pimkName, pibc, NULL, &IID_IStream, (void**)&unk); @@ -1550,11 +1572,11 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol != HTTP_TEST) + if(test_protocol != HTTP_TEST && test_protocol != HTTPS_TEST) CHECK_CALLED(OnProgress_ENDDOWNLOADDATA); CHECK_CALLED(LockRequest); CHECK_CALLED(OnDataAvailable); - if(test_protocol != HTTP_TEST) + if(test_protocol != HTTP_TEST && test_protocol != HTTPS_TEST) CHECK_CALLED(OnStopBinding); if(unk) @@ -1768,7 +1790,7 @@ static void test_CreateAsyncBindCtxEx(void) IBindCtx_Release(bctx2); } -static void test_bscholder(IBindStatusCallback *holder) +static BOOL test_bscholder(IBindStatusCallback *holder) { IServiceProvider *serv_prov; IHttpNegotiate *http_negotiate, *http_negotiate_serv; @@ -1776,6 +1798,7 @@ static void test_bscholder(IBindStatusCallback *holder) IAuthenticate *authenticate, *authenticate_serv; IInternetProtocol *protocol; BINDINFO bindinfo = {sizeof(bindinfo)}; + BOOL ret = TRUE; LPWSTR wstr; DWORD dw; HRESULT hres; @@ -1847,6 +1870,7 @@ static void test_bscholder(IBindStatusCallback *holder) IHttpNegotiate_Release(http_negotiate2); }else { skip("Could not get IHttpNegotiate2\n"); + ret = FALSE; } SET_EXPECT(OnProgress_FINDINGRESOURCE); @@ -1897,12 +1921,14 @@ static void test_bscholder(IBindStatusCallback *holder) CHECK_CALLED(QueryService_IInternetProtocol); IServiceProvider_Release(serv_prov); + return ret; } -static void test_RegisterBindStatusCallback(void) +static BOOL test_RegisterBindStatusCallback(void) { IBindStatusCallback *prevbsc, *clb; IBindCtx *bindctx; + BOOL ret = TRUE; IUnknown *unk; HRESULT hres; @@ -1933,7 +1959,8 @@ static void test_RegisterBindStatusCallback(void) ok(hres == S_OK, "QueryInterface(IID_IBindStatusCallback) failed: %08x\n", hres); ok(clb != &bsc, "bsc == clb\n"); - test_bscholder(clb); + if(!test_bscholder(clb)) + ret = FALSE; IBindStatusCallback_Release(clb); @@ -1958,6 +1985,7 @@ static void test_RegisterBindStatusCallback(void) ok(hres == E_INVALIDARG, "RevokeBindStatusCallback failed: %08x\n", hres); IBindCtx_Release(bindctx); + return ret; } #define BINDTEST_EMULATE 1 @@ -2035,12 +2063,12 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) SET_EXPECT(OnStartBinding); if(emulate_protocol) { SET_EXPECT(Start); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(Terminate); if(tymed != TYMED_FILE || (test_protocol != ABOUT_TEST && test_protocol != ITS_TEST)) SET_EXPECT(UnlockRequest); }else { - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { SET_EXPECT(QueryInterface_IInternetBindInfo); SET_EXPECT(QueryService_IInternetBindInfo); SET_EXPECT(QueryInterface_IHttpNegotiate); @@ -2050,15 +2078,15 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) SET_EXPECT(OnProgress_FINDINGRESOURCE); SET_EXPECT(OnProgress_CONNECTING); } - if(test_protocol == HTTP_TEST || test_protocol == FILE_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) SET_EXPECT(OnProgress_SENDINGREQUEST); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnResponse); SET_EXPECT(OnProgress_MIMETYPEAVAILABLE); SET_EXPECT(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) SET_EXPECT(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnProgress_DOWNLOADINGDATA); SET_EXPECT(OnProgress_ENDDOWNLOADDATA); if(tymed != TYMED_FILE || test_protocol != ABOUT_TEST) @@ -2067,7 +2095,8 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) } hres = IMoniker_BindToStorage(mon, bctx, NULL, tymed == TYMED_ISTREAM ? &IID_IStream : &IID_IUnknown, (void**)&unk); - if (test_protocol == HTTP_TEST && hres == HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED)) + if ((test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) + && hres == HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED)) { skip("Network unreachable, skipping tests\n"); return; @@ -2104,7 +2133,7 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) CHECK_CALLED(OnStartBinding); if(emulate_protocol) { CHECK_CALLED(Start); - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { if(tymed == TYMED_FILE) CLEAR_CALLED(Read); CHECK_CALLED(Terminate); @@ -2112,7 +2141,7 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) if(tymed != TYMED_FILE || (test_protocol != ABOUT_TEST && test_protocol != ITS_TEST)) CHECK_CALLED(UnlockRequest); }else { - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { CLEAR_CALLED(QueryInterface_IInternetBindInfo); CLEAR_CALLED(QueryService_IInternetBindInfo); CHECK_CALLED(QueryInterface_IHttpNegotiate); @@ -2122,7 +2151,7 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) CHECK_CALLED(QueryInterface_IHttpNegotiate2); CHECK_CALLED(GetRootSecurityId); } - if(http_is_first) { + if(http_is_first || test_protocol == HTTPS_TEST) { CHECK_CALLED(OnProgress_FINDINGRESOURCE); CHECK_CALLED(OnProgress_CONNECTING); }else todo_wine { @@ -2131,15 +2160,15 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) CLEAR_CALLED(OnProgress_CONNECTING); } } - if(test_protocol == HTTP_TEST || test_protocol == FILE_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_SENDINGREQUEST); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CHECK_CALLED(OnResponse); CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CLEAR_CALLED(OnProgress_DOWNLOADINGDATA); CHECK_CALLED(OnProgress_ENDDOWNLOADDATA); if(tymed != TYMED_FILE || test_protocol != ABOUT_TEST) @@ -2150,7 +2179,7 @@ static void test_BindToStorage(int protocol, BOOL emul, DWORD t) ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n"); ok(IBindCtx_Release(bctx) == 0, "bctx should be destroyed here\n"); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) http_is_first = FALSE; } @@ -2201,13 +2230,13 @@ static void test_BindToObject(int protocol, BOOL emul) SET_EXPECT(Obj_OnStartBinding); if(emulate_protocol) { SET_EXPECT(Start); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(Terminate); if(test_protocol == FILE_TEST) SET_EXPECT(OnProgress_MIMETYPEAVAILABLE); SET_EXPECT(UnlockRequest); }else { - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { SET_EXPECT(QueryInterface_IHttpNegotiate); SET_EXPECT(BeginningTransaction); SET_EXPECT(QueryInterface_IHttpNegotiate2); @@ -2215,15 +2244,15 @@ static void test_BindToObject(int protocol, BOOL emul) SET_EXPECT(Obj_OnProgress_FINDINGRESOURCE); SET_EXPECT(Obj_OnProgress_CONNECTING); } - if(test_protocol == HTTP_TEST || test_protocol == FILE_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) SET_EXPECT(Obj_OnProgress_SENDINGREQUEST); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnResponse); SET_EXPECT(Obj_OnProgress_MIMETYPEAVAILABLE); SET_EXPECT(Obj_OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) SET_EXPECT(Obj_OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnProgress_DOWNLOADINGDATA); SET_EXPECT(Obj_OnProgress_ENDDOWNLOADDATA); SET_EXPECT(Obj_OnProgress_CLASSIDAVAILABLE); @@ -2235,7 +2264,8 @@ static void test_BindToObject(int protocol, BOOL emul) hres = IMoniker_BindToObject(mon, bctx, NULL, &IID_IUnknown, (void**)&unk); - if (test_protocol == HTTP_TEST && hres == HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED)) + if ((test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) + && hres == HRESULT_FROM_WIN32(ERROR_INTERNET_NAME_NOT_RESOLVED)) { skip( "Network unreachable, skipping tests\n" ); return; @@ -2269,13 +2299,13 @@ static void test_BindToObject(int protocol, BOOL emul) CHECK_CALLED(Obj_OnStartBinding); if(emulate_protocol) { CHECK_CALLED(Start); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CHECK_CALLED(Terminate); if(test_protocol == FILE_TEST) CLEAR_CALLED(OnProgress_MIMETYPEAVAILABLE); /* not called in IE7 */ CHECK_CALLED(UnlockRequest); }else { - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { CHECK_CALLED(QueryInterface_IHttpNegotiate); CHECK_CALLED(BeginningTransaction); if (have_IHttpNegotiate2) @@ -2292,19 +2322,19 @@ static void test_BindToObject(int protocol, BOOL emul) CLEAR_CALLED(Obj_OnProgress_CONNECTING); } } - if(test_protocol == HTTP_TEST || test_protocol == FILE_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) { if(urls[test_protocol] == SHORT_RESPONSE_URL) CLEAR_CALLED(Obj_OnProgress_SENDINGREQUEST); else CHECK_CALLED(Obj_OnProgress_SENDINGREQUEST); } - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CHECK_CALLED(OnResponse); CHECK_CALLED(Obj_OnProgress_MIMETYPEAVAILABLE); CHECK_CALLED(Obj_OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) CHECK_CALLED(Obj_OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CLEAR_CALLED(OnProgress_DOWNLOADINGDATA); CLEAR_CALLED(Obj_OnProgress_ENDDOWNLOADDATA); CHECK_CALLED(Obj_OnProgress_CLASSIDAVAILABLE); @@ -2314,7 +2344,7 @@ static void test_BindToObject(int protocol, BOOL emul) CHECK_CALLED(Obj_OnStopBinding); } - if(test_protocol != HTTP_TEST || emul || urls[test_protocol] == SHORT_RESPONSE_URL) { + if(test_protocol != HTTP_TEST || test_protocol == HTTPS_TEST || emul || urls[test_protocol] == SHORT_RESPONSE_URL) { ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n"); ok(IBindCtx_Release(bctx) == 0, "bctx should be destroyed here\n"); }else { @@ -2329,7 +2359,7 @@ static void test_BindToObject(int protocol, BOOL emul) if(emul) CoRevokeClassObject(regid); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) http_is_first = FALSE; } @@ -2351,21 +2381,21 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) SET_EXPECT(Start); SET_EXPECT(UnlockRequest); }else { - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { SET_EXPECT(QueryInterface_IHttpNegotiate); SET_EXPECT(BeginningTransaction); SET_EXPECT(QueryInterface_IHttpNegotiate2); SET_EXPECT(GetRootSecurityId); } - if(test_protocol == HTTP_TEST || test_protocol == FILE_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) SET_EXPECT(OnProgress_SENDINGREQUEST); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnResponse); SET_EXPECT(OnProgress_MIMETYPEAVAILABLE); SET_EXPECT(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) SET_EXPECT(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) SET_EXPECT(OnProgress_DOWNLOADINGDATA); SET_EXPECT(OnProgress_ENDDOWNLOADDATA); SET_EXPECT(OnStopBinding); @@ -2385,7 +2415,7 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) CHECK_CALLED(Start); CHECK_CALLED(UnlockRequest); }else { - if(test_protocol == HTTP_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) { CHECK_CALLED(QueryInterface_IHttpNegotiate); CHECK_CALLED(BeginningTransaction); if (have_IHttpNegotiate2) @@ -2396,15 +2426,15 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) } if(test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_SENDINGREQUEST); - else if(test_protocol == HTTP_TEST) + else if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CLEAR_CALLED(OnProgress_SENDINGREQUEST); /* not called by IE7 */ - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CHECK_CALLED(OnResponse); CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) CHECK_CALLED(OnProgress_CACHEFILENAMEAVAILABLE); - if(test_protocol == HTTP_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) CLEAR_CALLED(OnProgress_DOWNLOADINGDATA); CHECK_CALLED(OnProgress_ENDDOWNLOADDATA); CHECK_CALLED(OnStopBinding); @@ -2570,110 +2600,118 @@ START_TEST(url) test_create(); test_CreateAsyncBindCtx(); test_CreateAsyncBindCtxEx(); - test_RegisterBindStatusCallback(); - test_BindToStorage_fail(); - trace("synchronous http test (COM not initialised)...\n"); - test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); + if(test_RegisterBindStatusCallback()) { + test_BindToStorage_fail(); - CoInitialize(NULL); + trace("synchronous http test (COM not initialised)...\n"); + test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); - trace("synchronous http test...\n"); - test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); + CoInitialize(NULL); - trace("synchronous http test (to object)...\n"); - test_BindToObject(HTTP_TEST, FALSE); + trace("synchronous http test...\n"); + test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); - trace("synchronous file test...\n"); - test_BindToStorage(FILE_TEST, FALSE, TYMED_ISTREAM); + trace("synchronous http test (to object)...\n"); + test_BindToObject(HTTP_TEST, FALSE); - trace("synchronous file test (to object)...\n"); - test_BindToObject(FILE_TEST, FALSE); + trace("synchronous file test...\n"); + test_BindToStorage(FILE_TEST, FALSE, TYMED_ISTREAM); - bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; + trace("synchronous file test (to object)...\n"); + test_BindToObject(FILE_TEST, FALSE); - trace("http test...\n"); - test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; - trace("http test (to file)...\n"); - test_BindToStorage(HTTP_TEST, FALSE, TYMED_FILE); + trace("http test...\n"); + test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); - trace("http test (to object)...\n"); - test_BindToObject(HTTP_TEST, FALSE); + trace("http test (to file)...\n"); + test_BindToStorage(HTTP_TEST, FALSE, TYMED_FILE); - trace("http test (short response)...\n"); - http_is_first = TRUE; - urls[HTTP_TEST] = SHORT_RESPONSE_URL; - test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); + trace("http test (to object)...\n"); + test_BindToObject(HTTP_TEST, FALSE); - trace("http test (short response, to object)...\n"); - test_BindToObject(HTTP_TEST, FALSE); + trace("http test (short response)...\n"); + http_is_first = TRUE; + urls[HTTP_TEST] = SHORT_RESPONSE_URL; + test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); - trace("emulated http test...\n"); - test_BindToStorage(HTTP_TEST, TRUE, TYMED_ISTREAM); + trace("http test (short response, to object)...\n"); + test_BindToObject(HTTP_TEST, FALSE); - trace("emulated http test (to object)...\n"); - test_BindToObject(HTTP_TEST, TRUE); + trace("emulated http test...\n"); + test_BindToStorage(HTTP_TEST, TRUE, TYMED_ISTREAM); - trace("emulated http test (to file)...\n"); - test_BindToStorage(HTTP_TEST, TRUE, TYMED_FILE); + trace("emulated http test (to object)...\n"); + test_BindToObject(HTTP_TEST, TRUE); - trace("about test...\n"); - test_BindToStorage(ABOUT_TEST, FALSE, TYMED_ISTREAM); + trace("emulated http test (to file)...\n"); + test_BindToStorage(HTTP_TEST, TRUE, TYMED_FILE); - trace("about test (to file)...\n"); - test_BindToStorage(ABOUT_TEST, FALSE, TYMED_FILE); + trace("asynchronous https test...\n"); + test_BindToStorage(HTTPS_TEST, FALSE, TYMED_ISTREAM); - trace("about test (to object)...\n"); - test_BindToObject(ABOUT_TEST, FALSE); + trace("emulated https test...\n"); + test_BindToStorage(HTTPS_TEST, TRUE, TYMED_ISTREAM); - trace("emulated about test...\n"); - test_BindToStorage(ABOUT_TEST, TRUE, TYMED_ISTREAM); + trace("about test...\n"); + test_BindToStorage(ABOUT_TEST, FALSE, TYMED_ISTREAM); - trace("emulated about test (to file)...\n"); - test_BindToStorage(ABOUT_TEST, TRUE, TYMED_FILE); + trace("about test (to file)...\n"); + test_BindToStorage(ABOUT_TEST, FALSE, TYMED_FILE); - trace("emulated about test (to object)...\n"); - test_BindToObject(ABOUT_TEST, TRUE); + trace("about test (to object)...\n"); + test_BindToObject(ABOUT_TEST, FALSE); - trace("file test...\n"); - test_BindToStorage(FILE_TEST, FALSE, TYMED_ISTREAM); + trace("emulated about test...\n"); + test_BindToStorage(ABOUT_TEST, TRUE, TYMED_ISTREAM); - trace("file test (to file)...\n"); - test_BindToStorage(FILE_TEST, FALSE, TYMED_FILE); + trace("emulated about test (to file)...\n"); + test_BindToStorage(ABOUT_TEST, TRUE, TYMED_FILE); - trace("file test (to object)...\n"); - test_BindToObject(FILE_TEST, FALSE); + trace("emulated about test (to object)...\n"); + test_BindToObject(ABOUT_TEST, TRUE); - trace("emulated file test...\n"); - test_BindToStorage(FILE_TEST, TRUE, TYMED_ISTREAM); + trace("file test...\n"); + test_BindToStorage(FILE_TEST, FALSE, TYMED_ISTREAM); - trace("emulated file test (to file)...\n"); - test_BindToStorage(FILE_TEST, TRUE, TYMED_FILE); + trace("file test (to file)...\n"); + test_BindToStorage(FILE_TEST, FALSE, TYMED_FILE); - trace("emulated file test (to object)...\n"); - test_BindToObject(FILE_TEST, TRUE); + trace("file test (to object)...\n"); + test_BindToObject(FILE_TEST, FALSE); - trace("emulated its test...\n"); - test_BindToStorage(ITS_TEST, TRUE, TYMED_ISTREAM); + trace("emulated file test...\n"); + test_BindToStorage(FILE_TEST, TRUE, TYMED_ISTREAM); - trace("emulated its test (to file)...\n"); - test_BindToStorage(ITS_TEST, TRUE, TYMED_FILE); + trace("emulated file test (to file)...\n"); + test_BindToStorage(FILE_TEST, TRUE, TYMED_FILE); - trace("emulated mk test...\n"); - test_BindToStorage(MK_TEST, TRUE, TYMED_ISTREAM); + trace("emulated file test (to object)...\n"); + test_BindToObject(FILE_TEST, TRUE); - trace("test URLDownloadToFile for file protocol...\n"); - test_URLDownloadToFile(FILE_TEST, FALSE); + trace("emulated its test...\n"); + test_BindToStorage(ITS_TEST, TRUE, TYMED_ISTREAM); - trace("test URLDownloadToFile for emulated file protocol...\n"); - test_URLDownloadToFile(FILE_TEST, TRUE); + trace("emulated its test (to file)...\n"); + test_BindToStorage(ITS_TEST, TRUE, TYMED_FILE); - trace("test URLDownloadToFile for http protocol...\n"); - test_URLDownloadToFile(HTTP_TEST, FALSE); + trace("emulated mk test...\n"); + test_BindToStorage(MK_TEST, TRUE, TYMED_ISTREAM); - trace("test failures...\n"); - test_BindToStorage_fail(); + trace("test URLDownloadToFile for file protocol...\n"); + test_URLDownloadToFile(FILE_TEST, FALSE); + + trace("test URLDownloadToFile for emulated file protocol...\n"); + test_URLDownloadToFile(FILE_TEST, TRUE); + + trace("test URLDownloadToFile for http protocol...\n"); + test_URLDownloadToFile(HTTP_TEST, FALSE); + + trace("test failures...\n"); + test_BindToStorage_fail(); + } DeleteFileA(wszIndexHtmlA); CloseHandle(complete_event); diff --git a/rostests/winetests/user32/broadcast.c b/rostests/winetests/user32/broadcast.c index ae9cd29ee65..48f1318a879 100644 --- a/rostests/winetests/user32/broadcast.c +++ b/rostests/winetests/user32/broadcast.c @@ -18,12 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define _WIN32_WINNT 0x0501 + #include #include #include -#define _WIN32_WINNT 0x0501 - #include "windef.h" #include "winbase.h" #include "wingdi.h" @@ -66,7 +66,10 @@ static BOOL init_procs(void) pBroadcastA = (PBROADCAST)GetProcAddress(user32, "BroadcastSystemMessage"); ok(pBroadcastA != NULL, "No BroadcastSystemMessage found\n"); if (!pBroadcastA) + { + win_skip("BroadcastA is not available\n"); return FALSE; + } pBroadcastW = (PBROADCAST)GetProcAddress(user32, "BroadcastSystemMessageW"); pBroadcastExA = (PBROADCASTEX)GetProcAddress(user32, "BroadcastSystemMessageExA"); @@ -80,13 +83,13 @@ static BOOL init_procs(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "MainWindowClass"; if (!RegisterClassA(&cls)) - return 0; + return FALSE; if (!CreateWindowExA(0, "MainWindowClass", "Main window", WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP, 100, 100, 200, @@ -105,7 +108,7 @@ static void test_parameters(PBROADCAST broadcast, const char *functionname) ret = broadcast( 0x80000000, &recips, WM_NULL, 0, 0 ); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("%s is not implemented\n", functionname); + win_skip("%s is not implemented\n", functionname); return; } ok(!ret || broken(ret), "Returned: %d\n", ret); @@ -345,14 +348,14 @@ START_TEST(broadcast) test_parameters(pBroadcastW, "BroadcastSystemMessageW"); } else - skip("No BroadcastSystemMessageW, skipping\n"); + win_skip("No BroadcastSystemMessageW, skipping\n"); if (pBroadcastExA) { trace("Running BroadcastSystemMessageExA tests\n"); test_parametersEx(pBroadcastExA); } else - skip("No BroadcastSystemMessageExA, skipping\n"); + win_skip("No BroadcastSystemMessageExA, skipping\n"); if (pBroadcastExW) { trace("Running BroadcastSystemMessageExW tests\n"); @@ -361,5 +364,5 @@ START_TEST(broadcast) test_noprivileges(); } else - skip("No BroadcastSystemMessageExW, skipping\n"); + win_skip("No BroadcastSystemMessageExW, skipping\n"); } diff --git a/rostests/winetests/user32/class.c b/rostests/winetests/user32/class.c index ce6d020533a..a1ae4bdc55d 100755 --- a/rostests/winetests/user32/class.c +++ b/rostests/winetests/user32/class.c @@ -39,7 +39,7 @@ static const WCHAR WC_EDITW[] = {'E','d','i','t',0}; #define NUMCLASSWORDS 4 -#define IS_WNDPROC_HANDLE(x) (((ULONG_PTR)(x) >> 16) == (~((ULONG_PTR)0) >> 16)) +#define IS_WNDPROC_HANDLE(x) (((ULONG_PTR)(x) >> 16) == (~0u >> 16)) static LRESULT WINAPI ClassTest_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -279,7 +279,7 @@ struct class_info static DWORD WINAPI thread_proc(void *param) { - struct class_info *class_info = (struct class_info *)param; + struct class_info *class_info = param; check_instance(class_info->name, class_info->inst, class_info->info_inst, class_info->gcl_inst); @@ -415,7 +415,7 @@ static void test_instances(void) cls.style = 3; ok( RegisterClassA( &cls ), "Failed to register local class for deadbeef\n" ); hwnd2 = CreateWindowExA( 0, name, "test_window", 0, 0, 0, 0, 0, 0, 0, NULL, 0 ); - ok( (HINSTANCE)GetClassLongPtrA( hwnd2, GCLP_HMODULE ) == (HINSTANCE)0xdeadbeef, + ok( GetClassLongPtrA( hwnd2, GCLP_HMODULE ) == 0xdeadbeef, "Didn't get deadbeef class for null instance\n" ); DestroyWindow( hwnd2 ); ok( UnregisterClassA( name, (HINSTANCE)0xdeadbeef ), "Unregister failed for deadbeef\n" ); @@ -554,10 +554,7 @@ static void test_instances(void) ok( !UnregisterClass( "BUTTON", (HINSTANCE)0x87654321 ), "Unregistered button a second time\n" ); ok( GetLastError() == ERROR_CLASS_DOES_NOT_EXIST, "Wrong error code %d\n", GetLastError() ); ok( !GetClassInfo( 0, "BUTTON", &wc ), "Button still exists\n" ); - ok( GetLastError() == ERROR_CLASS_DOES_NOT_EXIST || - GetLastError() == ERROR_INVALID_PARAMETER || /* W2K3 */ - GetLastError() == ERROR_SUCCESS /* Vista */, - "Wrong error code %d\n", GetLastError() ); + /* last error not set reliably */ /* we can change the instance of a system class */ check_instance( "EDIT", (HINSTANCE)0xdeadbeef, (HINSTANCE)0xdeadbeef, user32 ); @@ -592,8 +589,8 @@ static void test_builtinproc(void) HWND hwnd; int i; - pDefWindowProcA = (void *)GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcA"); - pDefWindowProcW = (void *)GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcW"); + pDefWindowProcA = GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcA"); + pDefWindowProcW = GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcW"); for (i = 0; i < 4; i++) { @@ -800,10 +797,8 @@ static BOOL RegisterTestDialog(HINSTANCE hInstance) wcx.hbrBackground = GetStockObject(WHITE_BRUSH); wcx.lpszClassName = "TestDialog"; wcx.lpszMenuName = "TestDialog"; - wcx.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(5), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), + wcx.hIconSm = LoadImage(hInstance, MAKEINTRESOURCE(5), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); atom = RegisterClassEx(&wcx); diff --git a/rostests/winetests/user32/combo.c b/rostests/winetests/user32/combo.c index 51660072a59..cc5586429d9 100644 --- a/rostests/winetests/user32/combo.c +++ b/rostests/winetests/user32/combo.c @@ -303,10 +303,8 @@ static void test_WM_LBUTTONDOWN(void) hEdit = cbInfo.hwndItem; hList = cbInfo.hwndList; - trace("hMainWnd=%x, hCombo=%x, hList=%x, hEdit=%x\n", - (UINT)hMainWnd, (UINT)hCombo, (UINT)hList, (UINT)hEdit); - ok(GetFocus() == hMainWnd, "Focus not on Main Window, instead on %x\n", - (UINT)GetFocus()); + trace("hMainWnd=%p, hCombo=%p, hList=%p, hEdit=%p\n", hMainWnd, hCombo, hList, hEdit); + ok(GetFocus() == hMainWnd, "Focus not on Main Window, instead on %p\n", GetFocus()); /* Click on the button to drop down the list */ x = cbInfo.rcButton.left + (cbInfo.rcButton.right-cbInfo.rcButton.left)/2; @@ -318,14 +316,12 @@ static void test_WM_LBUTTONDOWN(void) "The dropdown list should have appeared after clicking the button.\n"); ok(GetFocus() == hEdit, - "Focus not on ComboBox's Edit Control, instead on %x\n", - (UINT)GetFocus()); + "Focus not on ComboBox's Edit Control, instead on %p\n", GetFocus()); result = SendMessage(hCombo, WM_LBUTTONUP, 0, MAKELPARAM(x, y)); ok(result, "WM_LBUTTONUP was not processed. LastError=%d\n", GetLastError()); ok(GetFocus() == hEdit, - "Focus not on ComboBox's Edit Control, instead on %x\n", - (UINT)GetFocus()); + "Focus not on ComboBox's Edit Control, instead on %p\n", GetFocus()); /* Click on the 5th item in the list */ item_height = SendMessage(hCombo, CB_GETITEMHEIGHT, 0, 0); @@ -336,15 +332,13 @@ static void test_WM_LBUTTONDOWN(void) ok(!result, "WM_LBUTTONDOWN was not processed. LastError=%d\n", GetLastError()); ok(GetFocus() == hEdit, - "Focus not on ComboBox's Edit Control, instead on %x\n", - (UINT)GetFocus()); + "Focus not on ComboBox's Edit Control, instead on %p\n", GetFocus()); result = SendMessage(hList, WM_MOUSEMOVE, 0, MAKELPARAM(x, y)); ok(!result, "WM_MOUSEMOVE was not processed. LastError=%d\n", GetLastError()); ok(GetFocus() == hEdit, - "Focus not on ComboBox's Edit Control, instead on %x\n", - (UINT)GetFocus()); + "Focus not on ComboBox's Edit Control, instead on %p\n", GetFocus()); ok(SendMessage(hCombo, CB_GETDROPPEDSTATE, 0, 0), "The dropdown list should still be visible.\n"); @@ -352,8 +346,7 @@ static void test_WM_LBUTTONDOWN(void) ok(!result, "WM_LBUTTONUP was not processed. LastError=%d\n", GetLastError()); ok(GetFocus() == hEdit, - "Focus not on ComboBox's Edit Control, instead on %x\n", - (UINT)GetFocus()); + "Focus not on ComboBox's Edit Control, instead on %p\n", GetFocus()); ok(!SendMessage(hCombo, CB_GETDROPPEDSTATE, 0, 0), "The dropdown list should have been rolled up.\n"); idx = SendMessage(hCombo, CB_GETCURSEL, 0, 0); diff --git a/rostests/winetests/user32/cursoricon.c b/rostests/winetests/user32/cursoricon.c index 5d1cf2bde1e..947553498ef 100644 --- a/rostests/winetests/user32/cursoricon.c +++ b/rostests/winetests/user32/cursoricon.c @@ -175,7 +175,7 @@ static void do_parent(void) startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL; - sprintf(path_name, "%s cursoricon %x", test_argv[0], (unsigned int) parent); + sprintf(path_name, "%s cursoricon %lx", test_argv[0], (INT_PTR)parent); ok(CreateProcessA(NULL, path_name, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess failed.\n"); child_process = info.hProcess; @@ -840,7 +840,8 @@ static void test_LoadImage(void) ok(icon_info.fIcon == FALSE, "fIcon != FALSE.\n"); ok(icon_info.xHotspot == 1, "xHotspot is %u.\n", icon_info.xHotspot); ok(icon_info.yHotspot == 1, "yHotspot is %u.\n", icon_info.yHotspot); - ok(icon_info.hbmColor != NULL, "No hbmColor!\n"); + ok(icon_info.hbmColor != NULL || broken(!icon_info.hbmColor) /* no color cursor support */, + "No hbmColor!\n"); ok(icon_info.hbmMask != NULL, "No hbmMask!\n"); } @@ -910,7 +911,8 @@ static void test_CreateIconFromResource(void) ok(icon_info.fIcon == FALSE, "fIcon != FALSE.\n"); ok(icon_info.xHotspot == 3, "xHotspot is %u.\n", icon_info.xHotspot); ok(icon_info.yHotspot == 3, "yHotspot is %u.\n", icon_info.yHotspot); - ok(icon_info.hbmColor != NULL, "No hbmColor!\n"); + ok(icon_info.hbmColor != NULL || broken(!icon_info.hbmColor) /* no color cursor support */, + "No hbmColor!\n"); ok(icon_info.hbmMask != NULL, "No hbmMask!\n"); } diff --git a/rostests/winetests/user32/dce.c b/rostests/winetests/user32/dce.c index fead3850a9c..37b95464ef0 100755 --- a/rostests/winetests/user32/dce.c +++ b/rostests/winetests/user32/dce.c @@ -402,7 +402,7 @@ START_TEST(dce) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "cache_class"; diff --git a/rostests/winetests/user32/dde.c b/rostests/winetests/user32/dde.c index a3b73a53e55..e7f09f1b20d 100755 --- a/rostests/winetests/user32/dde.c +++ b/rostests/winetests/user32/dde.c @@ -160,7 +160,7 @@ static LRESULT WINAPI dde_server_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPA lstrcpyA((LPSTR)data->Value, str); GlobalUnlock(hglobal); - lparam = PackDDElParam(WM_DDE_ACK, (UINT)hglobal, HIWORD(lparam)); + lparam = PackDDElParam(WM_DDE_ACK, (UINT_PTR)hglobal, HIWORD(lparam)); PostMessageA(client, WM_DDE_DATA, (WPARAM)hwnd, lparam); break; @@ -427,10 +427,7 @@ todo_wine ret = DdeGetLastError(client_pid); ok(op == NULL, "Expected NULL, got %p\n", op); ok(res == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", res); - todo_wine - { - ok(ret == DMLERR_MEMORY_ERROR, "Expected DMLERR_MEMORY_ERROR, got %d\n", ret); - } + ok(ret == DMLERR_MEMORY_ERROR, "Expected DMLERR_MEMORY_ERROR, got %d\n", ret); /* XTYP_EXECUTE, no data, -1 size */ res = 0xdeadbeef; @@ -562,7 +559,7 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon ULONG_PTR dwData1, ULONG_PTR dwData2) { char str[MAX_PATH], *ptr; - HDDEDATA ret; + HDDEDATA ret = NULL; DWORD size; static int msg_index = 0; @@ -714,7 +711,7 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon case XTYP_EXECUTE: { - ok(msg_index == 9 || msg_index == 10, "Expected 9 or 10, got %d\n", msg_index); + ok(msg_index >= 9 && msg_index <= 11, "Expected 9 or 11, got %d\n", msg_index); ok(uFmt == 0, "Expected 0, got %d\n", uFmt); ok(hconv == conversation, "Expected conversation handle, got %p\n", hconv); ok(dwData1 == 0, "Expected 0, got %08lx\n", dwData1); @@ -725,29 +722,50 @@ static HDDEDATA CALLBACK server_ddeml_callback(UINT uType, UINT uFmt, HCONV hcon ok(!lstrcmpA(str, "TestDDETopic"), "Expected TestDDETopic, got %s\n", str); ok(size == 12, "Expected 12, got %d\n", size); - ptr = (LPSTR)DdeAccessData(hdata, &size); - - if (msg_index == 9) + if (msg_index == 9 || msg_index == 11) { - ok(!lstrcmpA(ptr, "[Command(Var)]"), "Expected '[Command(Var)]', got %s\n", ptr); - ok(size == 15, "Expected 15, got %d\n", size); + ptr = (LPSTR)DdeAccessData(hdata, &size); + + if (msg_index == 9) + { + ok(!lstrcmpA(ptr, "[Command(Var)]"), "Expected '[Command(Var)]', got %s\n", ptr); + ok(size == 15, "Expected 15, got %d\n", size); + ret = (HDDEDATA)DDE_FACK; + } + else + { + ok(!lstrcmpA(ptr, "[BadCommand(Var)]"), "Expected '[BadCommand(Var)]', got %s\n", ptr); + ok(size == 18, "Expected 18, got %d\n", size); + ret = DDE_FNOTPROCESSED; + } + + DdeUnaccessData(hdata); + } + else if (msg_index == 10) + { + DWORD rsize = 0; + size = 0; + + size = DdeGetData(hdata, NULL, 0, 0); + ok(size == 17, "DdeGetData should have returned 17 not %d\n", size); + ptr = HeapAlloc(GetProcessHeap(), 0, size); + ok(ptr != NULL,"HeapAlloc should have returned ptr not NULL\n"); + rsize = DdeGetData(hdata, (LPBYTE)ptr, size, 0); + ok(rsize == size, "DdeGetData did not return %d bytes but %d\n", size, rsize); + + ok(!lstrcmpA(ptr, "[Command-2(Var)]"), "Expected '[Command-2(Var)]' got %s\n", ptr); + ok(size == 17, "Expected 17, got %d\n", size); ret = (HDDEDATA)DDE_FACK; - } - else - { - ok(!lstrcmpA(ptr, "[BadCommand(Var)]"), "Expected '[BadCommand(Var)]', got %s\n", ptr); - ok(size == 18, "Expected 18, got %d\n", size); - ret = (HDDEDATA)DDE_FNOTPROCESSED; - } - DdeUnaccessData(hdata); + HeapFree(GetProcessHeap(), 0, ptr); + } return ret; } case XTYP_DISCONNECT: { - ok(msg_index == 11, "Expected 11, got %d\n", msg_index); + ok(msg_index == 12, "Expected 12, got %d\n", msg_index); ok(uFmt == 0, "Expected 0, got %d\n", uFmt); ok(hconv == conversation, "Expected conversation handle, got %p\n", hconv); ok(dwData1 == 0, "Expected 0, got %08lx\n", dwData1); @@ -836,8 +854,8 @@ static LRESULT WINAPI dde_msg_client_wndproc(HWND hwnd, UINT msg, WPARAM wparam, case WM_DDE_ACK: { - ok((msg_index >= 2 && msg_index <= 4) || (msg_index >= 6 && msg_index <= 10), - "Expected 2, 3, 4, 6, 7, 8, 9 or 10, got %d\n", msg_index); + ok((msg_index >= 2 && msg_index <= 4) || (msg_index >= 6 && msg_index <= 11), + "Expected 2, 3, 4, 6, 7, 8, 9, 10 or 11, got %d\n", msg_index); if (msg_index == 2) { @@ -854,7 +872,7 @@ static LRESULT WINAPI dde_msg_client_wndproc(HWND hwnd, UINT msg, WPARAM wparam, ok(!lstrcmpA(str, "TestDDETopic"), "Expected TestDDETopic, got %s\n", str); ok(size == 12, "Expected 12, got %d\n", size); } - else if (msg_index == 9 || msg_index == 10) + else if (msg_index >= 9 && msg_index <= 11) { ok(wparam == (WPARAM)server_hwnd, "Expected server hwnd, got %08lx\n", wparam); @@ -872,6 +890,10 @@ static LRESULT WINAPI dde_msg_client_wndproc(HWND hwnd, UINT msg, WPARAM wparam, { ok(ack->fAck == TRUE, "Expected TRUE, got %d\n", ack->fAck); ok(!lstrcmpA(ptr, "[Command(Var)]"), "Expected '[Command(Var)]', got %s\n", ptr); + } else if (msg_index == 10) + { + ok(ack->fAck == TRUE, "Expected TRUE, got %d\n", ack->fAck); + ok(!lstrcmpA(ptr, "[Command-2(Var)]"), "Expected '[Command-2(Var)]', got %s\n", ptr); } else { @@ -964,7 +986,7 @@ static LRESULT WINAPI dde_msg_client_wndproc(HWND hwnd, UINT msg, WPARAM wparam, return DefWindowProcA(hwnd, msg, wparam, lparam); } -static HGLOBAL create_poke() +static HGLOBAL create_poke(void) { HGLOBAL hglobal; DDEPOKE *poke; @@ -1000,7 +1022,7 @@ static HGLOBAL create_execute(LPCSTR command) return hglobal; } -static void test_msg_client() +static void test_msg_client(void) { HGLOBAL hglobal; LPARAM lparam; @@ -1109,6 +1131,15 @@ static void test_msg_client() flush_events(); + GlobalFree(execute_hglobal); + execute_hglobal = create_execute("[Command-2(Var)]"); + + /* WM_DDE_EXECUTE, all params correct */ + lparam = PackDDElParam(WM_DDE_EXECUTE, 0, (UINT_PTR)execute_hglobal); + PostMessageA(server_hwnd, WM_DDE_EXECUTE, (WPARAM)client_hwnd, lparam); + + flush_events(); + GlobalFree(execute_hglobal); execute_hglobal = create_execute("[BadCommand(Var)]"); @@ -1313,7 +1344,7 @@ static void test_dde_aw_transaction(void) dde_inst = 0; ret = DdeInitializeA(&dde_inst, client_dde_callback, APPCMD_CLIENTONLY, 0); - ok(ret == DMLERR_NO_ERROR, "DdeInitializeW failed with error %04x (%x)\n", + ok(ret == DMLERR_NO_ERROR, "DdeInitializeA failed with error %04x (%x)\n", ret, DdeGetLastError(dde_inst)); hsz_server = DdeCreateStringHandleW(dde_inst, TEST_DDE_SERVICE, CP_WINUNICODE); @@ -1513,35 +1544,69 @@ static void test_DdeCreateStringHandleW(DWORD dde_inst, int codepage) static void test_DdeCreateDataHandle(void) { HDDEDATA hdata; - DWORD dde_inst; + DWORD dde_inst, dde_inst2; DWORD size; UINT res, err; BOOL ret; HSZ item; LPBYTE ptr; + WCHAR item_str[] = {'i','t','e','m',0}; dde_inst = 0; + dde_inst2 = 0; res = DdeInitializeA(&dde_inst, client_ddeml_callback, APPCMD_CLIENTONLY, 0); ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res); + res = DdeInitializeA(&dde_inst2, client_ddeml_callback, APPCMD_CLIENTONLY, 0); + ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res); + + /* 0 instance id + * This block tests an invalid instance Id. The correct behaviour is that if the instance Id + * is invalid then the lastError of all instances is set to the error. There are two instances + * created, lastError is cleared, an error is generated and then both instances are checked to + * ensure that they both have the same error set + */ + item = DdeCreateStringHandleA(0, "item", CP_WINANSI); + ok(item == NULL, "Expected NULL hsz got %p\n", item); + err = DdeGetLastError(dde_inst); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + err = DdeGetLastError(dde_inst2); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + item = DdeCreateStringHandleW(0, item_str, CP_WINUNICODE); + ok(item == NULL, "Expected NULL hsz got %p\n", item); + err = DdeGetLastError(dde_inst); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + err = DdeGetLastError(dde_inst2); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + item = DdeCreateStringHandleA(dde_inst, "item", CP_WINANSI); ok(item != NULL, "Expected non-NULL hsz\n"); + item = DdeCreateStringHandleA(dde_inst2, "item", CP_WINANSI); + ok(item != NULL, "Expected non-NULL hsz\n"); if (0) { /* do not test with an invalid instance id: that crashes on win9x */ hdata = DdeCreateDataHandle(0xdeadbeef, (LPBYTE)"data", MAX_PATH, 0, item, CF_TEXT, 0); } - /* 0 instance id */ + /* 0 instance id + * This block tests an invalid instance Id. The correct behaviour is that if the instance Id + * is invalid then the lastError of all instances is set to the error. There are two instances + * created, lastError is cleared, an error is generated and then both instances are checked to + * ensure that they both have the same error set + */ DdeGetLastError(dde_inst); + DdeGetLastError(dde_inst2); hdata = DdeCreateDataHandle(0, (LPBYTE)"data", MAX_PATH, 0, item, CF_TEXT, 0); err = DdeGetLastError(dde_inst); - todo_wine - { - ok(hdata == NULL, "Expected NULL, got %p\n", hdata); - ok(err == DMLERR_INVALIDPARAMETER, - "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); - } + ok(hdata == NULL, "Expected NULL, got %p\n", hdata); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + err = DdeGetLastError(dde_inst2); + ok(err == DMLERR_INVALIDPARAMETER, "Expected DMLERR_INVALIDPARAMETER, got %d\n", err); + + ret = DdeUninitialize(dde_inst2); + ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res); + /* NULL pSrc */ DdeGetLastError(dde_inst); @@ -1701,7 +1766,7 @@ static void test_DdeCreateStringHandle(void) ret = DdeInitializeW(&dde_inst, client_ddeml_callback, APPCMD_CLIENTONLY, 0); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("DdeInitialize is unimplemented\n"); + win_skip("DdeInitializeW is unimplemented\n"); return; } @@ -1793,7 +1858,8 @@ static void test_PackDDElParam(void) BOOL ret; lparam = PackDDElParam(WM_DDE_INITIATE, 0xcafe, 0xbeef); - ok(lparam == 0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); + /* value gets sign-extended despite being an LPARAM */ + ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); ok(GlobalLock((HGLOBAL)lparam) == NULL, "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); ok(GetLastError() == ERROR_INVALID_HANDLE, @@ -1809,7 +1875,7 @@ static void test_PackDDElParam(void) ok(ret == TRUE, "Expected TRUE, got %d\n", ret); lparam = PackDDElParam(WM_DDE_TERMINATE, 0xcafe, 0xbeef); - ok(lparam == 0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); + ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); ok(GlobalLock((HGLOBAL)lparam) == NULL, "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); ok(GetLastError() == ERROR_INVALID_HANDLE, @@ -1853,7 +1919,7 @@ static void test_PackDDElParam(void) "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lparam = PackDDElParam(WM_DDE_UNADVISE, 0xcafe, 0xbeef); - ok(lparam == 0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); + ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); ok(GlobalLock((HGLOBAL)lparam) == NULL, "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); ok(GetLastError() == ERROR_INVALID_HANDLE, @@ -1870,7 +1936,7 @@ static void test_PackDDElParam(void) lparam = PackDDElParam(WM_DDE_ACK, 0xcafe, 0xbeef); /* win9x returns the input (0xbeef<<16 | 0xcafe) here */ - if (lparam != 0xbeefcafe) { + if (lparam != (int)0xbeefcafe) { ptr = GlobalLock((HGLOBAL)lparam); ok(ptr != NULL, "Expected non-NULL ptr\n"); ok(ptr[0] == 0xcafe, "Expected 0xcafe, got %08lx\n", ptr[0]); @@ -1925,7 +1991,7 @@ static void test_PackDDElParam(void) "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); lparam = PackDDElParam(WM_DDE_REQUEST, 0xcafe, 0xbeef); - ok(lparam == 0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); + ok(lparam == (int)0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam); ok(GlobalLock((HGLOBAL)lparam) == NULL, "Expected NULL, got %p\n", GlobalLock((HGLOBAL)lparam)); ok(GetLastError() == ERROR_INVALID_HANDLE, @@ -2148,8 +2214,10 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV char str[MAX_PATH]; static int msg_index = 0; static HCONV conversation = 0; - static char test_cmd[] = "test dde command"; - static WCHAR test_cmd_w[] = {'t','e','s','t',' ','d','d','e',' ','c','o','m','m','a','n','d',0}; + static char test_cmd_w_to_a[] = "test dde command"; + static char test_cmd_a_to_a[] = "Test dde command"; + static WCHAR test_cmd_w_to_w[] = {'t','e','s','t',' ','d','d','e',' ','c','o','m','m','a','n','d',0}; + static WCHAR test_cmd_a_to_w[] = {'T','e','s','t',' ','d','d','e',' ','c','o','m','m','a','n','d',0}; static char test_service [] = "TestDDEService"; static char test_topic [] = "TestDDETopic"; @@ -2223,8 +2291,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV size, msg_index); else if (msg_index ==22) - todo_wine - ok(size == 9, "Expected that size should be 9 not %d, msg_index=%d\n", + ok(size == 8 || size == 9, "Expected that size should be 8 or 9 not %d, msg_index=%d\n", size, msg_index); else if (msg_index == 5) @@ -2242,14 +2309,14 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV size, rsize, msg_index); if (msg_index == 10 || msg_index == 16) todo_wine { - ok(!lstrcmpW((WCHAR*)buffer, test_cmd_w), + ok(!lstrcmpW((WCHAR*)buffer, test_cmd_a_to_w), "Expected \"Test dde command\", msg_index=%d\n", msg_index); ok(size == 34, "Expected 34, got %d, msg_index=%d\n", size, msg_index); } else { - ok(!lstrcmpW((WCHAR*)buffer, test_cmd_w), - "Expected \"Test dde command\", msg_index=%d\n", + ok(!lstrcmpW((WCHAR*)buffer, test_cmd_w_to_w), + "Expected \"test dde command\", msg_index=%d\n", msg_index); ok(size == 34, "Expected 34, got %d, msg_index=%d\n", size, msg_index); } @@ -2263,16 +2330,22 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV size, rsize, msg_index); if (msg_index == 5) todo_wine { - ok(!lstrcmpA((CHAR*)buffer, test_cmd), "Expected %s, got %s, msg_index=%d\n", - test_cmd, buffer, msg_index); + ok(!lstrcmpA((CHAR*)buffer, test_cmd_w_to_a), "Expected %s, got %s, msg_index=%d\n", + test_cmd_w_to_a, buffer, msg_index); ok(size == 17, "Expected size should be 17, got %d, msg_index=%d\n", size, msg_index); } - else + else if (msg_index == 23) { - ok(!lstrcmpA((CHAR*)buffer, test_cmd), "Expected %s, got %s, msg_index=%d\n", - test_cmd, buffer, msg_index); + ok(!lstrcmpA((CHAR*)buffer, test_cmd_w_to_a), "Expected %s, got %s, msg_index=%d\n", + test_cmd_w_to_a, buffer, msg_index); ok(size == 17, "Expected size should be 17, got %d, msg_index=%d\n", size, msg_index); } + else + { + ok(!lstrcmpA((CHAR*)buffer, test_cmd_a_to_a), "Expected %s, got %s, msg_index=%d\n", + test_cmd_a_to_a, buffer, msg_index); + ok(size == 17, "Expected size should be 17, got %d, msg_index=%d\n", size, msg_index); + } } @@ -2311,14 +2384,14 @@ static void test_end_to_end_client(BOOL type_a) HSZ server, topic; HCONV hconv; HDDEDATA hdata; - static char test_cmd[] = "test dde command"; + static char test_cmd[] = "Test dde command"; static WCHAR test_cmd_w[] = {'t','e','s','t',' ','d','d','e',' ','c','o','m','m','a','n','d',0}; static char test_service[] = "TestDDEService"; static WCHAR test_service_w[] = {'T','e','s','t','D','D','E','S','e','r','v','i','c','e',0}; static char test_topic[] = "TestDDETopic"; static WCHAR test_topic_w[] = {'T','e','s','t','D','D','E','T','o','p','i','c',0}; - trace("Start end to end client %d\n", type_a); + trace("Start end to end client %s\n", type_a ? "ASCII" : "UNICODE"); if (type_a) ret = DdeInitializeA(&client_pid, client_end_to_end_callback, APPCMD_CLIENTONLY, 0); @@ -2376,7 +2449,7 @@ static void test_end_to_end_server(HANDLE hproc, HANDLE hthread, BOOL type_a) HDDEDATA hdata; static CHAR test_service[] = "TestDDEService"; - trace("start end to end server %d\n", type_a); + trace("start end to end server %s\n", type_a ? "ASCII" : "UNICODE"); server_pid = 0; if (type_a) diff --git a/rostests/winetests/user32/dialog.c b/rostests/winetests/user32/dialog.c index f92566c16b4..84929e35c1c 100755 --- a/rostests/winetests/user32/dialog.c +++ b/rostests/winetests/user32/dialog.c @@ -54,7 +54,7 @@ static BOOL g_bInitialFocusInitDlgResult; static int g_terminated; typedef struct { - unsigned int id; + INT_PTR id; int parent; DWORD style; DWORD exstyle; @@ -160,7 +160,7 @@ static BOOL CreateWindows (HINSTANCE hinst) { if (p->id >= sizeof(hwnd)/sizeof(hwnd[0])) { - trace ("Control %d is out of range\n", p->id); + trace ("Control %ld is out of range\n", p->id); return FALSE; } else @@ -168,21 +168,21 @@ static BOOL CreateWindows (HINSTANCE hinst) } if (p->id <= 0) { - trace ("Control %d is out of range\n", p->id); + trace ("Control %ld is out of range\n", p->id); return FALSE; } if (hwnd[p->id] != 0) { - trace ("Control %d is used more than once\n", p->id); + trace ("Control %ld is used more than once\n", p->id); return FALSE; } /* Create the control */ - sprintf (ctrlname, "ctrl%4.4d", p->id); + sprintf (ctrlname, "ctrl%4.4ld", p->id); hwnd[p->id] = CreateWindowEx (p->exstyle, TEXT(p->parent ? "static" : "GetNextDlgItemWindowClass"), TEXT(ctrlname), p->style, 10, 10, 10, 10, hwnd[p->parent], p->parent ? (HMENU) (2000 + p->id) : 0, hinst, 0); if (!hwnd[p->id]) { - trace ("Failed to create control %d\n", p->id); + trace ("Failed to create control %ld\n", p->id); return FALSE; } @@ -196,7 +196,7 @@ static BOOL CreateWindows (HINSTANCE hinst) exstyle = GetWindowLong (hwnd[p->id], GWL_EXSTYLE); if (style != p->style || exstyle != p->exstyle) { - trace ("Style mismatch at %d: %8.8x %8.8x cf %8.8x %8.8x\n", p->id, style, exstyle, p->style, p->exstyle); + trace ("Style mismatch at %ld: %8.8x %8.8x cf %8.8x %8.8x\n", p->id, style, exstyle, p->style, p->exstyle); } } p++; @@ -872,7 +872,7 @@ static void InitialFocusTest (void) HANDLE hTemplate; DLGTEMPLATE* pTemplate; - hResource = FindResourceA(g_hinst,"FOCUS_TEST_DIALOG", (LPSTR)RT_DIALOG); + hResource = FindResourceA(g_hinst,"FOCUS_TEST_DIALOG", RT_DIALOG); hTemplate = LoadResource(g_hinst, hResource); pTemplate = LockResource(hTemplate); diff --git a/rostests/winetests/user32/edit.c b/rostests/winetests/user32/edit.c index f6dc918240f..b1a982079f2 100755 --- a/rostests/winetests/user32/edit.c +++ b/rostests/winetests/user32/edit.c @@ -1973,7 +1973,7 @@ static BOOL RegisterWindowClasses (void) test3.cbWndExtra = 0; test3.hInstance = hinst; test3.hIcon = 0; - test3.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + test3.hCursor = LoadCursorA(0, IDC_ARROW); test3.hbrBackground = GetStockObject(WHITE_BRUSH); test3.lpszMenuName = NULL; test3.lpszClassName = szEditTest3Class; @@ -2001,7 +2001,7 @@ static void UnregisterWindowClasses (void) UnregisterClassA(szEditTextPositionClass, hinst); } -void test_fontsize(void) +static void test_fontsize(void) { HWND hwEdit; HFONT hfont; diff --git a/rostests/winetests/user32/generated.c b/rostests/winetests/user32/generated.c index c2d24f913ff..d25de8fddd1 100644 --- a/rostests/winetests/user32/generated.c +++ b/rostests/winetests/user32/generated.c @@ -1,4 +1,4 @@ -/* File generated automatically from tools/winapi/test.dat; do not edit! */ +/* File generated automatically from tools/winapi/tests.dat; do not edit! */ /* This file can be copied, modified and distributed without restriction. */ /* @@ -27,22 +27,14 @@ * Windows API extension */ -#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) -# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field) -#elif defined(__GNUC__) -# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field) -#else -/* FIXME: Not sure if is possible to do without compiler extension */ -#endif - #if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) # define _TYPE_ALIGNMENT(type) __alignof(type) #elif defined(__GNUC__) # define _TYPE_ALIGNMENT(type) __alignof__(type) #else /* - * FIXME: Not sure if is possible to do without compiler extension - * (if type is not just a name that is, if so the normal) + * FIXME: May not be possible without a compiler extension + * (if type is not just a name that is, otherwise the normal * TYPE_ALIGNMENT can be used) */ #endif @@ -59,2170 +51,3536 @@ * Test helper macros */ -#ifdef FIELD_ALIGNMENT -# define TEST_FIELD_ALIGNMENT(type, field, align) \ - ok(FIELD_ALIGNMENT(type, field) == align, \ - "FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \ - (int)FIELD_ALIGNMENT(type, field)) +#ifdef _WIN64 + +# define TEST_TYPE_SIZE(type, size) +# define TEST_TYPE_ALIGN(type, align) +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# define TEST_FIELD_OFFSET(type, field, offset) + #else -# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0) + +# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); + +# ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +# else +# define TEST_TYPE_ALIGN(type, align) +# endif + +# ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +# else +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# endif + +# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #endif -#define TEST_FIELD_OFFSET(type, field, offset) \ - ok(FIELD_OFFSET(type, field) == offset, \ - "FIELD_OFFSET(" #type ", " #field ") == %ld (expected " #offset ")\n", \ - (long int)FIELD_OFFSET(type, field)) +#define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) +#define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) +#define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); +#define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); -#ifdef _TYPE_ALIGNMENT -#define TEST__TYPE_ALIGNMENT(type, align) \ - ok(_TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)_TYPE_ALIGNMENT(type)) -#else -# define TEST__TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#ifdef TYPE_ALIGNMENT -#define TEST_TYPE_ALIGNMENT(type, align) \ - ok(TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)TYPE_ALIGNMENT(type)) -#else -# define TEST_TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#define TEST_TYPE_SIZE(type, size) \ - ok(sizeof(type) == size, "sizeof(" #type ") == %d (expected " #size ")\n", ((int) sizeof(type))) - -/*********************************************************************** - * Test macros - */ - -#define TEST_FIELD(type, field_type, field_name, field_offset, field_size, field_align) \ - TEST_TYPE_SIZE(field_type, field_size); \ - TEST_FIELD_ALIGNMENT(type, field_name, field_align); \ - TEST_FIELD_OFFSET(type, field_name, field_offset); \ - -#define TEST_TYPE(type, size, align) \ - TEST_TYPE_ALIGNMENT(type, align); \ - TEST_TYPE_SIZE(type, size) - -#define TEST_TYPE_POINTER(type, size, align) \ - TEST__TYPE_ALIGNMENT(*(type)0, align); \ - TEST_TYPE_SIZE(*(type)0, size) - -#define TEST_TYPE_SIGNED(type) \ - ok((type) -1 < 0, "(" #type ") -1 < 0\n"); - -#define TEST_TYPE_UNSIGNED(type) \ - ok((type) -1 > 0, "(" #type ") -1 > 0\n"); static void test_pack_ACCESSTIMEOUT(void) { /* ACCESSTIMEOUT (pack 4) */ - TEST_TYPE(ACCESSTIMEOUT, 12, 4); - TEST_FIELD(ACCESSTIMEOUT, UINT, cbSize, 0, 4, 4); - TEST_FIELD(ACCESSTIMEOUT, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(ACCESSTIMEOUT, DWORD, iTimeOutMSec, 8, 4, 4); + TEST_TYPE_SIZE (ACCESSTIMEOUT, 12) + TEST_TYPE_ALIGN (ACCESSTIMEOUT, 4) + TEST_FIELD_SIZE (ACCESSTIMEOUT, cbSize, 4) + TEST_FIELD_ALIGN (ACCESSTIMEOUT, cbSize, 4) + TEST_FIELD_OFFSET(ACCESSTIMEOUT, cbSize, 0) + TEST_FIELD_SIZE (ACCESSTIMEOUT, dwFlags, 4) + TEST_FIELD_ALIGN (ACCESSTIMEOUT, dwFlags, 4) + TEST_FIELD_OFFSET(ACCESSTIMEOUT, dwFlags, 4) + TEST_FIELD_SIZE (ACCESSTIMEOUT, iTimeOutMSec, 4) + TEST_FIELD_ALIGN (ACCESSTIMEOUT, iTimeOutMSec, 4) + TEST_FIELD_OFFSET(ACCESSTIMEOUT, iTimeOutMSec, 8) } static void test_pack_ANIMATIONINFO(void) { /* ANIMATIONINFO (pack 4) */ - TEST_TYPE(ANIMATIONINFO, 8, 4); - TEST_FIELD(ANIMATIONINFO, UINT, cbSize, 0, 4, 4); - TEST_FIELD(ANIMATIONINFO, INT, iMinAnimate, 4, 4, 4); + TEST_TYPE_SIZE (ANIMATIONINFO, 8) + TEST_TYPE_ALIGN (ANIMATIONINFO, 4) + TEST_FIELD_SIZE (ANIMATIONINFO, cbSize, 4) + TEST_FIELD_ALIGN (ANIMATIONINFO, cbSize, 4) + TEST_FIELD_OFFSET(ANIMATIONINFO, cbSize, 0) + TEST_FIELD_SIZE (ANIMATIONINFO, iMinAnimate, 4) + TEST_FIELD_ALIGN (ANIMATIONINFO, iMinAnimate, 4) + TEST_FIELD_OFFSET(ANIMATIONINFO, iMinAnimate, 4) } static void test_pack_CBTACTIVATESTRUCT(void) { /* CBTACTIVATESTRUCT (pack 4) */ - TEST_TYPE(CBTACTIVATESTRUCT, 8, 4); - TEST_FIELD(CBTACTIVATESTRUCT, BOOL, fMouse, 0, 4, 4); - TEST_FIELD(CBTACTIVATESTRUCT, HWND, hWndActive, 4, 4, 4); + TEST_TYPE_SIZE (CBTACTIVATESTRUCT, 8) + TEST_TYPE_ALIGN (CBTACTIVATESTRUCT, 4) + TEST_FIELD_SIZE (CBTACTIVATESTRUCT, fMouse, 4) + TEST_FIELD_ALIGN (CBTACTIVATESTRUCT, fMouse, 4) + TEST_FIELD_OFFSET(CBTACTIVATESTRUCT, fMouse, 0) + TEST_FIELD_SIZE (CBTACTIVATESTRUCT, hWndActive, 4) + TEST_FIELD_ALIGN (CBTACTIVATESTRUCT, hWndActive, 4) + TEST_FIELD_OFFSET(CBTACTIVATESTRUCT, hWndActive, 4) } static void test_pack_CBT_CREATEWNDA(void) { /* CBT_CREATEWNDA (pack 4) */ - TEST_TYPE(CBT_CREATEWNDA, 8, 4); - TEST_FIELD(CBT_CREATEWNDA, CREATESTRUCTA *, lpcs, 0, 4, 4); - TEST_FIELD(CBT_CREATEWNDA, HWND, hwndInsertAfter, 4, 4, 4); + TEST_TYPE_SIZE (CBT_CREATEWNDA, 8) + TEST_TYPE_ALIGN (CBT_CREATEWNDA, 4) + TEST_FIELD_SIZE (CBT_CREATEWNDA, lpcs, 4) + TEST_FIELD_ALIGN (CBT_CREATEWNDA, lpcs, 4) + TEST_FIELD_OFFSET(CBT_CREATEWNDA, lpcs, 0) + TEST_FIELD_SIZE (CBT_CREATEWNDA, hwndInsertAfter, 4) + TEST_FIELD_ALIGN (CBT_CREATEWNDA, hwndInsertAfter, 4) + TEST_FIELD_OFFSET(CBT_CREATEWNDA, hwndInsertAfter, 4) } static void test_pack_CBT_CREATEWNDW(void) { /* CBT_CREATEWNDW (pack 4) */ - TEST_TYPE(CBT_CREATEWNDW, 8, 4); - TEST_FIELD(CBT_CREATEWNDW, CREATESTRUCTW *, lpcs, 0, 4, 4); - TEST_FIELD(CBT_CREATEWNDW, HWND, hwndInsertAfter, 4, 4, 4); + TEST_TYPE_SIZE (CBT_CREATEWNDW, 8) + TEST_TYPE_ALIGN (CBT_CREATEWNDW, 4) + TEST_FIELD_SIZE (CBT_CREATEWNDW, lpcs, 4) + TEST_FIELD_ALIGN (CBT_CREATEWNDW, lpcs, 4) + TEST_FIELD_OFFSET(CBT_CREATEWNDW, lpcs, 0) + TEST_FIELD_SIZE (CBT_CREATEWNDW, hwndInsertAfter, 4) + TEST_FIELD_ALIGN (CBT_CREATEWNDW, hwndInsertAfter, 4) + TEST_FIELD_OFFSET(CBT_CREATEWNDW, hwndInsertAfter, 4) } static void test_pack_CLIENTCREATESTRUCT(void) { /* CLIENTCREATESTRUCT (pack 4) */ - TEST_TYPE(CLIENTCREATESTRUCT, 8, 4); - TEST_FIELD(CLIENTCREATESTRUCT, HMENU, hWindowMenu, 0, 4, 4); - TEST_FIELD(CLIENTCREATESTRUCT, UINT, idFirstChild, 4, 4, 4); + TEST_TYPE_SIZE (CLIENTCREATESTRUCT, 8) + TEST_TYPE_ALIGN (CLIENTCREATESTRUCT, 4) + TEST_FIELD_SIZE (CLIENTCREATESTRUCT, hWindowMenu, 4) + TEST_FIELD_ALIGN (CLIENTCREATESTRUCT, hWindowMenu, 4) + TEST_FIELD_OFFSET(CLIENTCREATESTRUCT, hWindowMenu, 0) + TEST_FIELD_SIZE (CLIENTCREATESTRUCT, idFirstChild, 4) + TEST_FIELD_ALIGN (CLIENTCREATESTRUCT, idFirstChild, 4) + TEST_FIELD_OFFSET(CLIENTCREATESTRUCT, idFirstChild, 4) } static void test_pack_COMBOBOXINFO(void) { /* COMBOBOXINFO (pack 4) */ - TEST_TYPE(COMBOBOXINFO, 52, 4); - TEST_FIELD(COMBOBOXINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(COMBOBOXINFO, RECT, rcItem, 4, 16, 4); - TEST_FIELD(COMBOBOXINFO, RECT, rcButton, 20, 16, 4); - TEST_FIELD(COMBOBOXINFO, DWORD, stateButton, 36, 4, 4); - TEST_FIELD(COMBOBOXINFO, HWND, hwndCombo, 40, 4, 4); - TEST_FIELD(COMBOBOXINFO, HWND, hwndItem, 44, 4, 4); - TEST_FIELD(COMBOBOXINFO, HWND, hwndList, 48, 4, 4); + TEST_TYPE_SIZE (COMBOBOXINFO, 52) + TEST_TYPE_ALIGN (COMBOBOXINFO, 4) + TEST_FIELD_SIZE (COMBOBOXINFO, cbSize, 4) + TEST_FIELD_ALIGN (COMBOBOXINFO, cbSize, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, cbSize, 0) + TEST_FIELD_SIZE (COMBOBOXINFO, rcItem, 16) + TEST_FIELD_ALIGN (COMBOBOXINFO, rcItem, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, rcItem, 4) + TEST_FIELD_SIZE (COMBOBOXINFO, rcButton, 16) + TEST_FIELD_ALIGN (COMBOBOXINFO, rcButton, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, rcButton, 20) + TEST_FIELD_SIZE (COMBOBOXINFO, stateButton, 4) + TEST_FIELD_ALIGN (COMBOBOXINFO, stateButton, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, stateButton, 36) + TEST_FIELD_SIZE (COMBOBOXINFO, hwndCombo, 4) + TEST_FIELD_ALIGN (COMBOBOXINFO, hwndCombo, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, hwndCombo, 40) + TEST_FIELD_SIZE (COMBOBOXINFO, hwndItem, 4) + TEST_FIELD_ALIGN (COMBOBOXINFO, hwndItem, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, hwndItem, 44) + TEST_FIELD_SIZE (COMBOBOXINFO, hwndList, 4) + TEST_FIELD_ALIGN (COMBOBOXINFO, hwndList, 4) + TEST_FIELD_OFFSET(COMBOBOXINFO, hwndList, 48) } static void test_pack_COMPAREITEMSTRUCT(void) { /* COMPAREITEMSTRUCT (pack 4) */ - TEST_TYPE(COMPAREITEMSTRUCT, 32, 4); - TEST_FIELD(COMPAREITEMSTRUCT, UINT, CtlType, 0, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, UINT, CtlID, 4, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, HWND, hwndItem, 8, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, UINT, itemID1, 12, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, ULONG_PTR, itemData1, 16, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, UINT, itemID2, 20, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, ULONG_PTR, itemData2, 24, 4, 4); - TEST_FIELD(COMPAREITEMSTRUCT, DWORD, dwLocaleId, 28, 4, 4); + TEST_TYPE_SIZE (COMPAREITEMSTRUCT, 32) + TEST_TYPE_ALIGN (COMPAREITEMSTRUCT, 4) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, CtlType, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, CtlType, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, CtlType, 0) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, CtlID, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, CtlID, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, CtlID, 4) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, hwndItem, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, hwndItem, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, hwndItem, 8) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, itemID1, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, itemID1, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, itemID1, 12) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, itemData1, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, itemData1, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, itemData1, 16) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, itemID2, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, itemID2, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, itemID2, 20) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, itemData2, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, itemData2, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, itemData2, 24) + TEST_FIELD_SIZE (COMPAREITEMSTRUCT, dwLocaleId, 4) + TEST_FIELD_ALIGN (COMPAREITEMSTRUCT, dwLocaleId, 4) + TEST_FIELD_OFFSET(COMPAREITEMSTRUCT, dwLocaleId, 28) } static void test_pack_COPYDATASTRUCT(void) { /* COPYDATASTRUCT (pack 4) */ - TEST_TYPE(COPYDATASTRUCT, 12, 4); - TEST_FIELD(COPYDATASTRUCT, ULONG_PTR, dwData, 0, 4, 4); - TEST_FIELD(COPYDATASTRUCT, DWORD, cbData, 4, 4, 4); - TEST_FIELD(COPYDATASTRUCT, PVOID, lpData, 8, 4, 4); + TEST_TYPE_SIZE (COPYDATASTRUCT, 12) + TEST_TYPE_ALIGN (COPYDATASTRUCT, 4) + TEST_FIELD_SIZE (COPYDATASTRUCT, dwData, 4) + TEST_FIELD_ALIGN (COPYDATASTRUCT, dwData, 4) + TEST_FIELD_OFFSET(COPYDATASTRUCT, dwData, 0) + TEST_FIELD_SIZE (COPYDATASTRUCT, cbData, 4) + TEST_FIELD_ALIGN (COPYDATASTRUCT, cbData, 4) + TEST_FIELD_OFFSET(COPYDATASTRUCT, cbData, 4) + TEST_FIELD_SIZE (COPYDATASTRUCT, lpData, 4) + TEST_FIELD_ALIGN (COPYDATASTRUCT, lpData, 4) + TEST_FIELD_OFFSET(COPYDATASTRUCT, lpData, 8) } static void test_pack_CREATESTRUCTA(void) { /* CREATESTRUCTA (pack 4) */ - TEST_TYPE(CREATESTRUCTA, 48, 4); - TEST_FIELD(CREATESTRUCTA, LPVOID, lpCreateParams, 0, 4, 4); - TEST_FIELD(CREATESTRUCTA, HINSTANCE, hInstance, 4, 4, 4); - TEST_FIELD(CREATESTRUCTA, HMENU, hMenu, 8, 4, 4); - TEST_FIELD(CREATESTRUCTA, HWND, hwndParent, 12, 4, 4); - TEST_FIELD(CREATESTRUCTA, INT, cy, 16, 4, 4); - TEST_FIELD(CREATESTRUCTA, INT, cx, 20, 4, 4); - TEST_FIELD(CREATESTRUCTA, INT, y, 24, 4, 4); - TEST_FIELD(CREATESTRUCTA, INT, x, 28, 4, 4); - TEST_FIELD(CREATESTRUCTA, LONG, style, 32, 4, 4); - TEST_FIELD(CREATESTRUCTA, LPCSTR, lpszName, 36, 4, 4); - TEST_FIELD(CREATESTRUCTA, LPCSTR, lpszClass, 40, 4, 4); - TEST_FIELD(CREATESTRUCTA, DWORD, dwExStyle, 44, 4, 4); + TEST_TYPE_SIZE (CREATESTRUCTA, 48) + TEST_TYPE_ALIGN (CREATESTRUCTA, 4) + TEST_FIELD_SIZE (CREATESTRUCTA, lpCreateParams, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, lpCreateParams, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, lpCreateParams, 0) + TEST_FIELD_SIZE (CREATESTRUCTA, hInstance, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, hInstance, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, hInstance, 4) + TEST_FIELD_SIZE (CREATESTRUCTA, hMenu, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, hMenu, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, hMenu, 8) + TEST_FIELD_SIZE (CREATESTRUCTA, hwndParent, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, hwndParent, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, hwndParent, 12) + TEST_FIELD_SIZE (CREATESTRUCTA, cy, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, cy, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, cy, 16) + TEST_FIELD_SIZE (CREATESTRUCTA, cx, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, cx, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, cx, 20) + TEST_FIELD_SIZE (CREATESTRUCTA, y, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, y, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, y, 24) + TEST_FIELD_SIZE (CREATESTRUCTA, x, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, x, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, x, 28) + TEST_FIELD_SIZE (CREATESTRUCTA, style, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, style, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, style, 32) + TEST_FIELD_SIZE (CREATESTRUCTA, lpszName, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, lpszName, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, lpszName, 36) + TEST_FIELD_SIZE (CREATESTRUCTA, lpszClass, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, lpszClass, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, lpszClass, 40) + TEST_FIELD_SIZE (CREATESTRUCTA, dwExStyle, 4) + TEST_FIELD_ALIGN (CREATESTRUCTA, dwExStyle, 4) + TEST_FIELD_OFFSET(CREATESTRUCTA, dwExStyle, 44) } static void test_pack_CREATESTRUCTW(void) { /* CREATESTRUCTW (pack 4) */ - TEST_TYPE(CREATESTRUCTW, 48, 4); - TEST_FIELD(CREATESTRUCTW, LPVOID, lpCreateParams, 0, 4, 4); - TEST_FIELD(CREATESTRUCTW, HINSTANCE, hInstance, 4, 4, 4); - TEST_FIELD(CREATESTRUCTW, HMENU, hMenu, 8, 4, 4); - TEST_FIELD(CREATESTRUCTW, HWND, hwndParent, 12, 4, 4); - TEST_FIELD(CREATESTRUCTW, INT, cy, 16, 4, 4); - TEST_FIELD(CREATESTRUCTW, INT, cx, 20, 4, 4); - TEST_FIELD(CREATESTRUCTW, INT, y, 24, 4, 4); - TEST_FIELD(CREATESTRUCTW, INT, x, 28, 4, 4); - TEST_FIELD(CREATESTRUCTW, LONG, style, 32, 4, 4); - TEST_FIELD(CREATESTRUCTW, LPCWSTR, lpszName, 36, 4, 4); - TEST_FIELD(CREATESTRUCTW, LPCWSTR, lpszClass, 40, 4, 4); - TEST_FIELD(CREATESTRUCTW, DWORD, dwExStyle, 44, 4, 4); + TEST_TYPE_SIZE (CREATESTRUCTW, 48) + TEST_TYPE_ALIGN (CREATESTRUCTW, 4) + TEST_FIELD_SIZE (CREATESTRUCTW, lpCreateParams, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, lpCreateParams, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, lpCreateParams, 0) + TEST_FIELD_SIZE (CREATESTRUCTW, hInstance, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, hInstance, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, hInstance, 4) + TEST_FIELD_SIZE (CREATESTRUCTW, hMenu, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, hMenu, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, hMenu, 8) + TEST_FIELD_SIZE (CREATESTRUCTW, hwndParent, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, hwndParent, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, hwndParent, 12) + TEST_FIELD_SIZE (CREATESTRUCTW, cy, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, cy, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, cy, 16) + TEST_FIELD_SIZE (CREATESTRUCTW, cx, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, cx, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, cx, 20) + TEST_FIELD_SIZE (CREATESTRUCTW, y, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, y, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, y, 24) + TEST_FIELD_SIZE (CREATESTRUCTW, x, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, x, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, x, 28) + TEST_FIELD_SIZE (CREATESTRUCTW, style, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, style, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, style, 32) + TEST_FIELD_SIZE (CREATESTRUCTW, lpszName, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, lpszName, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, lpszName, 36) + TEST_FIELD_SIZE (CREATESTRUCTW, lpszClass, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, lpszClass, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, lpszClass, 40) + TEST_FIELD_SIZE (CREATESTRUCTW, dwExStyle, 4) + TEST_FIELD_ALIGN (CREATESTRUCTW, dwExStyle, 4) + TEST_FIELD_OFFSET(CREATESTRUCTW, dwExStyle, 44) } static void test_pack_CURSORINFO(void) { /* CURSORINFO (pack 4) */ - TEST_TYPE(CURSORINFO, 20, 4); - TEST_FIELD(CURSORINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(CURSORINFO, DWORD, flags, 4, 4, 4); - TEST_FIELD(CURSORINFO, HCURSOR, hCursor, 8, 4, 4); - TEST_FIELD(CURSORINFO, POINT, ptScreenPos, 12, 8, 4); + TEST_TYPE_SIZE (CURSORINFO, 20) + TEST_TYPE_ALIGN (CURSORINFO, 4) + TEST_FIELD_SIZE (CURSORINFO, cbSize, 4) + TEST_FIELD_ALIGN (CURSORINFO, cbSize, 4) + TEST_FIELD_OFFSET(CURSORINFO, cbSize, 0) + TEST_FIELD_SIZE (CURSORINFO, flags, 4) + TEST_FIELD_ALIGN (CURSORINFO, flags, 4) + TEST_FIELD_OFFSET(CURSORINFO, flags, 4) + TEST_FIELD_SIZE (CURSORINFO, hCursor, 4) + TEST_FIELD_ALIGN (CURSORINFO, hCursor, 4) + TEST_FIELD_OFFSET(CURSORINFO, hCursor, 8) + TEST_FIELD_SIZE (CURSORINFO, ptScreenPos, 8) + TEST_FIELD_ALIGN (CURSORINFO, ptScreenPos, 4) + TEST_FIELD_OFFSET(CURSORINFO, ptScreenPos, 12) } static void test_pack_CWPRETSTRUCT(void) { /* CWPRETSTRUCT (pack 4) */ - TEST_TYPE(CWPRETSTRUCT, 20, 4); - TEST_FIELD(CWPRETSTRUCT, LRESULT, lResult, 0, 4, 4); - TEST_FIELD(CWPRETSTRUCT, LPARAM, lParam, 4, 4, 4); - TEST_FIELD(CWPRETSTRUCT, WPARAM, wParam, 8, 4, 4); - TEST_FIELD(CWPRETSTRUCT, DWORD, message, 12, 4, 4); - TEST_FIELD(CWPRETSTRUCT, HWND, hwnd, 16, 4, 4); + TEST_TYPE_SIZE (CWPRETSTRUCT, 20) + TEST_TYPE_ALIGN (CWPRETSTRUCT, 4) + TEST_FIELD_SIZE (CWPRETSTRUCT, lResult, 4) + TEST_FIELD_ALIGN (CWPRETSTRUCT, lResult, 4) + TEST_FIELD_OFFSET(CWPRETSTRUCT, lResult, 0) + TEST_FIELD_SIZE (CWPRETSTRUCT, lParam, 4) + TEST_FIELD_ALIGN (CWPRETSTRUCT, lParam, 4) + TEST_FIELD_OFFSET(CWPRETSTRUCT, lParam, 4) + TEST_FIELD_SIZE (CWPRETSTRUCT, wParam, 4) + TEST_FIELD_ALIGN (CWPRETSTRUCT, wParam, 4) + TEST_FIELD_OFFSET(CWPRETSTRUCT, wParam, 8) + TEST_FIELD_SIZE (CWPRETSTRUCT, message, 4) + TEST_FIELD_ALIGN (CWPRETSTRUCT, message, 4) + TEST_FIELD_OFFSET(CWPRETSTRUCT, message, 12) + TEST_FIELD_SIZE (CWPRETSTRUCT, hwnd, 4) + TEST_FIELD_ALIGN (CWPRETSTRUCT, hwnd, 4) + TEST_FIELD_OFFSET(CWPRETSTRUCT, hwnd, 16) } static void test_pack_CWPSTRUCT(void) { /* CWPSTRUCT (pack 4) */ - TEST_TYPE(CWPSTRUCT, 16, 4); - TEST_FIELD(CWPSTRUCT, LPARAM, lParam, 0, 4, 4); - TEST_FIELD(CWPSTRUCT, WPARAM, wParam, 4, 4, 4); - TEST_FIELD(CWPSTRUCT, UINT, message, 8, 4, 4); - TEST_FIELD(CWPSTRUCT, HWND, hwnd, 12, 4, 4); + TEST_TYPE_SIZE (CWPSTRUCT, 16) + TEST_TYPE_ALIGN (CWPSTRUCT, 4) + TEST_FIELD_SIZE (CWPSTRUCT, lParam, 4) + TEST_FIELD_ALIGN (CWPSTRUCT, lParam, 4) + TEST_FIELD_OFFSET(CWPSTRUCT, lParam, 0) + TEST_FIELD_SIZE (CWPSTRUCT, wParam, 4) + TEST_FIELD_ALIGN (CWPSTRUCT, wParam, 4) + TEST_FIELD_OFFSET(CWPSTRUCT, wParam, 4) + TEST_FIELD_SIZE (CWPSTRUCT, message, 4) + TEST_FIELD_ALIGN (CWPSTRUCT, message, 4) + TEST_FIELD_OFFSET(CWPSTRUCT, message, 8) + TEST_FIELD_SIZE (CWPSTRUCT, hwnd, 4) + TEST_FIELD_ALIGN (CWPSTRUCT, hwnd, 4) + TEST_FIELD_OFFSET(CWPSTRUCT, hwnd, 12) } static void test_pack_DEBUGHOOKINFO(void) { /* DEBUGHOOKINFO (pack 4) */ - TEST_TYPE(DEBUGHOOKINFO, 20, 4); - TEST_FIELD(DEBUGHOOKINFO, DWORD, idThread, 0, 4, 4); - TEST_FIELD(DEBUGHOOKINFO, DWORD, idThreadInstaller, 4, 4, 4); - TEST_FIELD(DEBUGHOOKINFO, LPARAM, lParam, 8, 4, 4); - TEST_FIELD(DEBUGHOOKINFO, WPARAM, wParam, 12, 4, 4); - TEST_FIELD(DEBUGHOOKINFO, INT, code, 16, 4, 4); + TEST_TYPE_SIZE (DEBUGHOOKINFO, 20) + TEST_TYPE_ALIGN (DEBUGHOOKINFO, 4) + TEST_FIELD_SIZE (DEBUGHOOKINFO, idThread, 4) + TEST_FIELD_ALIGN (DEBUGHOOKINFO, idThread, 4) + TEST_FIELD_OFFSET(DEBUGHOOKINFO, idThread, 0) + TEST_FIELD_SIZE (DEBUGHOOKINFO, idThreadInstaller, 4) + TEST_FIELD_ALIGN (DEBUGHOOKINFO, idThreadInstaller, 4) + TEST_FIELD_OFFSET(DEBUGHOOKINFO, idThreadInstaller, 4) + TEST_FIELD_SIZE (DEBUGHOOKINFO, lParam, 4) + TEST_FIELD_ALIGN (DEBUGHOOKINFO, lParam, 4) + TEST_FIELD_OFFSET(DEBUGHOOKINFO, lParam, 8) + TEST_FIELD_SIZE (DEBUGHOOKINFO, wParam, 4) + TEST_FIELD_ALIGN (DEBUGHOOKINFO, wParam, 4) + TEST_FIELD_OFFSET(DEBUGHOOKINFO, wParam, 12) + TEST_FIELD_SIZE (DEBUGHOOKINFO, code, 4) + TEST_FIELD_ALIGN (DEBUGHOOKINFO, code, 4) + TEST_FIELD_OFFSET(DEBUGHOOKINFO, code, 16) } static void test_pack_DELETEITEMSTRUCT(void) { /* DELETEITEMSTRUCT (pack 4) */ - TEST_TYPE(DELETEITEMSTRUCT, 20, 4); - TEST_FIELD(DELETEITEMSTRUCT, UINT, CtlType, 0, 4, 4); - TEST_FIELD(DELETEITEMSTRUCT, UINT, CtlID, 4, 4, 4); - TEST_FIELD(DELETEITEMSTRUCT, UINT, itemID, 8, 4, 4); - TEST_FIELD(DELETEITEMSTRUCT, HWND, hwndItem, 12, 4, 4); - TEST_FIELD(DELETEITEMSTRUCT, ULONG_PTR, itemData, 16, 4, 4); + TEST_TYPE_SIZE (DELETEITEMSTRUCT, 20) + TEST_TYPE_ALIGN (DELETEITEMSTRUCT, 4) + TEST_FIELD_SIZE (DELETEITEMSTRUCT, CtlType, 4) + TEST_FIELD_ALIGN (DELETEITEMSTRUCT, CtlType, 4) + TEST_FIELD_OFFSET(DELETEITEMSTRUCT, CtlType, 0) + TEST_FIELD_SIZE (DELETEITEMSTRUCT, CtlID, 4) + TEST_FIELD_ALIGN (DELETEITEMSTRUCT, CtlID, 4) + TEST_FIELD_OFFSET(DELETEITEMSTRUCT, CtlID, 4) + TEST_FIELD_SIZE (DELETEITEMSTRUCT, itemID, 4) + TEST_FIELD_ALIGN (DELETEITEMSTRUCT, itemID, 4) + TEST_FIELD_OFFSET(DELETEITEMSTRUCT, itemID, 8) + TEST_FIELD_SIZE (DELETEITEMSTRUCT, hwndItem, 4) + TEST_FIELD_ALIGN (DELETEITEMSTRUCT, hwndItem, 4) + TEST_FIELD_OFFSET(DELETEITEMSTRUCT, hwndItem, 12) + TEST_FIELD_SIZE (DELETEITEMSTRUCT, itemData, 4) + TEST_FIELD_ALIGN (DELETEITEMSTRUCT, itemData, 4) + TEST_FIELD_OFFSET(DELETEITEMSTRUCT, itemData, 16) } static void test_pack_DESKTOPENUMPROCA(void) { /* DESKTOPENUMPROCA */ - TEST_TYPE(DESKTOPENUMPROCA, 4, 4); + TEST_TYPE_SIZE (DESKTOPENUMPROCA, 4) + TEST_TYPE_ALIGN (DESKTOPENUMPROCA, 4) } static void test_pack_DESKTOPENUMPROCW(void) { /* DESKTOPENUMPROCW */ - TEST_TYPE(DESKTOPENUMPROCW, 4, 4); + TEST_TYPE_SIZE (DESKTOPENUMPROCW, 4) + TEST_TYPE_ALIGN (DESKTOPENUMPROCW, 4) } static void test_pack_DLGITEMTEMPLATE(void) { /* DLGITEMTEMPLATE (pack 2) */ - TEST_TYPE(DLGITEMTEMPLATE, 18, 2); - TEST_FIELD(DLGITEMTEMPLATE, DWORD, style, 0, 4, 2); - TEST_FIELD(DLGITEMTEMPLATE, DWORD, dwExtendedStyle, 4, 4, 2); - TEST_FIELD(DLGITEMTEMPLATE, short, x, 8, 2, 2); - TEST_FIELD(DLGITEMTEMPLATE, short, y, 10, 2, 2); - TEST_FIELD(DLGITEMTEMPLATE, short, cx, 12, 2, 2); - TEST_FIELD(DLGITEMTEMPLATE, short, cy, 14, 2, 2); - TEST_FIELD(DLGITEMTEMPLATE, WORD, id, 16, 2, 2); + TEST_TYPE_SIZE (DLGITEMTEMPLATE, 18) + TEST_TYPE_ALIGN (DLGITEMTEMPLATE, 2) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, style, 4) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, style, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, style, 0) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, dwExtendedStyle, 4) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, dwExtendedStyle, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, dwExtendedStyle, 4) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, x, 2) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, x, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, x, 8) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, y, 2) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, y, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, y, 10) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, cx, 2) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, cx, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, cx, 12) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, cy, 2) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, cy, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, cy, 14) + TEST_FIELD_SIZE (DLGITEMTEMPLATE, id, 2) + TEST_FIELD_ALIGN (DLGITEMTEMPLATE, id, 2) + TEST_FIELD_OFFSET(DLGITEMTEMPLATE, id, 16) } static void test_pack_DLGPROC(void) { /* DLGPROC */ - TEST_TYPE(DLGPROC, 4, 4); + TEST_TYPE_SIZE (DLGPROC, 4) + TEST_TYPE_ALIGN (DLGPROC, 4) } static void test_pack_DLGTEMPLATE(void) { /* DLGTEMPLATE (pack 2) */ - TEST_TYPE(DLGTEMPLATE, 18, 2); - TEST_FIELD(DLGTEMPLATE, DWORD, style, 0, 4, 2); - TEST_FIELD(DLGTEMPLATE, DWORD, dwExtendedStyle, 4, 4, 2); - TEST_FIELD(DLGTEMPLATE, WORD, cdit, 8, 2, 2); - TEST_FIELD(DLGTEMPLATE, short, x, 10, 2, 2); - TEST_FIELD(DLGTEMPLATE, short, y, 12, 2, 2); - TEST_FIELD(DLGTEMPLATE, short, cx, 14, 2, 2); - TEST_FIELD(DLGTEMPLATE, short, cy, 16, 2, 2); + TEST_TYPE_SIZE (DLGTEMPLATE, 18) + TEST_TYPE_ALIGN (DLGTEMPLATE, 2) + TEST_FIELD_SIZE (DLGTEMPLATE, style, 4) + TEST_FIELD_ALIGN (DLGTEMPLATE, style, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, style, 0) + TEST_FIELD_SIZE (DLGTEMPLATE, dwExtendedStyle, 4) + TEST_FIELD_ALIGN (DLGTEMPLATE, dwExtendedStyle, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, dwExtendedStyle, 4) + TEST_FIELD_SIZE (DLGTEMPLATE, cdit, 2) + TEST_FIELD_ALIGN (DLGTEMPLATE, cdit, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, cdit, 8) + TEST_FIELD_SIZE (DLGTEMPLATE, x, 2) + TEST_FIELD_ALIGN (DLGTEMPLATE, x, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, x, 10) + TEST_FIELD_SIZE (DLGTEMPLATE, y, 2) + TEST_FIELD_ALIGN (DLGTEMPLATE, y, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, y, 12) + TEST_FIELD_SIZE (DLGTEMPLATE, cx, 2) + TEST_FIELD_ALIGN (DLGTEMPLATE, cx, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, cx, 14) + TEST_FIELD_SIZE (DLGTEMPLATE, cy, 2) + TEST_FIELD_ALIGN (DLGTEMPLATE, cy, 2) + TEST_FIELD_OFFSET(DLGTEMPLATE, cy, 16) } static void test_pack_DRAWITEMSTRUCT(void) { /* DRAWITEMSTRUCT (pack 4) */ - TEST_TYPE(DRAWITEMSTRUCT, 48, 4); - TEST_FIELD(DRAWITEMSTRUCT, UINT, CtlType, 0, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, UINT, CtlID, 4, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, UINT, itemID, 8, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, UINT, itemAction, 12, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, UINT, itemState, 16, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, HWND, hwndItem, 20, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, HDC, hDC, 24, 4, 4); - TEST_FIELD(DRAWITEMSTRUCT, RECT, rcItem, 28, 16, 4); - TEST_FIELD(DRAWITEMSTRUCT, ULONG_PTR, itemData, 44, 4, 4); + TEST_TYPE_SIZE (DRAWITEMSTRUCT, 48) + TEST_TYPE_ALIGN (DRAWITEMSTRUCT, 4) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, CtlType, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, CtlType, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, CtlType, 0) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, CtlID, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, CtlID, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, CtlID, 4) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, itemID, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, itemID, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, itemID, 8) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, itemAction, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, itemAction, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, itemAction, 12) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, itemState, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, itemState, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, itemState, 16) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, hwndItem, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, hwndItem, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, hwndItem, 20) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, hDC, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, hDC, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, hDC, 24) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, rcItem, 16) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, rcItem, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, rcItem, 28) + TEST_FIELD_SIZE (DRAWITEMSTRUCT, itemData, 4) + TEST_FIELD_ALIGN (DRAWITEMSTRUCT, itemData, 4) + TEST_FIELD_OFFSET(DRAWITEMSTRUCT, itemData, 44) } static void test_pack_DRAWSTATEPROC(void) { /* DRAWSTATEPROC */ - TEST_TYPE(DRAWSTATEPROC, 4, 4); + TEST_TYPE_SIZE (DRAWSTATEPROC, 4) + TEST_TYPE_ALIGN (DRAWSTATEPROC, 4) } static void test_pack_DRAWTEXTPARAMS(void) { /* DRAWTEXTPARAMS (pack 4) */ - TEST_TYPE(DRAWTEXTPARAMS, 20, 4); - TEST_FIELD(DRAWTEXTPARAMS, UINT, cbSize, 0, 4, 4); - TEST_FIELD(DRAWTEXTPARAMS, INT, iTabLength, 4, 4, 4); - TEST_FIELD(DRAWTEXTPARAMS, INT, iLeftMargin, 8, 4, 4); - TEST_FIELD(DRAWTEXTPARAMS, INT, iRightMargin, 12, 4, 4); - TEST_FIELD(DRAWTEXTPARAMS, UINT, uiLengthDrawn, 16, 4, 4); + TEST_TYPE_SIZE (DRAWTEXTPARAMS, 20) + TEST_TYPE_ALIGN (DRAWTEXTPARAMS, 4) + TEST_FIELD_SIZE (DRAWTEXTPARAMS, cbSize, 4) + TEST_FIELD_ALIGN (DRAWTEXTPARAMS, cbSize, 4) + TEST_FIELD_OFFSET(DRAWTEXTPARAMS, cbSize, 0) + TEST_FIELD_SIZE (DRAWTEXTPARAMS, iTabLength, 4) + TEST_FIELD_ALIGN (DRAWTEXTPARAMS, iTabLength, 4) + TEST_FIELD_OFFSET(DRAWTEXTPARAMS, iTabLength, 4) + TEST_FIELD_SIZE (DRAWTEXTPARAMS, iLeftMargin, 4) + TEST_FIELD_ALIGN (DRAWTEXTPARAMS, iLeftMargin, 4) + TEST_FIELD_OFFSET(DRAWTEXTPARAMS, iLeftMargin, 8) + TEST_FIELD_SIZE (DRAWTEXTPARAMS, iRightMargin, 4) + TEST_FIELD_ALIGN (DRAWTEXTPARAMS, iRightMargin, 4) + TEST_FIELD_OFFSET(DRAWTEXTPARAMS, iRightMargin, 12) + TEST_FIELD_SIZE (DRAWTEXTPARAMS, uiLengthDrawn, 4) + TEST_FIELD_ALIGN (DRAWTEXTPARAMS, uiLengthDrawn, 4) + TEST_FIELD_OFFSET(DRAWTEXTPARAMS, uiLengthDrawn, 16) } static void test_pack_EDITWORDBREAKPROCA(void) { /* EDITWORDBREAKPROCA */ - TEST_TYPE(EDITWORDBREAKPROCA, 4, 4); + TEST_TYPE_SIZE (EDITWORDBREAKPROCA, 4) + TEST_TYPE_ALIGN (EDITWORDBREAKPROCA, 4) } static void test_pack_EDITWORDBREAKPROCW(void) { /* EDITWORDBREAKPROCW */ - TEST_TYPE(EDITWORDBREAKPROCW, 4, 4); + TEST_TYPE_SIZE (EDITWORDBREAKPROCW, 4) + TEST_TYPE_ALIGN (EDITWORDBREAKPROCW, 4) } static void test_pack_EVENTMSG(void) { /* EVENTMSG (pack 4) */ - TEST_TYPE(EVENTMSG, 20, 4); - TEST_FIELD(EVENTMSG, UINT, message, 0, 4, 4); - TEST_FIELD(EVENTMSG, UINT, paramL, 4, 4, 4); - TEST_FIELD(EVENTMSG, UINT, paramH, 8, 4, 4); - TEST_FIELD(EVENTMSG, DWORD, time, 12, 4, 4); - TEST_FIELD(EVENTMSG, HWND, hwnd, 16, 4, 4); + TEST_TYPE_SIZE (EVENTMSG, 20) + TEST_TYPE_ALIGN (EVENTMSG, 4) + TEST_FIELD_SIZE (EVENTMSG, message, 4) + TEST_FIELD_ALIGN (EVENTMSG, message, 4) + TEST_FIELD_OFFSET(EVENTMSG, message, 0) + TEST_FIELD_SIZE (EVENTMSG, paramL, 4) + TEST_FIELD_ALIGN (EVENTMSG, paramL, 4) + TEST_FIELD_OFFSET(EVENTMSG, paramL, 4) + TEST_FIELD_SIZE (EVENTMSG, paramH, 4) + TEST_FIELD_ALIGN (EVENTMSG, paramH, 4) + TEST_FIELD_OFFSET(EVENTMSG, paramH, 8) + TEST_FIELD_SIZE (EVENTMSG, time, 4) + TEST_FIELD_ALIGN (EVENTMSG, time, 4) + TEST_FIELD_OFFSET(EVENTMSG, time, 12) + TEST_FIELD_SIZE (EVENTMSG, hwnd, 4) + TEST_FIELD_ALIGN (EVENTMSG, hwnd, 4) + TEST_FIELD_OFFSET(EVENTMSG, hwnd, 16) } static void test_pack_FILTERKEYS(void) { /* FILTERKEYS (pack 4) */ - TEST_TYPE(FILTERKEYS, 24, 4); - TEST_FIELD(FILTERKEYS, UINT, cbSize, 0, 4, 4); - TEST_FIELD(FILTERKEYS, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(FILTERKEYS, DWORD, iWaitMSec, 8, 4, 4); - TEST_FIELD(FILTERKEYS, DWORD, iDelayMSec, 12, 4, 4); - TEST_FIELD(FILTERKEYS, DWORD, iRepeatMSec, 16, 4, 4); - TEST_FIELD(FILTERKEYS, DWORD, iBounceMSec, 20, 4, 4); + TEST_TYPE_SIZE (FILTERKEYS, 24) + TEST_TYPE_ALIGN (FILTERKEYS, 4) + TEST_FIELD_SIZE (FILTERKEYS, cbSize, 4) + TEST_FIELD_ALIGN (FILTERKEYS, cbSize, 4) + TEST_FIELD_OFFSET(FILTERKEYS, cbSize, 0) + TEST_FIELD_SIZE (FILTERKEYS, dwFlags, 4) + TEST_FIELD_ALIGN (FILTERKEYS, dwFlags, 4) + TEST_FIELD_OFFSET(FILTERKEYS, dwFlags, 4) + TEST_FIELD_SIZE (FILTERKEYS, iWaitMSec, 4) + TEST_FIELD_ALIGN (FILTERKEYS, iWaitMSec, 4) + TEST_FIELD_OFFSET(FILTERKEYS, iWaitMSec, 8) + TEST_FIELD_SIZE (FILTERKEYS, iDelayMSec, 4) + TEST_FIELD_ALIGN (FILTERKEYS, iDelayMSec, 4) + TEST_FIELD_OFFSET(FILTERKEYS, iDelayMSec, 12) + TEST_FIELD_SIZE (FILTERKEYS, iRepeatMSec, 4) + TEST_FIELD_ALIGN (FILTERKEYS, iRepeatMSec, 4) + TEST_FIELD_OFFSET(FILTERKEYS, iRepeatMSec, 16) + TEST_FIELD_SIZE (FILTERKEYS, iBounceMSec, 4) + TEST_FIELD_ALIGN (FILTERKEYS, iBounceMSec, 4) + TEST_FIELD_OFFSET(FILTERKEYS, iBounceMSec, 20) } static void test_pack_FLASHWINFO(void) { /* FLASHWINFO (pack 4) */ - TEST_TYPE(FLASHWINFO, 20, 4); - TEST_FIELD(FLASHWINFO, UINT, cbSize, 0, 4, 4); - TEST_FIELD(FLASHWINFO, HWND, hwnd, 4, 4, 4); - TEST_FIELD(FLASHWINFO, DWORD, dwFlags, 8, 4, 4); - TEST_FIELD(FLASHWINFO, UINT, uCount, 12, 4, 4); - TEST_FIELD(FLASHWINFO, DWORD, dwTimeout, 16, 4, 4); + TEST_TYPE_SIZE (FLASHWINFO, 20) + TEST_TYPE_ALIGN (FLASHWINFO, 4) + TEST_FIELD_SIZE (FLASHWINFO, cbSize, 4) + TEST_FIELD_ALIGN (FLASHWINFO, cbSize, 4) + TEST_FIELD_OFFSET(FLASHWINFO, cbSize, 0) + TEST_FIELD_SIZE (FLASHWINFO, hwnd, 4) + TEST_FIELD_ALIGN (FLASHWINFO, hwnd, 4) + TEST_FIELD_OFFSET(FLASHWINFO, hwnd, 4) + TEST_FIELD_SIZE (FLASHWINFO, dwFlags, 4) + TEST_FIELD_ALIGN (FLASHWINFO, dwFlags, 4) + TEST_FIELD_OFFSET(FLASHWINFO, dwFlags, 8) + TEST_FIELD_SIZE (FLASHWINFO, uCount, 4) + TEST_FIELD_ALIGN (FLASHWINFO, uCount, 4) + TEST_FIELD_OFFSET(FLASHWINFO, uCount, 12) + TEST_FIELD_SIZE (FLASHWINFO, dwTimeout, 4) + TEST_FIELD_ALIGN (FLASHWINFO, dwTimeout, 4) + TEST_FIELD_OFFSET(FLASHWINFO, dwTimeout, 16) } static void test_pack_GRAYSTRINGPROC(void) { /* GRAYSTRINGPROC */ - TEST_TYPE(GRAYSTRINGPROC, 4, 4); + TEST_TYPE_SIZE (GRAYSTRINGPROC, 4) + TEST_TYPE_ALIGN (GRAYSTRINGPROC, 4) } static void test_pack_GUITHREADINFO(void) { /* GUITHREADINFO (pack 4) */ - TEST_TYPE(GUITHREADINFO, 48, 4); - TEST_FIELD(GUITHREADINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(GUITHREADINFO, DWORD, flags, 4, 4, 4); - TEST_FIELD(GUITHREADINFO, HWND, hwndActive, 8, 4, 4); - TEST_FIELD(GUITHREADINFO, HWND, hwndFocus, 12, 4, 4); - TEST_FIELD(GUITHREADINFO, HWND, hwndCapture, 16, 4, 4); - TEST_FIELD(GUITHREADINFO, HWND, hwndMenuOwner, 20, 4, 4); - TEST_FIELD(GUITHREADINFO, HWND, hwndMoveSize, 24, 4, 4); - TEST_FIELD(GUITHREADINFO, HWND, hwndCaret, 28, 4, 4); - TEST_FIELD(GUITHREADINFO, RECT, rcCaret, 32, 16, 4); + TEST_TYPE_SIZE (GUITHREADINFO, 48) + TEST_TYPE_ALIGN (GUITHREADINFO, 4) + TEST_FIELD_SIZE (GUITHREADINFO, cbSize, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, cbSize, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, cbSize, 0) + TEST_FIELD_SIZE (GUITHREADINFO, flags, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, flags, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, flags, 4) + TEST_FIELD_SIZE (GUITHREADINFO, hwndActive, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, hwndActive, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, hwndActive, 8) + TEST_FIELD_SIZE (GUITHREADINFO, hwndFocus, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, hwndFocus, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, hwndFocus, 12) + TEST_FIELD_SIZE (GUITHREADINFO, hwndCapture, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, hwndCapture, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, hwndCapture, 16) + TEST_FIELD_SIZE (GUITHREADINFO, hwndMenuOwner, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, hwndMenuOwner, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, hwndMenuOwner, 20) + TEST_FIELD_SIZE (GUITHREADINFO, hwndMoveSize, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, hwndMoveSize, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, hwndMoveSize, 24) + TEST_FIELD_SIZE (GUITHREADINFO, hwndCaret, 4) + TEST_FIELD_ALIGN (GUITHREADINFO, hwndCaret, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, hwndCaret, 28) + TEST_FIELD_SIZE (GUITHREADINFO, rcCaret, 16) + TEST_FIELD_ALIGN (GUITHREADINFO, rcCaret, 4) + TEST_FIELD_OFFSET(GUITHREADINFO, rcCaret, 32) } static void test_pack_HARDWAREHOOKSTRUCT(void) { /* HARDWAREHOOKSTRUCT (pack 4) */ - TEST_TYPE(HARDWAREHOOKSTRUCT, 16, 4); - TEST_FIELD(HARDWAREHOOKSTRUCT, HWND, hwnd, 0, 4, 4); - TEST_FIELD(HARDWAREHOOKSTRUCT, UINT, message, 4, 4, 4); - TEST_FIELD(HARDWAREHOOKSTRUCT, WPARAM, wParam, 8, 4, 4); - TEST_FIELD(HARDWAREHOOKSTRUCT, LPARAM, lParam, 12, 4, 4); + TEST_TYPE_SIZE (HARDWAREHOOKSTRUCT, 16) + TEST_TYPE_ALIGN (HARDWAREHOOKSTRUCT, 4) + TEST_FIELD_SIZE (HARDWAREHOOKSTRUCT, hwnd, 4) + TEST_FIELD_ALIGN (HARDWAREHOOKSTRUCT, hwnd, 4) + TEST_FIELD_OFFSET(HARDWAREHOOKSTRUCT, hwnd, 0) + TEST_FIELD_SIZE (HARDWAREHOOKSTRUCT, message, 4) + TEST_FIELD_ALIGN (HARDWAREHOOKSTRUCT, message, 4) + TEST_FIELD_OFFSET(HARDWAREHOOKSTRUCT, message, 4) + TEST_FIELD_SIZE (HARDWAREHOOKSTRUCT, wParam, 4) + TEST_FIELD_ALIGN (HARDWAREHOOKSTRUCT, wParam, 4) + TEST_FIELD_OFFSET(HARDWAREHOOKSTRUCT, wParam, 8) + TEST_FIELD_SIZE (HARDWAREHOOKSTRUCT, lParam, 4) + TEST_FIELD_ALIGN (HARDWAREHOOKSTRUCT, lParam, 4) + TEST_FIELD_OFFSET(HARDWAREHOOKSTRUCT, lParam, 12) } static void test_pack_HARDWAREINPUT(void) { /* HARDWAREINPUT (pack 4) */ - TEST_TYPE(HARDWAREINPUT, 8, 4); - TEST_FIELD(HARDWAREINPUT, DWORD, uMsg, 0, 4, 4); - TEST_FIELD(HARDWAREINPUT, WORD, wParamL, 4, 2, 2); - TEST_FIELD(HARDWAREINPUT, WORD, wParamH, 6, 2, 2); + TEST_TYPE_SIZE (HARDWAREINPUT, 8) + TEST_TYPE_ALIGN (HARDWAREINPUT, 4) + TEST_FIELD_SIZE (HARDWAREINPUT, uMsg, 4) + TEST_FIELD_ALIGN (HARDWAREINPUT, uMsg, 4) + TEST_FIELD_OFFSET(HARDWAREINPUT, uMsg, 0) + TEST_FIELD_SIZE (HARDWAREINPUT, wParamL, 2) + TEST_FIELD_ALIGN (HARDWAREINPUT, wParamL, 2) + TEST_FIELD_OFFSET(HARDWAREINPUT, wParamL, 4) + TEST_FIELD_SIZE (HARDWAREINPUT, wParamH, 2) + TEST_FIELD_ALIGN (HARDWAREINPUT, wParamH, 2) + TEST_FIELD_OFFSET(HARDWAREINPUT, wParamH, 6) } static void test_pack_HDEVNOTIFY(void) { /* HDEVNOTIFY */ - TEST_TYPE(HDEVNOTIFY, 4, 4); + TEST_TYPE_SIZE (HDEVNOTIFY, 4) + TEST_TYPE_ALIGN (HDEVNOTIFY, 4) } static void test_pack_HDWP(void) { /* HDWP */ - TEST_TYPE(HDWP, 4, 4); + TEST_TYPE_SIZE (HDWP, 4) + TEST_TYPE_ALIGN (HDWP, 4) } static void test_pack_HELPINFO(void) { /* HELPINFO (pack 4) */ - TEST_TYPE(HELPINFO, 28, 4); - TEST_FIELD(HELPINFO, UINT, cbSize, 0, 4, 4); - TEST_FIELD(HELPINFO, INT, iContextType, 4, 4, 4); - TEST_FIELD(HELPINFO, INT, iCtrlId, 8, 4, 4); - TEST_FIELD(HELPINFO, HANDLE, hItemHandle, 12, 4, 4); - TEST_FIELD(HELPINFO, DWORD_PTR, dwContextId, 16, 4, 4); - TEST_FIELD(HELPINFO, POINT, MousePos, 20, 8, 4); + TEST_TYPE_SIZE (HELPINFO, 28) + TEST_TYPE_ALIGN (HELPINFO, 4) + TEST_FIELD_SIZE (HELPINFO, cbSize, 4) + TEST_FIELD_ALIGN (HELPINFO, cbSize, 4) + TEST_FIELD_OFFSET(HELPINFO, cbSize, 0) + TEST_FIELD_SIZE (HELPINFO, iContextType, 4) + TEST_FIELD_ALIGN (HELPINFO, iContextType, 4) + TEST_FIELD_OFFSET(HELPINFO, iContextType, 4) + TEST_FIELD_SIZE (HELPINFO, iCtrlId, 4) + TEST_FIELD_ALIGN (HELPINFO, iCtrlId, 4) + TEST_FIELD_OFFSET(HELPINFO, iCtrlId, 8) + TEST_FIELD_SIZE (HELPINFO, hItemHandle, 4) + TEST_FIELD_ALIGN (HELPINFO, hItemHandle, 4) + TEST_FIELD_OFFSET(HELPINFO, hItemHandle, 12) + TEST_FIELD_SIZE (HELPINFO, dwContextId, 4) + TEST_FIELD_ALIGN (HELPINFO, dwContextId, 4) + TEST_FIELD_OFFSET(HELPINFO, dwContextId, 16) + TEST_FIELD_SIZE (HELPINFO, MousePos, 8) + TEST_FIELD_ALIGN (HELPINFO, MousePos, 4) + TEST_FIELD_OFFSET(HELPINFO, MousePos, 20) } static void test_pack_HELPWININFOA(void) { /* HELPWININFOA (pack 4) */ - TEST_TYPE(HELPWININFOA, 28, 4); - TEST_FIELD(HELPWININFOA, int, wStructSize, 0, 4, 4); - TEST_FIELD(HELPWININFOA, int, x, 4, 4, 4); - TEST_FIELD(HELPWININFOA, int, y, 8, 4, 4); - TEST_FIELD(HELPWININFOA, int, dx, 12, 4, 4); - TEST_FIELD(HELPWININFOA, int, dy, 16, 4, 4); - TEST_FIELD(HELPWININFOA, int, wMax, 20, 4, 4); - TEST_FIELD(HELPWININFOA, CHAR[2], rgchMember, 24, 2, 1); + TEST_TYPE_SIZE (HELPWININFOA, 28) + TEST_TYPE_ALIGN (HELPWININFOA, 4) + TEST_FIELD_SIZE (HELPWININFOA, wStructSize, 4) + TEST_FIELD_ALIGN (HELPWININFOA, wStructSize, 4) + TEST_FIELD_OFFSET(HELPWININFOA, wStructSize, 0) + TEST_FIELD_SIZE (HELPWININFOA, x, 4) + TEST_FIELD_ALIGN (HELPWININFOA, x, 4) + TEST_FIELD_OFFSET(HELPWININFOA, x, 4) + TEST_FIELD_SIZE (HELPWININFOA, y, 4) + TEST_FIELD_ALIGN (HELPWININFOA, y, 4) + TEST_FIELD_OFFSET(HELPWININFOA, y, 8) + TEST_FIELD_SIZE (HELPWININFOA, dx, 4) + TEST_FIELD_ALIGN (HELPWININFOA, dx, 4) + TEST_FIELD_OFFSET(HELPWININFOA, dx, 12) + TEST_FIELD_SIZE (HELPWININFOA, dy, 4) + TEST_FIELD_ALIGN (HELPWININFOA, dy, 4) + TEST_FIELD_OFFSET(HELPWININFOA, dy, 16) + TEST_FIELD_SIZE (HELPWININFOA, wMax, 4) + TEST_FIELD_ALIGN (HELPWININFOA, wMax, 4) + TEST_FIELD_OFFSET(HELPWININFOA, wMax, 20) + TEST_FIELD_SIZE (HELPWININFOA, rgchMember, 2) + TEST_FIELD_ALIGN (HELPWININFOA, rgchMember, 1) + TEST_FIELD_OFFSET(HELPWININFOA, rgchMember, 24) } static void test_pack_HELPWININFOW(void) { /* HELPWININFOW (pack 4) */ - TEST_TYPE(HELPWININFOW, 28, 4); - TEST_FIELD(HELPWININFOW, int, wStructSize, 0, 4, 4); - TEST_FIELD(HELPWININFOW, int, x, 4, 4, 4); - TEST_FIELD(HELPWININFOW, int, y, 8, 4, 4); - TEST_FIELD(HELPWININFOW, int, dx, 12, 4, 4); - TEST_FIELD(HELPWININFOW, int, dy, 16, 4, 4); - TEST_FIELD(HELPWININFOW, int, wMax, 20, 4, 4); - TEST_FIELD(HELPWININFOW, WCHAR[2], rgchMember, 24, 4, 2); + TEST_TYPE_SIZE (HELPWININFOW, 28) + TEST_TYPE_ALIGN (HELPWININFOW, 4) + TEST_FIELD_SIZE (HELPWININFOW, wStructSize, 4) + TEST_FIELD_ALIGN (HELPWININFOW, wStructSize, 4) + TEST_FIELD_OFFSET(HELPWININFOW, wStructSize, 0) + TEST_FIELD_SIZE (HELPWININFOW, x, 4) + TEST_FIELD_ALIGN (HELPWININFOW, x, 4) + TEST_FIELD_OFFSET(HELPWININFOW, x, 4) + TEST_FIELD_SIZE (HELPWININFOW, y, 4) + TEST_FIELD_ALIGN (HELPWININFOW, y, 4) + TEST_FIELD_OFFSET(HELPWININFOW, y, 8) + TEST_FIELD_SIZE (HELPWININFOW, dx, 4) + TEST_FIELD_ALIGN (HELPWININFOW, dx, 4) + TEST_FIELD_OFFSET(HELPWININFOW, dx, 12) + TEST_FIELD_SIZE (HELPWININFOW, dy, 4) + TEST_FIELD_ALIGN (HELPWININFOW, dy, 4) + TEST_FIELD_OFFSET(HELPWININFOW, dy, 16) + TEST_FIELD_SIZE (HELPWININFOW, wMax, 4) + TEST_FIELD_ALIGN (HELPWININFOW, wMax, 4) + TEST_FIELD_OFFSET(HELPWININFOW, wMax, 20) + TEST_FIELD_SIZE (HELPWININFOW, rgchMember, 4) + TEST_FIELD_ALIGN (HELPWININFOW, rgchMember, 2) + TEST_FIELD_OFFSET(HELPWININFOW, rgchMember, 24) } static void test_pack_HIGHCONTRASTA(void) { /* HIGHCONTRASTA (pack 4) */ - TEST_TYPE(HIGHCONTRASTA, 12, 4); - TEST_FIELD(HIGHCONTRASTA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(HIGHCONTRASTA, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(HIGHCONTRASTA, LPSTR, lpszDefaultScheme, 8, 4, 4); + TEST_TYPE_SIZE (HIGHCONTRASTA, 12) + TEST_TYPE_ALIGN (HIGHCONTRASTA, 4) + TEST_FIELD_SIZE (HIGHCONTRASTA, cbSize, 4) + TEST_FIELD_ALIGN (HIGHCONTRASTA, cbSize, 4) + TEST_FIELD_OFFSET(HIGHCONTRASTA, cbSize, 0) + TEST_FIELD_SIZE (HIGHCONTRASTA, dwFlags, 4) + TEST_FIELD_ALIGN (HIGHCONTRASTA, dwFlags, 4) + TEST_FIELD_OFFSET(HIGHCONTRASTA, dwFlags, 4) + TEST_FIELD_SIZE (HIGHCONTRASTA, lpszDefaultScheme, 4) + TEST_FIELD_ALIGN (HIGHCONTRASTA, lpszDefaultScheme, 4) + TEST_FIELD_OFFSET(HIGHCONTRASTA, lpszDefaultScheme, 8) } static void test_pack_HIGHCONTRASTW(void) { /* HIGHCONTRASTW (pack 4) */ - TEST_TYPE(HIGHCONTRASTW, 12, 4); - TEST_FIELD(HIGHCONTRASTW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(HIGHCONTRASTW, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(HIGHCONTRASTW, LPWSTR, lpszDefaultScheme, 8, 4, 4); + TEST_TYPE_SIZE (HIGHCONTRASTW, 12) + TEST_TYPE_ALIGN (HIGHCONTRASTW, 4) + TEST_FIELD_SIZE (HIGHCONTRASTW, cbSize, 4) + TEST_FIELD_ALIGN (HIGHCONTRASTW, cbSize, 4) + TEST_FIELD_OFFSET(HIGHCONTRASTW, cbSize, 0) + TEST_FIELD_SIZE (HIGHCONTRASTW, dwFlags, 4) + TEST_FIELD_ALIGN (HIGHCONTRASTW, dwFlags, 4) + TEST_FIELD_OFFSET(HIGHCONTRASTW, dwFlags, 4) + TEST_FIELD_SIZE (HIGHCONTRASTW, lpszDefaultScheme, 4) + TEST_FIELD_ALIGN (HIGHCONTRASTW, lpszDefaultScheme, 4) + TEST_FIELD_OFFSET(HIGHCONTRASTW, lpszDefaultScheme, 8) } static void test_pack_HOOKPROC(void) { /* HOOKPROC */ - TEST_TYPE(HOOKPROC, 4, 4); + TEST_TYPE_SIZE (HOOKPROC, 4) + TEST_TYPE_ALIGN (HOOKPROC, 4) } static void test_pack_ICONINFO(void) { /* ICONINFO (pack 4) */ - TEST_TYPE(ICONINFO, 20, 4); - TEST_FIELD(ICONINFO, BOOL, fIcon, 0, 4, 4); - TEST_FIELD(ICONINFO, DWORD, xHotspot, 4, 4, 4); - TEST_FIELD(ICONINFO, DWORD, yHotspot, 8, 4, 4); - TEST_FIELD(ICONINFO, HBITMAP, hbmMask, 12, 4, 4); - TEST_FIELD(ICONINFO, HBITMAP, hbmColor, 16, 4, 4); + TEST_TYPE_SIZE (ICONINFO, 20) + TEST_TYPE_ALIGN (ICONINFO, 4) + TEST_FIELD_SIZE (ICONINFO, fIcon, 4) + TEST_FIELD_ALIGN (ICONINFO, fIcon, 4) + TEST_FIELD_OFFSET(ICONINFO, fIcon, 0) + TEST_FIELD_SIZE (ICONINFO, xHotspot, 4) + TEST_FIELD_ALIGN (ICONINFO, xHotspot, 4) + TEST_FIELD_OFFSET(ICONINFO, xHotspot, 4) + TEST_FIELD_SIZE (ICONINFO, yHotspot, 4) + TEST_FIELD_ALIGN (ICONINFO, yHotspot, 4) + TEST_FIELD_OFFSET(ICONINFO, yHotspot, 8) + TEST_FIELD_SIZE (ICONINFO, hbmMask, 4) + TEST_FIELD_ALIGN (ICONINFO, hbmMask, 4) + TEST_FIELD_OFFSET(ICONINFO, hbmMask, 12) + TEST_FIELD_SIZE (ICONINFO, hbmColor, 4) + TEST_FIELD_ALIGN (ICONINFO, hbmColor, 4) + TEST_FIELD_OFFSET(ICONINFO, hbmColor, 16) } static void test_pack_ICONMETRICSA(void) { /* ICONMETRICSA (pack 4) */ - TEST_TYPE(ICONMETRICSA, 76, 4); - TEST_FIELD(ICONMETRICSA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(ICONMETRICSA, int, iHorzSpacing, 4, 4, 4); - TEST_FIELD(ICONMETRICSA, int, iVertSpacing, 8, 4, 4); - TEST_FIELD(ICONMETRICSA, int, iTitleWrap, 12, 4, 4); - TEST_FIELD(ICONMETRICSA, LOGFONTA, lfFont, 16, 60, 4); + TEST_TYPE_SIZE (ICONMETRICSA, 76) + TEST_TYPE_ALIGN (ICONMETRICSA, 4) + TEST_FIELD_SIZE (ICONMETRICSA, cbSize, 4) + TEST_FIELD_ALIGN (ICONMETRICSA, cbSize, 4) + TEST_FIELD_OFFSET(ICONMETRICSA, cbSize, 0) + TEST_FIELD_SIZE (ICONMETRICSA, iHorzSpacing, 4) + TEST_FIELD_ALIGN (ICONMETRICSA, iHorzSpacing, 4) + TEST_FIELD_OFFSET(ICONMETRICSA, iHorzSpacing, 4) + TEST_FIELD_SIZE (ICONMETRICSA, iVertSpacing, 4) + TEST_FIELD_ALIGN (ICONMETRICSA, iVertSpacing, 4) + TEST_FIELD_OFFSET(ICONMETRICSA, iVertSpacing, 8) + TEST_FIELD_SIZE (ICONMETRICSA, iTitleWrap, 4) + TEST_FIELD_ALIGN (ICONMETRICSA, iTitleWrap, 4) + TEST_FIELD_OFFSET(ICONMETRICSA, iTitleWrap, 12) + TEST_FIELD_SIZE (ICONMETRICSA, lfFont, 60) + TEST_FIELD_ALIGN (ICONMETRICSA, lfFont, 4) + TEST_FIELD_OFFSET(ICONMETRICSA, lfFont, 16) } static void test_pack_ICONMETRICSW(void) { /* ICONMETRICSW (pack 4) */ - TEST_TYPE(ICONMETRICSW, 108, 4); - TEST_FIELD(ICONMETRICSW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(ICONMETRICSW, int, iHorzSpacing, 4, 4, 4); - TEST_FIELD(ICONMETRICSW, int, iVertSpacing, 8, 4, 4); - TEST_FIELD(ICONMETRICSW, int, iTitleWrap, 12, 4, 4); - TEST_FIELD(ICONMETRICSW, LOGFONTW, lfFont, 16, 92, 4); + TEST_TYPE_SIZE (ICONMETRICSW, 108) + TEST_TYPE_ALIGN (ICONMETRICSW, 4) + TEST_FIELD_SIZE (ICONMETRICSW, cbSize, 4) + TEST_FIELD_ALIGN (ICONMETRICSW, cbSize, 4) + TEST_FIELD_OFFSET(ICONMETRICSW, cbSize, 0) + TEST_FIELD_SIZE (ICONMETRICSW, iHorzSpacing, 4) + TEST_FIELD_ALIGN (ICONMETRICSW, iHorzSpacing, 4) + TEST_FIELD_OFFSET(ICONMETRICSW, iHorzSpacing, 4) + TEST_FIELD_SIZE (ICONMETRICSW, iVertSpacing, 4) + TEST_FIELD_ALIGN (ICONMETRICSW, iVertSpacing, 4) + TEST_FIELD_OFFSET(ICONMETRICSW, iVertSpacing, 8) + TEST_FIELD_SIZE (ICONMETRICSW, iTitleWrap, 4) + TEST_FIELD_ALIGN (ICONMETRICSW, iTitleWrap, 4) + TEST_FIELD_OFFSET(ICONMETRICSW, iTitleWrap, 12) + TEST_FIELD_SIZE (ICONMETRICSW, lfFont, 92) + TEST_FIELD_ALIGN (ICONMETRICSW, lfFont, 4) + TEST_FIELD_OFFSET(ICONMETRICSW, lfFont, 16) } static void test_pack_INPUT(void) { /* INPUT (pack 4) */ - TEST_FIELD(INPUT, DWORD, type, 0, 4, 4); + TEST_FIELD_SIZE (INPUT, type, 4) + TEST_FIELD_ALIGN (INPUT, type, 4) + TEST_FIELD_OFFSET(INPUT, type, 0) } static void test_pack_KBDLLHOOKSTRUCT(void) { /* KBDLLHOOKSTRUCT (pack 4) */ - TEST_TYPE(KBDLLHOOKSTRUCT, 20, 4); - TEST_FIELD(KBDLLHOOKSTRUCT, DWORD, vkCode, 0, 4, 4); - TEST_FIELD(KBDLLHOOKSTRUCT, DWORD, scanCode, 4, 4, 4); - TEST_FIELD(KBDLLHOOKSTRUCT, DWORD, flags, 8, 4, 4); - TEST_FIELD(KBDLLHOOKSTRUCT, DWORD, time, 12, 4, 4); - TEST_FIELD(KBDLLHOOKSTRUCT, ULONG_PTR, dwExtraInfo, 16, 4, 4); + TEST_TYPE_SIZE (KBDLLHOOKSTRUCT, 20) + TEST_TYPE_ALIGN (KBDLLHOOKSTRUCT, 4) + TEST_FIELD_SIZE (KBDLLHOOKSTRUCT, vkCode, 4) + TEST_FIELD_ALIGN (KBDLLHOOKSTRUCT, vkCode, 4) + TEST_FIELD_OFFSET(KBDLLHOOKSTRUCT, vkCode, 0) + TEST_FIELD_SIZE (KBDLLHOOKSTRUCT, scanCode, 4) + TEST_FIELD_ALIGN (KBDLLHOOKSTRUCT, scanCode, 4) + TEST_FIELD_OFFSET(KBDLLHOOKSTRUCT, scanCode, 4) + TEST_FIELD_SIZE (KBDLLHOOKSTRUCT, flags, 4) + TEST_FIELD_ALIGN (KBDLLHOOKSTRUCT, flags, 4) + TEST_FIELD_OFFSET(KBDLLHOOKSTRUCT, flags, 8) + TEST_FIELD_SIZE (KBDLLHOOKSTRUCT, time, 4) + TEST_FIELD_ALIGN (KBDLLHOOKSTRUCT, time, 4) + TEST_FIELD_OFFSET(KBDLLHOOKSTRUCT, time, 12) + TEST_FIELD_SIZE (KBDLLHOOKSTRUCT, dwExtraInfo, 4) + TEST_FIELD_ALIGN (KBDLLHOOKSTRUCT, dwExtraInfo, 4) + TEST_FIELD_OFFSET(KBDLLHOOKSTRUCT, dwExtraInfo, 16) } static void test_pack_KEYBDINPUT(void) { /* KEYBDINPUT (pack 4) */ - TEST_TYPE(KEYBDINPUT, 16, 4); - TEST_FIELD(KEYBDINPUT, WORD, wVk, 0, 2, 2); - TEST_FIELD(KEYBDINPUT, WORD, wScan, 2, 2, 2); - TEST_FIELD(KEYBDINPUT, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(KEYBDINPUT, DWORD, time, 8, 4, 4); - TEST_FIELD(KEYBDINPUT, ULONG_PTR, dwExtraInfo, 12, 4, 4); + TEST_TYPE_SIZE (KEYBDINPUT, 16) + TEST_TYPE_ALIGN (KEYBDINPUT, 4) + TEST_FIELD_SIZE (KEYBDINPUT, wVk, 2) + TEST_FIELD_ALIGN (KEYBDINPUT, wVk, 2) + TEST_FIELD_OFFSET(KEYBDINPUT, wVk, 0) + TEST_FIELD_SIZE (KEYBDINPUT, wScan, 2) + TEST_FIELD_ALIGN (KEYBDINPUT, wScan, 2) + TEST_FIELD_OFFSET(KEYBDINPUT, wScan, 2) + TEST_FIELD_SIZE (KEYBDINPUT, dwFlags, 4) + TEST_FIELD_ALIGN (KEYBDINPUT, dwFlags, 4) + TEST_FIELD_OFFSET(KEYBDINPUT, dwFlags, 4) + TEST_FIELD_SIZE (KEYBDINPUT, time, 4) + TEST_FIELD_ALIGN (KEYBDINPUT, time, 4) + TEST_FIELD_OFFSET(KEYBDINPUT, time, 8) + TEST_FIELD_SIZE (KEYBDINPUT, dwExtraInfo, 4) + TEST_FIELD_ALIGN (KEYBDINPUT, dwExtraInfo, 4) + TEST_FIELD_OFFSET(KEYBDINPUT, dwExtraInfo, 12) } static void test_pack_LPACCESSTIMEOUT(void) { /* LPACCESSTIMEOUT */ - TEST_TYPE(LPACCESSTIMEOUT, 4, 4); - TEST_TYPE_POINTER(LPACCESSTIMEOUT, 12, 4); + TEST_TYPE_SIZE (LPACCESSTIMEOUT, 4) + TEST_TYPE_ALIGN (LPACCESSTIMEOUT, 4) + TEST_TARGET_SIZE (LPACCESSTIMEOUT, 12) + TEST_TARGET_ALIGN(LPACCESSTIMEOUT, 4) } static void test_pack_LPANIMATIONINFO(void) { /* LPANIMATIONINFO */ - TEST_TYPE(LPANIMATIONINFO, 4, 4); - TEST_TYPE_POINTER(LPANIMATIONINFO, 8, 4); + TEST_TYPE_SIZE (LPANIMATIONINFO, 4) + TEST_TYPE_ALIGN (LPANIMATIONINFO, 4) + TEST_TARGET_SIZE (LPANIMATIONINFO, 8) + TEST_TARGET_ALIGN(LPANIMATIONINFO, 4) } static void test_pack_LPCBTACTIVATESTRUCT(void) { /* LPCBTACTIVATESTRUCT */ - TEST_TYPE(LPCBTACTIVATESTRUCT, 4, 4); - TEST_TYPE_POINTER(LPCBTACTIVATESTRUCT, 8, 4); + TEST_TYPE_SIZE (LPCBTACTIVATESTRUCT, 4) + TEST_TYPE_ALIGN (LPCBTACTIVATESTRUCT, 4) + TEST_TARGET_SIZE (LPCBTACTIVATESTRUCT, 8) + TEST_TARGET_ALIGN(LPCBTACTIVATESTRUCT, 4) } static void test_pack_LPCBT_CREATEWNDA(void) { /* LPCBT_CREATEWNDA */ - TEST_TYPE(LPCBT_CREATEWNDA, 4, 4); - TEST_TYPE_POINTER(LPCBT_CREATEWNDA, 8, 4); + TEST_TYPE_SIZE (LPCBT_CREATEWNDA, 4) + TEST_TYPE_ALIGN (LPCBT_CREATEWNDA, 4) + TEST_TARGET_SIZE (LPCBT_CREATEWNDA, 8) + TEST_TARGET_ALIGN(LPCBT_CREATEWNDA, 4) } static void test_pack_LPCBT_CREATEWNDW(void) { /* LPCBT_CREATEWNDW */ - TEST_TYPE(LPCBT_CREATEWNDW, 4, 4); - TEST_TYPE_POINTER(LPCBT_CREATEWNDW, 8, 4); + TEST_TYPE_SIZE (LPCBT_CREATEWNDW, 4) + TEST_TYPE_ALIGN (LPCBT_CREATEWNDW, 4) + TEST_TARGET_SIZE (LPCBT_CREATEWNDW, 8) + TEST_TARGET_ALIGN(LPCBT_CREATEWNDW, 4) } static void test_pack_LPCDLGTEMPLATEA(void) { /* LPCDLGTEMPLATEA */ - TEST_TYPE(LPCDLGTEMPLATEA, 4, 4); - TEST_TYPE_POINTER(LPCDLGTEMPLATEA, 18, 2); + TEST_TYPE_SIZE (LPCDLGTEMPLATEA, 4) + TEST_TYPE_ALIGN (LPCDLGTEMPLATEA, 4) + TEST_TARGET_SIZE (LPCDLGTEMPLATEA, 18) + TEST_TARGET_ALIGN(LPCDLGTEMPLATEA, 2) } static void test_pack_LPCDLGTEMPLATEW(void) { /* LPCDLGTEMPLATEW */ - TEST_TYPE(LPCDLGTEMPLATEW, 4, 4); - TEST_TYPE_POINTER(LPCDLGTEMPLATEW, 18, 2); + TEST_TYPE_SIZE (LPCDLGTEMPLATEW, 4) + TEST_TYPE_ALIGN (LPCDLGTEMPLATEW, 4) + TEST_TARGET_SIZE (LPCDLGTEMPLATEW, 18) + TEST_TARGET_ALIGN(LPCDLGTEMPLATEW, 2) } static void test_pack_LPCLIENTCREATESTRUCT(void) { /* LPCLIENTCREATESTRUCT */ - TEST_TYPE(LPCLIENTCREATESTRUCT, 4, 4); - TEST_TYPE_POINTER(LPCLIENTCREATESTRUCT, 8, 4); + TEST_TYPE_SIZE (LPCLIENTCREATESTRUCT, 4) + TEST_TYPE_ALIGN (LPCLIENTCREATESTRUCT, 4) + TEST_TARGET_SIZE (LPCLIENTCREATESTRUCT, 8) + TEST_TARGET_ALIGN(LPCLIENTCREATESTRUCT, 4) } static void test_pack_LPCMENUINFO(void) { /* LPCMENUINFO */ - TEST_TYPE(LPCMENUINFO, 4, 4); - TEST_TYPE_POINTER(LPCMENUINFO, 28, 4); + TEST_TYPE_SIZE (LPCMENUINFO, 4) + TEST_TYPE_ALIGN (LPCMENUINFO, 4) + TEST_TARGET_SIZE (LPCMENUINFO, 28) + TEST_TARGET_ALIGN(LPCMENUINFO, 4) } static void test_pack_LPCMENUITEMINFOA(void) { /* LPCMENUITEMINFOA */ - TEST_TYPE(LPCMENUITEMINFOA, 4, 4); - TEST_TYPE_POINTER(LPCMENUITEMINFOA, 48, 4); + TEST_TYPE_SIZE (LPCMENUITEMINFOA, 4) + TEST_TYPE_ALIGN (LPCMENUITEMINFOA, 4) + TEST_TARGET_SIZE (LPCMENUITEMINFOA, 48) + TEST_TARGET_ALIGN(LPCMENUITEMINFOA, 4) } static void test_pack_LPCMENUITEMINFOW(void) { /* LPCMENUITEMINFOW */ - TEST_TYPE(LPCMENUITEMINFOW, 4, 4); - TEST_TYPE_POINTER(LPCMENUITEMINFOW, 48, 4); + TEST_TYPE_SIZE (LPCMENUITEMINFOW, 4) + TEST_TYPE_ALIGN (LPCMENUITEMINFOW, 4) + TEST_TARGET_SIZE (LPCMENUITEMINFOW, 48) + TEST_TARGET_ALIGN(LPCMENUITEMINFOW, 4) } static void test_pack_LPCOMBOBOXINFO(void) { /* LPCOMBOBOXINFO */ - TEST_TYPE(LPCOMBOBOXINFO, 4, 4); - TEST_TYPE_POINTER(LPCOMBOBOXINFO, 52, 4); + TEST_TYPE_SIZE (LPCOMBOBOXINFO, 4) + TEST_TYPE_ALIGN (LPCOMBOBOXINFO, 4) + TEST_TARGET_SIZE (LPCOMBOBOXINFO, 52) + TEST_TARGET_ALIGN(LPCOMBOBOXINFO, 4) } static void test_pack_LPCOMPAREITEMSTRUCT(void) { /* LPCOMPAREITEMSTRUCT */ - TEST_TYPE(LPCOMPAREITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPCOMPAREITEMSTRUCT, 32, 4); + TEST_TYPE_SIZE (LPCOMPAREITEMSTRUCT, 4) + TEST_TYPE_ALIGN (LPCOMPAREITEMSTRUCT, 4) + TEST_TARGET_SIZE (LPCOMPAREITEMSTRUCT, 32) + TEST_TARGET_ALIGN(LPCOMPAREITEMSTRUCT, 4) } static void test_pack_LPCREATESTRUCTA(void) { /* LPCREATESTRUCTA */ - TEST_TYPE(LPCREATESTRUCTA, 4, 4); - TEST_TYPE_POINTER(LPCREATESTRUCTA, 48, 4); + TEST_TYPE_SIZE (LPCREATESTRUCTA, 4) + TEST_TYPE_ALIGN (LPCREATESTRUCTA, 4) + TEST_TARGET_SIZE (LPCREATESTRUCTA, 48) + TEST_TARGET_ALIGN(LPCREATESTRUCTA, 4) } static void test_pack_LPCREATESTRUCTW(void) { /* LPCREATESTRUCTW */ - TEST_TYPE(LPCREATESTRUCTW, 4, 4); - TEST_TYPE_POINTER(LPCREATESTRUCTW, 48, 4); + TEST_TYPE_SIZE (LPCREATESTRUCTW, 4) + TEST_TYPE_ALIGN (LPCREATESTRUCTW, 4) + TEST_TARGET_SIZE (LPCREATESTRUCTW, 48) + TEST_TARGET_ALIGN(LPCREATESTRUCTW, 4) } static void test_pack_LPCSCROLLINFO(void) { /* LPCSCROLLINFO */ - TEST_TYPE(LPCSCROLLINFO, 4, 4); - TEST_TYPE_POINTER(LPCSCROLLINFO, 28, 4); + TEST_TYPE_SIZE (LPCSCROLLINFO, 4) + TEST_TYPE_ALIGN (LPCSCROLLINFO, 4) + TEST_TARGET_SIZE (LPCSCROLLINFO, 28) + TEST_TARGET_ALIGN(LPCSCROLLINFO, 4) } static void test_pack_LPCURSORINFO(void) { /* LPCURSORINFO */ - TEST_TYPE(LPCURSORINFO, 4, 4); - TEST_TYPE_POINTER(LPCURSORINFO, 20, 4); + TEST_TYPE_SIZE (LPCURSORINFO, 4) + TEST_TYPE_ALIGN (LPCURSORINFO, 4) + TEST_TARGET_SIZE (LPCURSORINFO, 20) + TEST_TARGET_ALIGN(LPCURSORINFO, 4) } static void test_pack_LPCWPRETSTRUCT(void) { /* LPCWPRETSTRUCT */ - TEST_TYPE(LPCWPRETSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPCWPRETSTRUCT, 20, 4); + TEST_TYPE_SIZE (LPCWPRETSTRUCT, 4) + TEST_TYPE_ALIGN (LPCWPRETSTRUCT, 4) + TEST_TARGET_SIZE (LPCWPRETSTRUCT, 20) + TEST_TARGET_ALIGN(LPCWPRETSTRUCT, 4) } static void test_pack_LPCWPSTRUCT(void) { /* LPCWPSTRUCT */ - TEST_TYPE(LPCWPSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPCWPSTRUCT, 16, 4); + TEST_TYPE_SIZE (LPCWPSTRUCT, 4) + TEST_TYPE_ALIGN (LPCWPSTRUCT, 4) + TEST_TARGET_SIZE (LPCWPSTRUCT, 16) + TEST_TARGET_ALIGN(LPCWPSTRUCT, 4) } static void test_pack_LPDEBUGHOOKINFO(void) { /* LPDEBUGHOOKINFO */ - TEST_TYPE(LPDEBUGHOOKINFO, 4, 4); - TEST_TYPE_POINTER(LPDEBUGHOOKINFO, 20, 4); + TEST_TYPE_SIZE (LPDEBUGHOOKINFO, 4) + TEST_TYPE_ALIGN (LPDEBUGHOOKINFO, 4) + TEST_TARGET_SIZE (LPDEBUGHOOKINFO, 20) + TEST_TARGET_ALIGN(LPDEBUGHOOKINFO, 4) } static void test_pack_LPDELETEITEMSTRUCT(void) { /* LPDELETEITEMSTRUCT */ - TEST_TYPE(LPDELETEITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPDELETEITEMSTRUCT, 20, 4); + TEST_TYPE_SIZE (LPDELETEITEMSTRUCT, 4) + TEST_TYPE_ALIGN (LPDELETEITEMSTRUCT, 4) + TEST_TARGET_SIZE (LPDELETEITEMSTRUCT, 20) + TEST_TARGET_ALIGN(LPDELETEITEMSTRUCT, 4) } static void test_pack_LPDLGITEMTEMPLATEA(void) { /* LPDLGITEMTEMPLATEA */ - TEST_TYPE(LPDLGITEMTEMPLATEA, 4, 4); - TEST_TYPE_POINTER(LPDLGITEMTEMPLATEA, 18, 2); + TEST_TYPE_SIZE (LPDLGITEMTEMPLATEA, 4) + TEST_TYPE_ALIGN (LPDLGITEMTEMPLATEA, 4) + TEST_TARGET_SIZE (LPDLGITEMTEMPLATEA, 18) + TEST_TARGET_ALIGN(LPDLGITEMTEMPLATEA, 2) } static void test_pack_LPDLGITEMTEMPLATEW(void) { /* LPDLGITEMTEMPLATEW */ - TEST_TYPE(LPDLGITEMTEMPLATEW, 4, 4); - TEST_TYPE_POINTER(LPDLGITEMTEMPLATEW, 18, 2); + TEST_TYPE_SIZE (LPDLGITEMTEMPLATEW, 4) + TEST_TYPE_ALIGN (LPDLGITEMTEMPLATEW, 4) + TEST_TARGET_SIZE (LPDLGITEMTEMPLATEW, 18) + TEST_TARGET_ALIGN(LPDLGITEMTEMPLATEW, 2) } static void test_pack_LPDLGTEMPLATEA(void) { /* LPDLGTEMPLATEA */ - TEST_TYPE(LPDLGTEMPLATEA, 4, 4); - TEST_TYPE_POINTER(LPDLGTEMPLATEA, 18, 2); + TEST_TYPE_SIZE (LPDLGTEMPLATEA, 4) + TEST_TYPE_ALIGN (LPDLGTEMPLATEA, 4) + TEST_TARGET_SIZE (LPDLGTEMPLATEA, 18) + TEST_TARGET_ALIGN(LPDLGTEMPLATEA, 2) } static void test_pack_LPDLGTEMPLATEW(void) { /* LPDLGTEMPLATEW */ - TEST_TYPE(LPDLGTEMPLATEW, 4, 4); - TEST_TYPE_POINTER(LPDLGTEMPLATEW, 18, 2); + TEST_TYPE_SIZE (LPDLGTEMPLATEW, 4) + TEST_TYPE_ALIGN (LPDLGTEMPLATEW, 4) + TEST_TARGET_SIZE (LPDLGTEMPLATEW, 18) + TEST_TARGET_ALIGN(LPDLGTEMPLATEW, 2) } static void test_pack_LPDRAWITEMSTRUCT(void) { /* LPDRAWITEMSTRUCT */ - TEST_TYPE(LPDRAWITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPDRAWITEMSTRUCT, 48, 4); + TEST_TYPE_SIZE (LPDRAWITEMSTRUCT, 4) + TEST_TYPE_ALIGN (LPDRAWITEMSTRUCT, 4) + TEST_TARGET_SIZE (LPDRAWITEMSTRUCT, 48) + TEST_TARGET_ALIGN(LPDRAWITEMSTRUCT, 4) } static void test_pack_LPDRAWTEXTPARAMS(void) { /* LPDRAWTEXTPARAMS */ - TEST_TYPE(LPDRAWTEXTPARAMS, 4, 4); - TEST_TYPE_POINTER(LPDRAWTEXTPARAMS, 20, 4); + TEST_TYPE_SIZE (LPDRAWTEXTPARAMS, 4) + TEST_TYPE_ALIGN (LPDRAWTEXTPARAMS, 4) + TEST_TARGET_SIZE (LPDRAWTEXTPARAMS, 20) + TEST_TARGET_ALIGN(LPDRAWTEXTPARAMS, 4) } static void test_pack_LPEVENTMSG(void) { /* LPEVENTMSG */ - TEST_TYPE(LPEVENTMSG, 4, 4); - TEST_TYPE_POINTER(LPEVENTMSG, 20, 4); + TEST_TYPE_SIZE (LPEVENTMSG, 4) + TEST_TYPE_ALIGN (LPEVENTMSG, 4) + TEST_TARGET_SIZE (LPEVENTMSG, 20) + TEST_TARGET_ALIGN(LPEVENTMSG, 4) } static void test_pack_LPFILTERKEYS(void) { /* LPFILTERKEYS */ - TEST_TYPE(LPFILTERKEYS, 4, 4); - TEST_TYPE_POINTER(LPFILTERKEYS, 24, 4); + TEST_TYPE_SIZE (LPFILTERKEYS, 4) + TEST_TYPE_ALIGN (LPFILTERKEYS, 4) + TEST_TARGET_SIZE (LPFILTERKEYS, 24) + TEST_TARGET_ALIGN(LPFILTERKEYS, 4) } static void test_pack_LPGUITHREADINFO(void) { /* LPGUITHREADINFO */ - TEST_TYPE(LPGUITHREADINFO, 4, 4); - TEST_TYPE_POINTER(LPGUITHREADINFO, 48, 4); + TEST_TYPE_SIZE (LPGUITHREADINFO, 4) + TEST_TYPE_ALIGN (LPGUITHREADINFO, 4) + TEST_TARGET_SIZE (LPGUITHREADINFO, 48) + TEST_TARGET_ALIGN(LPGUITHREADINFO, 4) } static void test_pack_LPHARDWAREHOOKSTRUCT(void) { /* LPHARDWAREHOOKSTRUCT */ - TEST_TYPE(LPHARDWAREHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPHARDWAREHOOKSTRUCT, 16, 4); + TEST_TYPE_SIZE (LPHARDWAREHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (LPHARDWAREHOOKSTRUCT, 4) + TEST_TARGET_SIZE (LPHARDWAREHOOKSTRUCT, 16) + TEST_TARGET_ALIGN(LPHARDWAREHOOKSTRUCT, 4) } static void test_pack_LPHARDWAREINPUT(void) { /* LPHARDWAREINPUT */ - TEST_TYPE(LPHARDWAREINPUT, 4, 4); - TEST_TYPE_POINTER(LPHARDWAREINPUT, 8, 4); + TEST_TYPE_SIZE (LPHARDWAREINPUT, 4) + TEST_TYPE_ALIGN (LPHARDWAREINPUT, 4) + TEST_TARGET_SIZE (LPHARDWAREINPUT, 8) + TEST_TARGET_ALIGN(LPHARDWAREINPUT, 4) } static void test_pack_LPHELPINFO(void) { /* LPHELPINFO */ - TEST_TYPE(LPHELPINFO, 4, 4); - TEST_TYPE_POINTER(LPHELPINFO, 28, 4); + TEST_TYPE_SIZE (LPHELPINFO, 4) + TEST_TYPE_ALIGN (LPHELPINFO, 4) + TEST_TARGET_SIZE (LPHELPINFO, 28) + TEST_TARGET_ALIGN(LPHELPINFO, 4) } static void test_pack_LPHELPWININFOA(void) { /* LPHELPWININFOA */ - TEST_TYPE(LPHELPWININFOA, 4, 4); - TEST_TYPE_POINTER(LPHELPWININFOA, 28, 4); + TEST_TYPE_SIZE (LPHELPWININFOA, 4) + TEST_TYPE_ALIGN (LPHELPWININFOA, 4) + TEST_TARGET_SIZE (LPHELPWININFOA, 28) + TEST_TARGET_ALIGN(LPHELPWININFOA, 4) } static void test_pack_LPHELPWININFOW(void) { /* LPHELPWININFOW */ - TEST_TYPE(LPHELPWININFOW, 4, 4); - TEST_TYPE_POINTER(LPHELPWININFOW, 28, 4); + TEST_TYPE_SIZE (LPHELPWININFOW, 4) + TEST_TYPE_ALIGN (LPHELPWININFOW, 4) + TEST_TARGET_SIZE (LPHELPWININFOW, 28) + TEST_TARGET_ALIGN(LPHELPWININFOW, 4) } static void test_pack_LPHIGHCONTRASTA(void) { /* LPHIGHCONTRASTA */ - TEST_TYPE(LPHIGHCONTRASTA, 4, 4); - TEST_TYPE_POINTER(LPHIGHCONTRASTA, 12, 4); + TEST_TYPE_SIZE (LPHIGHCONTRASTA, 4) + TEST_TYPE_ALIGN (LPHIGHCONTRASTA, 4) + TEST_TARGET_SIZE (LPHIGHCONTRASTA, 12) + TEST_TARGET_ALIGN(LPHIGHCONTRASTA, 4) } static void test_pack_LPHIGHCONTRASTW(void) { /* LPHIGHCONTRASTW */ - TEST_TYPE(LPHIGHCONTRASTW, 4, 4); - TEST_TYPE_POINTER(LPHIGHCONTRASTW, 12, 4); + TEST_TYPE_SIZE (LPHIGHCONTRASTW, 4) + TEST_TYPE_ALIGN (LPHIGHCONTRASTW, 4) + TEST_TARGET_SIZE (LPHIGHCONTRASTW, 12) + TEST_TARGET_ALIGN(LPHIGHCONTRASTW, 4) } static void test_pack_LPICONMETRICSA(void) { /* LPICONMETRICSA */ - TEST_TYPE(LPICONMETRICSA, 4, 4); - TEST_TYPE_POINTER(LPICONMETRICSA, 76, 4); + TEST_TYPE_SIZE (LPICONMETRICSA, 4) + TEST_TYPE_ALIGN (LPICONMETRICSA, 4) + TEST_TARGET_SIZE (LPICONMETRICSA, 76) + TEST_TARGET_ALIGN(LPICONMETRICSA, 4) } static void test_pack_LPICONMETRICSW(void) { /* LPICONMETRICSW */ - TEST_TYPE(LPICONMETRICSW, 4, 4); - TEST_TYPE_POINTER(LPICONMETRICSW, 108, 4); + TEST_TYPE_SIZE (LPICONMETRICSW, 4) + TEST_TYPE_ALIGN (LPICONMETRICSW, 4) + TEST_TARGET_SIZE (LPICONMETRICSW, 108) + TEST_TARGET_ALIGN(LPICONMETRICSW, 4) } static void test_pack_LPINPUT(void) { /* LPINPUT */ - TEST_TYPE(LPINPUT, 4, 4); + TEST_TYPE_SIZE (LPINPUT, 4) + TEST_TYPE_ALIGN (LPINPUT, 4) } static void test_pack_LPKBDLLHOOKSTRUCT(void) { /* LPKBDLLHOOKSTRUCT */ - TEST_TYPE(LPKBDLLHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPKBDLLHOOKSTRUCT, 20, 4); + TEST_TYPE_SIZE (LPKBDLLHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (LPKBDLLHOOKSTRUCT, 4) + TEST_TARGET_SIZE (LPKBDLLHOOKSTRUCT, 20) + TEST_TARGET_ALIGN(LPKBDLLHOOKSTRUCT, 4) } static void test_pack_LPKEYBDINPUT(void) { /* LPKEYBDINPUT */ - TEST_TYPE(LPKEYBDINPUT, 4, 4); - TEST_TYPE_POINTER(LPKEYBDINPUT, 16, 4); + TEST_TYPE_SIZE (LPKEYBDINPUT, 4) + TEST_TYPE_ALIGN (LPKEYBDINPUT, 4) + TEST_TARGET_SIZE (LPKEYBDINPUT, 16) + TEST_TARGET_ALIGN(LPKEYBDINPUT, 4) } static void test_pack_LPMDICREATESTRUCTA(void) { /* LPMDICREATESTRUCTA */ - TEST_TYPE(LPMDICREATESTRUCTA, 4, 4); - TEST_TYPE_POINTER(LPMDICREATESTRUCTA, 36, 4); + TEST_TYPE_SIZE (LPMDICREATESTRUCTA, 4) + TEST_TYPE_ALIGN (LPMDICREATESTRUCTA, 4) + TEST_TARGET_SIZE (LPMDICREATESTRUCTA, 36) + TEST_TARGET_ALIGN(LPMDICREATESTRUCTA, 4) } static void test_pack_LPMDICREATESTRUCTW(void) { /* LPMDICREATESTRUCTW */ - TEST_TYPE(LPMDICREATESTRUCTW, 4, 4); - TEST_TYPE_POINTER(LPMDICREATESTRUCTW, 36, 4); + TEST_TYPE_SIZE (LPMDICREATESTRUCTW, 4) + TEST_TYPE_ALIGN (LPMDICREATESTRUCTW, 4) + TEST_TARGET_SIZE (LPMDICREATESTRUCTW, 36) + TEST_TARGET_ALIGN(LPMDICREATESTRUCTW, 4) } static void test_pack_LPMDINEXTMENU(void) { /* LPMDINEXTMENU */ - TEST_TYPE(LPMDINEXTMENU, 4, 4); - TEST_TYPE_POINTER(LPMDINEXTMENU, 12, 4); + TEST_TYPE_SIZE (LPMDINEXTMENU, 4) + TEST_TYPE_ALIGN (LPMDINEXTMENU, 4) + TEST_TARGET_SIZE (LPMDINEXTMENU, 12) + TEST_TARGET_ALIGN(LPMDINEXTMENU, 4) } static void test_pack_LPMEASUREITEMSTRUCT(void) { /* LPMEASUREITEMSTRUCT */ - TEST_TYPE(LPMEASUREITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPMEASUREITEMSTRUCT, 24, 4); + TEST_TYPE_SIZE (LPMEASUREITEMSTRUCT, 4) + TEST_TYPE_ALIGN (LPMEASUREITEMSTRUCT, 4) + TEST_TARGET_SIZE (LPMEASUREITEMSTRUCT, 24) + TEST_TARGET_ALIGN(LPMEASUREITEMSTRUCT, 4) } static void test_pack_LPMENUINFO(void) { /* LPMENUINFO */ - TEST_TYPE(LPMENUINFO, 4, 4); - TEST_TYPE_POINTER(LPMENUINFO, 28, 4); + TEST_TYPE_SIZE (LPMENUINFO, 4) + TEST_TYPE_ALIGN (LPMENUINFO, 4) + TEST_TARGET_SIZE (LPMENUINFO, 28) + TEST_TARGET_ALIGN(LPMENUINFO, 4) } static void test_pack_LPMENUITEMINFOA(void) { /* LPMENUITEMINFOA */ - TEST_TYPE(LPMENUITEMINFOA, 4, 4); - TEST_TYPE_POINTER(LPMENUITEMINFOA, 48, 4); + TEST_TYPE_SIZE (LPMENUITEMINFOA, 4) + TEST_TYPE_ALIGN (LPMENUITEMINFOA, 4) + TEST_TARGET_SIZE (LPMENUITEMINFOA, 48) + TEST_TARGET_ALIGN(LPMENUITEMINFOA, 4) } static void test_pack_LPMENUITEMINFOW(void) { /* LPMENUITEMINFOW */ - TEST_TYPE(LPMENUITEMINFOW, 4, 4); - TEST_TYPE_POINTER(LPMENUITEMINFOW, 48, 4); + TEST_TYPE_SIZE (LPMENUITEMINFOW, 4) + TEST_TYPE_ALIGN (LPMENUITEMINFOW, 4) + TEST_TARGET_SIZE (LPMENUITEMINFOW, 48) + TEST_TARGET_ALIGN(LPMENUITEMINFOW, 4) } static void test_pack_LPMINIMIZEDMETRICS(void) { /* LPMINIMIZEDMETRICS */ - TEST_TYPE(LPMINIMIZEDMETRICS, 4, 4); - TEST_TYPE_POINTER(LPMINIMIZEDMETRICS, 20, 4); + TEST_TYPE_SIZE (LPMINIMIZEDMETRICS, 4) + TEST_TYPE_ALIGN (LPMINIMIZEDMETRICS, 4) + TEST_TARGET_SIZE (LPMINIMIZEDMETRICS, 20) + TEST_TARGET_ALIGN(LPMINIMIZEDMETRICS, 4) } static void test_pack_LPMINMAXINFO(void) { /* LPMINMAXINFO */ - TEST_TYPE(LPMINMAXINFO, 4, 4); - TEST_TYPE_POINTER(LPMINMAXINFO, 40, 4); + TEST_TYPE_SIZE (LPMINMAXINFO, 4) + TEST_TYPE_ALIGN (LPMINMAXINFO, 4) + TEST_TARGET_SIZE (LPMINMAXINFO, 40) + TEST_TARGET_ALIGN(LPMINMAXINFO, 4) } static void test_pack_LPMONITORINFO(void) { /* LPMONITORINFO */ - TEST_TYPE(LPMONITORINFO, 4, 4); - TEST_TYPE_POINTER(LPMONITORINFO, 40, 4); + TEST_TYPE_SIZE (LPMONITORINFO, 4) + TEST_TYPE_ALIGN (LPMONITORINFO, 4) + TEST_TARGET_SIZE (LPMONITORINFO, 40) + TEST_TARGET_ALIGN(LPMONITORINFO, 4) } static void test_pack_LPMONITORINFOEXA(void) { /* LPMONITORINFOEXA */ - TEST_TYPE(LPMONITORINFOEXA, 4, 4); - TEST_TYPE_POINTER(LPMONITORINFOEXA, 72, 4); + TEST_TYPE_SIZE (LPMONITORINFOEXA, 4) + TEST_TYPE_ALIGN (LPMONITORINFOEXA, 4) + TEST_TARGET_SIZE (LPMONITORINFOEXA, 72) + TEST_TARGET_ALIGN(LPMONITORINFOEXA, 4) } static void test_pack_LPMONITORINFOEXW(void) { /* LPMONITORINFOEXW */ - TEST_TYPE(LPMONITORINFOEXW, 4, 4); - TEST_TYPE_POINTER(LPMONITORINFOEXW, 104, 4); + TEST_TYPE_SIZE (LPMONITORINFOEXW, 4) + TEST_TYPE_ALIGN (LPMONITORINFOEXW, 4) + TEST_TARGET_SIZE (LPMONITORINFOEXW, 104) + TEST_TARGET_ALIGN(LPMONITORINFOEXW, 4) } static void test_pack_LPMOUSEHOOKSTRUCT(void) { /* LPMOUSEHOOKSTRUCT */ - TEST_TYPE(LPMOUSEHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPMOUSEHOOKSTRUCT, 20, 4); + TEST_TYPE_SIZE (LPMOUSEHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (LPMOUSEHOOKSTRUCT, 4) + TEST_TARGET_SIZE (LPMOUSEHOOKSTRUCT, 20) + TEST_TARGET_ALIGN(LPMOUSEHOOKSTRUCT, 4) } static void test_pack_LPMOUSEINPUT(void) { /* LPMOUSEINPUT */ - TEST_TYPE(LPMOUSEINPUT, 4, 4); - TEST_TYPE_POINTER(LPMOUSEINPUT, 24, 4); + TEST_TYPE_SIZE (LPMOUSEINPUT, 4) + TEST_TYPE_ALIGN (LPMOUSEINPUT, 4) + TEST_TARGET_SIZE (LPMOUSEINPUT, 24) + TEST_TARGET_ALIGN(LPMOUSEINPUT, 4) } static void test_pack_LPMOUSEKEYS(void) { /* LPMOUSEKEYS */ - TEST_TYPE(LPMOUSEKEYS, 4, 4); - TEST_TYPE_POINTER(LPMOUSEKEYS, 28, 4); + TEST_TYPE_SIZE (LPMOUSEKEYS, 4) + TEST_TYPE_ALIGN (LPMOUSEKEYS, 4) + TEST_TARGET_SIZE (LPMOUSEKEYS, 28) + TEST_TARGET_ALIGN(LPMOUSEKEYS, 4) } static void test_pack_LPMSG(void) { /* LPMSG */ - TEST_TYPE(LPMSG, 4, 4); - TEST_TYPE_POINTER(LPMSG, 28, 4); + TEST_TYPE_SIZE (LPMSG, 4) + TEST_TYPE_ALIGN (LPMSG, 4) + TEST_TARGET_SIZE (LPMSG, 28) + TEST_TARGET_ALIGN(LPMSG, 4) } static void test_pack_LPMSGBOXPARAMSA(void) { /* LPMSGBOXPARAMSA */ - TEST_TYPE(LPMSGBOXPARAMSA, 4, 4); - TEST_TYPE_POINTER(LPMSGBOXPARAMSA, 40, 4); + TEST_TYPE_SIZE (LPMSGBOXPARAMSA, 4) + TEST_TYPE_ALIGN (LPMSGBOXPARAMSA, 4) + TEST_TARGET_SIZE (LPMSGBOXPARAMSA, 40) + TEST_TARGET_ALIGN(LPMSGBOXPARAMSA, 4) } static void test_pack_LPMSGBOXPARAMSW(void) { /* LPMSGBOXPARAMSW */ - TEST_TYPE(LPMSGBOXPARAMSW, 4, 4); - TEST_TYPE_POINTER(LPMSGBOXPARAMSW, 40, 4); + TEST_TYPE_SIZE (LPMSGBOXPARAMSW, 4) + TEST_TYPE_ALIGN (LPMSGBOXPARAMSW, 4) + TEST_TARGET_SIZE (LPMSGBOXPARAMSW, 40) + TEST_TARGET_ALIGN(LPMSGBOXPARAMSW, 4) } static void test_pack_LPMSLLHOOKSTRUCT(void) { /* LPMSLLHOOKSTRUCT */ - TEST_TYPE(LPMSLLHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPMSLLHOOKSTRUCT, 24, 4); + TEST_TYPE_SIZE (LPMSLLHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (LPMSLLHOOKSTRUCT, 4) + TEST_TARGET_SIZE (LPMSLLHOOKSTRUCT, 24) + TEST_TARGET_ALIGN(LPMSLLHOOKSTRUCT, 4) } static void test_pack_LPMULTIKEYHELPA(void) { /* LPMULTIKEYHELPA */ - TEST_TYPE(LPMULTIKEYHELPA, 4, 4); - TEST_TYPE_POINTER(LPMULTIKEYHELPA, 8, 4); + TEST_TYPE_SIZE (LPMULTIKEYHELPA, 4) + TEST_TYPE_ALIGN (LPMULTIKEYHELPA, 4) + TEST_TARGET_SIZE (LPMULTIKEYHELPA, 8) + TEST_TARGET_ALIGN(LPMULTIKEYHELPA, 4) } static void test_pack_LPMULTIKEYHELPW(void) { /* LPMULTIKEYHELPW */ - TEST_TYPE(LPMULTIKEYHELPW, 4, 4); - TEST_TYPE_POINTER(LPMULTIKEYHELPW, 8, 4); + TEST_TYPE_SIZE (LPMULTIKEYHELPW, 4) + TEST_TYPE_ALIGN (LPMULTIKEYHELPW, 4) + TEST_TARGET_SIZE (LPMULTIKEYHELPW, 8) + TEST_TARGET_ALIGN(LPMULTIKEYHELPW, 4) } static void test_pack_LPNCCALCSIZE_PARAMS(void) { /* LPNCCALCSIZE_PARAMS */ - TEST_TYPE(LPNCCALCSIZE_PARAMS, 4, 4); - TEST_TYPE_POINTER(LPNCCALCSIZE_PARAMS, 52, 4); + TEST_TYPE_SIZE (LPNCCALCSIZE_PARAMS, 4) + TEST_TYPE_ALIGN (LPNCCALCSIZE_PARAMS, 4) + TEST_TARGET_SIZE (LPNCCALCSIZE_PARAMS, 52) + TEST_TARGET_ALIGN(LPNCCALCSIZE_PARAMS, 4) } static void test_pack_LPNMHDR(void) { /* LPNMHDR */ - TEST_TYPE(LPNMHDR, 4, 4); - TEST_TYPE_POINTER(LPNMHDR, 12, 4); + TEST_TYPE_SIZE (LPNMHDR, 4) + TEST_TYPE_ALIGN (LPNMHDR, 4) + TEST_TARGET_SIZE (LPNMHDR, 12) + TEST_TARGET_ALIGN(LPNMHDR, 4) } static void test_pack_LPNONCLIENTMETRICSA(void) { /* LPNONCLIENTMETRICSA */ - TEST_TYPE(LPNONCLIENTMETRICSA, 4, 4); - TEST_TYPE_POINTER(LPNONCLIENTMETRICSA, 340, 4); + TEST_TYPE_SIZE (LPNONCLIENTMETRICSA, 4) + TEST_TYPE_ALIGN (LPNONCLIENTMETRICSA, 4) + TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 340) + TEST_TARGET_ALIGN(LPNONCLIENTMETRICSA, 4) } static void test_pack_LPNONCLIENTMETRICSW(void) { /* LPNONCLIENTMETRICSW */ - TEST_TYPE(LPNONCLIENTMETRICSW, 4, 4); - TEST_TYPE_POINTER(LPNONCLIENTMETRICSW, 500, 4); + TEST_TYPE_SIZE (LPNONCLIENTMETRICSW, 4) + TEST_TYPE_ALIGN (LPNONCLIENTMETRICSW, 4) + TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 500) + TEST_TARGET_ALIGN(LPNONCLIENTMETRICSW, 4) } static void test_pack_LPPAINTSTRUCT(void) { /* LPPAINTSTRUCT */ - TEST_TYPE(LPPAINTSTRUCT, 4, 4); - TEST_TYPE_POINTER(LPPAINTSTRUCT, 64, 4); + TEST_TYPE_SIZE (LPPAINTSTRUCT, 4) + TEST_TYPE_ALIGN (LPPAINTSTRUCT, 4) + TEST_TARGET_SIZE (LPPAINTSTRUCT, 64) + TEST_TARGET_ALIGN(LPPAINTSTRUCT, 4) } static void test_pack_LPSCROLLINFO(void) { /* LPSCROLLINFO */ - TEST_TYPE(LPSCROLLINFO, 4, 4); - TEST_TYPE_POINTER(LPSCROLLINFO, 28, 4); + TEST_TYPE_SIZE (LPSCROLLINFO, 4) + TEST_TYPE_ALIGN (LPSCROLLINFO, 4) + TEST_TARGET_SIZE (LPSCROLLINFO, 28) + TEST_TARGET_ALIGN(LPSCROLLINFO, 4) } static void test_pack_LPSERIALKEYSA(void) { /* LPSERIALKEYSA */ - TEST_TYPE(LPSERIALKEYSA, 4, 4); - TEST_TYPE_POINTER(LPSERIALKEYSA, 28, 4); + TEST_TYPE_SIZE (LPSERIALKEYSA, 4) + TEST_TYPE_ALIGN (LPSERIALKEYSA, 4) + TEST_TARGET_SIZE (LPSERIALKEYSA, 28) + TEST_TARGET_ALIGN(LPSERIALKEYSA, 4) } static void test_pack_LPSERIALKEYSW(void) { /* LPSERIALKEYSW */ - TEST_TYPE(LPSERIALKEYSW, 4, 4); - TEST_TYPE_POINTER(LPSERIALKEYSW, 28, 4); + TEST_TYPE_SIZE (LPSERIALKEYSW, 4) + TEST_TYPE_ALIGN (LPSERIALKEYSW, 4) + TEST_TARGET_SIZE (LPSERIALKEYSW, 28) + TEST_TARGET_ALIGN(LPSERIALKEYSW, 4) } static void test_pack_LPSOUNDSENTRYA(void) { /* LPSOUNDSENTRYA */ - TEST_TYPE(LPSOUNDSENTRYA, 4, 4); - TEST_TYPE_POINTER(LPSOUNDSENTRYA, 48, 4); + TEST_TYPE_SIZE (LPSOUNDSENTRYA, 4) + TEST_TYPE_ALIGN (LPSOUNDSENTRYA, 4) + TEST_TARGET_SIZE (LPSOUNDSENTRYA, 48) + TEST_TARGET_ALIGN(LPSOUNDSENTRYA, 4) } static void test_pack_LPSOUNDSENTRYW(void) { /* LPSOUNDSENTRYW */ - TEST_TYPE(LPSOUNDSENTRYW, 4, 4); - TEST_TYPE_POINTER(LPSOUNDSENTRYW, 48, 4); + TEST_TYPE_SIZE (LPSOUNDSENTRYW, 4) + TEST_TYPE_ALIGN (LPSOUNDSENTRYW, 4) + TEST_TARGET_SIZE (LPSOUNDSENTRYW, 48) + TEST_TARGET_ALIGN(LPSOUNDSENTRYW, 4) } static void test_pack_LPSTICKYKEYS(void) { /* LPSTICKYKEYS */ - TEST_TYPE(LPSTICKYKEYS, 4, 4); - TEST_TYPE_POINTER(LPSTICKYKEYS, 8, 4); + TEST_TYPE_SIZE (LPSTICKYKEYS, 4) + TEST_TYPE_ALIGN (LPSTICKYKEYS, 4) + TEST_TARGET_SIZE (LPSTICKYKEYS, 8) + TEST_TARGET_ALIGN(LPSTICKYKEYS, 4) } static void test_pack_LPSTYLESTRUCT(void) { /* LPSTYLESTRUCT */ - TEST_TYPE(LPSTYLESTRUCT, 4, 4); - TEST_TYPE_POINTER(LPSTYLESTRUCT, 8, 4); + TEST_TYPE_SIZE (LPSTYLESTRUCT, 4) + TEST_TYPE_ALIGN (LPSTYLESTRUCT, 4) + TEST_TARGET_SIZE (LPSTYLESTRUCT, 8) + TEST_TARGET_ALIGN(LPSTYLESTRUCT, 4) } static void test_pack_LPTITLEBARINFO(void) { /* LPTITLEBARINFO */ - TEST_TYPE(LPTITLEBARINFO, 4, 4); - TEST_TYPE_POINTER(LPTITLEBARINFO, 44, 4); + TEST_TYPE_SIZE (LPTITLEBARINFO, 4) + TEST_TYPE_ALIGN (LPTITLEBARINFO, 4) + TEST_TARGET_SIZE (LPTITLEBARINFO, 44) + TEST_TARGET_ALIGN(LPTITLEBARINFO, 4) } static void test_pack_LPTOGGLEKEYS(void) { /* LPTOGGLEKEYS */ - TEST_TYPE(LPTOGGLEKEYS, 4, 4); - TEST_TYPE_POINTER(LPTOGGLEKEYS, 8, 4); + TEST_TYPE_SIZE (LPTOGGLEKEYS, 4) + TEST_TYPE_ALIGN (LPTOGGLEKEYS, 4) + TEST_TARGET_SIZE (LPTOGGLEKEYS, 8) + TEST_TARGET_ALIGN(LPTOGGLEKEYS, 4) } static void test_pack_LPTPMPARAMS(void) { /* LPTPMPARAMS */ - TEST_TYPE(LPTPMPARAMS, 4, 4); - TEST_TYPE_POINTER(LPTPMPARAMS, 20, 4); + TEST_TYPE_SIZE (LPTPMPARAMS, 4) + TEST_TYPE_ALIGN (LPTPMPARAMS, 4) + TEST_TARGET_SIZE (LPTPMPARAMS, 20) + TEST_TARGET_ALIGN(LPTPMPARAMS, 4) } static void test_pack_LPTRACKMOUSEEVENT(void) { /* LPTRACKMOUSEEVENT */ - TEST_TYPE(LPTRACKMOUSEEVENT, 4, 4); - TEST_TYPE_POINTER(LPTRACKMOUSEEVENT, 16, 4); + TEST_TYPE_SIZE (LPTRACKMOUSEEVENT, 4) + TEST_TYPE_ALIGN (LPTRACKMOUSEEVENT, 4) + TEST_TARGET_SIZE (LPTRACKMOUSEEVENT, 16) + TEST_TARGET_ALIGN(LPTRACKMOUSEEVENT, 4) } static void test_pack_LPWINDOWINFO(void) { /* LPWINDOWINFO */ - TEST_TYPE(LPWINDOWINFO, 4, 4); - TEST_TYPE_POINTER(LPWINDOWINFO, 60, 4); + TEST_TYPE_SIZE (LPWINDOWINFO, 4) + TEST_TYPE_ALIGN (LPWINDOWINFO, 4) + TEST_TARGET_SIZE (LPWINDOWINFO, 60) + TEST_TARGET_ALIGN(LPWINDOWINFO, 4) } static void test_pack_LPWINDOWPLACEMENT(void) { /* LPWINDOWPLACEMENT */ - TEST_TYPE(LPWINDOWPLACEMENT, 4, 4); - TEST_TYPE_POINTER(LPWINDOWPLACEMENT, 44, 4); + TEST_TYPE_SIZE (LPWINDOWPLACEMENT, 4) + TEST_TYPE_ALIGN (LPWINDOWPLACEMENT, 4) + TEST_TARGET_SIZE (LPWINDOWPLACEMENT, 44) + TEST_TARGET_ALIGN(LPWINDOWPLACEMENT, 4) } static void test_pack_LPWINDOWPOS(void) { /* LPWINDOWPOS */ - TEST_TYPE(LPWINDOWPOS, 4, 4); - TEST_TYPE_POINTER(LPWINDOWPOS, 28, 4); + TEST_TYPE_SIZE (LPWINDOWPOS, 4) + TEST_TYPE_ALIGN (LPWINDOWPOS, 4) + TEST_TARGET_SIZE (LPWINDOWPOS, 28) + TEST_TARGET_ALIGN(LPWINDOWPOS, 4) } static void test_pack_LPWNDCLASSA(void) { /* LPWNDCLASSA */ - TEST_TYPE(LPWNDCLASSA, 4, 4); - TEST_TYPE_POINTER(LPWNDCLASSA, 40, 4); + TEST_TYPE_SIZE (LPWNDCLASSA, 4) + TEST_TYPE_ALIGN (LPWNDCLASSA, 4) + TEST_TARGET_SIZE (LPWNDCLASSA, 40) + TEST_TARGET_ALIGN(LPWNDCLASSA, 4) } static void test_pack_LPWNDCLASSEXA(void) { /* LPWNDCLASSEXA */ - TEST_TYPE(LPWNDCLASSEXA, 4, 4); - TEST_TYPE_POINTER(LPWNDCLASSEXA, 48, 4); + TEST_TYPE_SIZE (LPWNDCLASSEXA, 4) + TEST_TYPE_ALIGN (LPWNDCLASSEXA, 4) + TEST_TARGET_SIZE (LPWNDCLASSEXA, 48) + TEST_TARGET_ALIGN(LPWNDCLASSEXA, 4) } static void test_pack_LPWNDCLASSEXW(void) { /* LPWNDCLASSEXW */ - TEST_TYPE(LPWNDCLASSEXW, 4, 4); - TEST_TYPE_POINTER(LPWNDCLASSEXW, 48, 4); + TEST_TYPE_SIZE (LPWNDCLASSEXW, 4) + TEST_TYPE_ALIGN (LPWNDCLASSEXW, 4) + TEST_TARGET_SIZE (LPWNDCLASSEXW, 48) + TEST_TARGET_ALIGN(LPWNDCLASSEXW, 4) } static void test_pack_LPWNDCLASSW(void) { /* LPWNDCLASSW */ - TEST_TYPE(LPWNDCLASSW, 4, 4); - TEST_TYPE_POINTER(LPWNDCLASSW, 40, 4); + TEST_TYPE_SIZE (LPWNDCLASSW, 4) + TEST_TYPE_ALIGN (LPWNDCLASSW, 4) + TEST_TARGET_SIZE (LPWNDCLASSW, 40) + TEST_TARGET_ALIGN(LPWNDCLASSW, 4) } static void test_pack_MDICREATESTRUCTA(void) { /* MDICREATESTRUCTA (pack 4) */ - TEST_TYPE(MDICREATESTRUCTA, 36, 4); - TEST_FIELD(MDICREATESTRUCTA, LPCSTR, szClass, 0, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, LPCSTR, szTitle, 4, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, HINSTANCE, hOwner, 8, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, INT, x, 12, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, INT, y, 16, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, INT, cx, 20, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, INT, cy, 24, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, DWORD, style, 28, 4, 4); - TEST_FIELD(MDICREATESTRUCTA, LPARAM, lParam, 32, 4, 4); + TEST_TYPE_SIZE (MDICREATESTRUCTA, 36) + TEST_TYPE_ALIGN (MDICREATESTRUCTA, 4) + TEST_FIELD_SIZE (MDICREATESTRUCTA, szClass, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, szClass, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, szClass, 0) + TEST_FIELD_SIZE (MDICREATESTRUCTA, szTitle, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, szTitle, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, szTitle, 4) + TEST_FIELD_SIZE (MDICREATESTRUCTA, hOwner, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, hOwner, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, hOwner, 8) + TEST_FIELD_SIZE (MDICREATESTRUCTA, x, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, x, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, x, 12) + TEST_FIELD_SIZE (MDICREATESTRUCTA, y, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, y, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, y, 16) + TEST_FIELD_SIZE (MDICREATESTRUCTA, cx, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, cx, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, cx, 20) + TEST_FIELD_SIZE (MDICREATESTRUCTA, cy, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, cy, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, cy, 24) + TEST_FIELD_SIZE (MDICREATESTRUCTA, style, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, style, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, style, 28) + TEST_FIELD_SIZE (MDICREATESTRUCTA, lParam, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTA, lParam, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTA, lParam, 32) } static void test_pack_MDICREATESTRUCTW(void) { /* MDICREATESTRUCTW (pack 4) */ - TEST_TYPE(MDICREATESTRUCTW, 36, 4); - TEST_FIELD(MDICREATESTRUCTW, LPCWSTR, szClass, 0, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, LPCWSTR, szTitle, 4, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, HINSTANCE, hOwner, 8, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, INT, x, 12, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, INT, y, 16, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, INT, cx, 20, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, INT, cy, 24, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, DWORD, style, 28, 4, 4); - TEST_FIELD(MDICREATESTRUCTW, LPARAM, lParam, 32, 4, 4); + TEST_TYPE_SIZE (MDICREATESTRUCTW, 36) + TEST_TYPE_ALIGN (MDICREATESTRUCTW, 4) + TEST_FIELD_SIZE (MDICREATESTRUCTW, szClass, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, szClass, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, szClass, 0) + TEST_FIELD_SIZE (MDICREATESTRUCTW, szTitle, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, szTitle, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, szTitle, 4) + TEST_FIELD_SIZE (MDICREATESTRUCTW, hOwner, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, hOwner, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, hOwner, 8) + TEST_FIELD_SIZE (MDICREATESTRUCTW, x, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, x, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, x, 12) + TEST_FIELD_SIZE (MDICREATESTRUCTW, y, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, y, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, y, 16) + TEST_FIELD_SIZE (MDICREATESTRUCTW, cx, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, cx, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, cx, 20) + TEST_FIELD_SIZE (MDICREATESTRUCTW, cy, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, cy, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, cy, 24) + TEST_FIELD_SIZE (MDICREATESTRUCTW, style, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, style, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, style, 28) + TEST_FIELD_SIZE (MDICREATESTRUCTW, lParam, 4) + TEST_FIELD_ALIGN (MDICREATESTRUCTW, lParam, 4) + TEST_FIELD_OFFSET(MDICREATESTRUCTW, lParam, 32) } static void test_pack_MDINEXTMENU(void) { /* MDINEXTMENU (pack 4) */ - TEST_TYPE(MDINEXTMENU, 12, 4); - TEST_FIELD(MDINEXTMENU, HMENU, hmenuIn, 0, 4, 4); - TEST_FIELD(MDINEXTMENU, HMENU, hmenuNext, 4, 4, 4); - TEST_FIELD(MDINEXTMENU, HWND, hwndNext, 8, 4, 4); + TEST_TYPE_SIZE (MDINEXTMENU, 12) + TEST_TYPE_ALIGN (MDINEXTMENU, 4) + TEST_FIELD_SIZE (MDINEXTMENU, hmenuIn, 4) + TEST_FIELD_ALIGN (MDINEXTMENU, hmenuIn, 4) + TEST_FIELD_OFFSET(MDINEXTMENU, hmenuIn, 0) + TEST_FIELD_SIZE (MDINEXTMENU, hmenuNext, 4) + TEST_FIELD_ALIGN (MDINEXTMENU, hmenuNext, 4) + TEST_FIELD_OFFSET(MDINEXTMENU, hmenuNext, 4) + TEST_FIELD_SIZE (MDINEXTMENU, hwndNext, 4) + TEST_FIELD_ALIGN (MDINEXTMENU, hwndNext, 4) + TEST_FIELD_OFFSET(MDINEXTMENU, hwndNext, 8) } static void test_pack_MEASUREITEMSTRUCT(void) { /* MEASUREITEMSTRUCT (pack 4) */ - TEST_TYPE(MEASUREITEMSTRUCT, 24, 4); - TEST_FIELD(MEASUREITEMSTRUCT, UINT, CtlType, 0, 4, 4); - TEST_FIELD(MEASUREITEMSTRUCT, UINT, CtlID, 4, 4, 4); - TEST_FIELD(MEASUREITEMSTRUCT, UINT, itemID, 8, 4, 4); - TEST_FIELD(MEASUREITEMSTRUCT, UINT, itemWidth, 12, 4, 4); - TEST_FIELD(MEASUREITEMSTRUCT, UINT, itemHeight, 16, 4, 4); - TEST_FIELD(MEASUREITEMSTRUCT, ULONG_PTR, itemData, 20, 4, 4); + TEST_TYPE_SIZE (MEASUREITEMSTRUCT, 24) + TEST_TYPE_ALIGN (MEASUREITEMSTRUCT, 4) + TEST_FIELD_SIZE (MEASUREITEMSTRUCT, CtlType, 4) + TEST_FIELD_ALIGN (MEASUREITEMSTRUCT, CtlType, 4) + TEST_FIELD_OFFSET(MEASUREITEMSTRUCT, CtlType, 0) + TEST_FIELD_SIZE (MEASUREITEMSTRUCT, CtlID, 4) + TEST_FIELD_ALIGN (MEASUREITEMSTRUCT, CtlID, 4) + TEST_FIELD_OFFSET(MEASUREITEMSTRUCT, CtlID, 4) + TEST_FIELD_SIZE (MEASUREITEMSTRUCT, itemID, 4) + TEST_FIELD_ALIGN (MEASUREITEMSTRUCT, itemID, 4) + TEST_FIELD_OFFSET(MEASUREITEMSTRUCT, itemID, 8) + TEST_FIELD_SIZE (MEASUREITEMSTRUCT, itemWidth, 4) + TEST_FIELD_ALIGN (MEASUREITEMSTRUCT, itemWidth, 4) + TEST_FIELD_OFFSET(MEASUREITEMSTRUCT, itemWidth, 12) + TEST_FIELD_SIZE (MEASUREITEMSTRUCT, itemHeight, 4) + TEST_FIELD_ALIGN (MEASUREITEMSTRUCT, itemHeight, 4) + TEST_FIELD_OFFSET(MEASUREITEMSTRUCT, itemHeight, 16) + TEST_FIELD_SIZE (MEASUREITEMSTRUCT, itemData, 4) + TEST_FIELD_ALIGN (MEASUREITEMSTRUCT, itemData, 4) + TEST_FIELD_OFFSET(MEASUREITEMSTRUCT, itemData, 20) } static void test_pack_MENUINFO(void) { /* MENUINFO (pack 4) */ - TEST_TYPE(MENUINFO, 28, 4); - TEST_FIELD(MENUINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(MENUINFO, DWORD, fMask, 4, 4, 4); - TEST_FIELD(MENUINFO, DWORD, dwStyle, 8, 4, 4); - TEST_FIELD(MENUINFO, UINT, cyMax, 12, 4, 4); - TEST_FIELD(MENUINFO, HBRUSH, hbrBack, 16, 4, 4); - TEST_FIELD(MENUINFO, DWORD, dwContextHelpID, 20, 4, 4); - TEST_FIELD(MENUINFO, ULONG_PTR, dwMenuData, 24, 4, 4); + TEST_TYPE_SIZE (MENUINFO, 28) + TEST_TYPE_ALIGN (MENUINFO, 4) + TEST_FIELD_SIZE (MENUINFO, cbSize, 4) + TEST_FIELD_ALIGN (MENUINFO, cbSize, 4) + TEST_FIELD_OFFSET(MENUINFO, cbSize, 0) + TEST_FIELD_SIZE (MENUINFO, fMask, 4) + TEST_FIELD_ALIGN (MENUINFO, fMask, 4) + TEST_FIELD_OFFSET(MENUINFO, fMask, 4) + TEST_FIELD_SIZE (MENUINFO, dwStyle, 4) + TEST_FIELD_ALIGN (MENUINFO, dwStyle, 4) + TEST_FIELD_OFFSET(MENUINFO, dwStyle, 8) + TEST_FIELD_SIZE (MENUINFO, cyMax, 4) + TEST_FIELD_ALIGN (MENUINFO, cyMax, 4) + TEST_FIELD_OFFSET(MENUINFO, cyMax, 12) + TEST_FIELD_SIZE (MENUINFO, hbrBack, 4) + TEST_FIELD_ALIGN (MENUINFO, hbrBack, 4) + TEST_FIELD_OFFSET(MENUINFO, hbrBack, 16) + TEST_FIELD_SIZE (MENUINFO, dwContextHelpID, 4) + TEST_FIELD_ALIGN (MENUINFO, dwContextHelpID, 4) + TEST_FIELD_OFFSET(MENUINFO, dwContextHelpID, 20) + TEST_FIELD_SIZE (MENUINFO, dwMenuData, 4) + TEST_FIELD_ALIGN (MENUINFO, dwMenuData, 4) + TEST_FIELD_OFFSET(MENUINFO, dwMenuData, 24) } static void test_pack_MENUITEMINFOA(void) { /* MENUITEMINFOA (pack 4) */ - TEST_TYPE(MENUITEMINFOA, 48, 4); - TEST_FIELD(MENUITEMINFOA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(MENUITEMINFOA, UINT, fMask, 4, 4, 4); - TEST_FIELD(MENUITEMINFOA, UINT, fType, 8, 4, 4); - TEST_FIELD(MENUITEMINFOA, UINT, fState, 12, 4, 4); - TEST_FIELD(MENUITEMINFOA, UINT, wID, 16, 4, 4); - TEST_FIELD(MENUITEMINFOA, HMENU, hSubMenu, 20, 4, 4); - TEST_FIELD(MENUITEMINFOA, HBITMAP, hbmpChecked, 24, 4, 4); - TEST_FIELD(MENUITEMINFOA, HBITMAP, hbmpUnchecked, 28, 4, 4); - TEST_FIELD(MENUITEMINFOA, ULONG_PTR, dwItemData, 32, 4, 4); - TEST_FIELD(MENUITEMINFOA, LPSTR, dwTypeData, 36, 4, 4); - TEST_FIELD(MENUITEMINFOA, UINT, cch, 40, 4, 4); - TEST_FIELD(MENUITEMINFOA, HBITMAP, hbmpItem, 44, 4, 4); + TEST_TYPE_SIZE (MENUITEMINFOA, 48) + TEST_TYPE_ALIGN (MENUITEMINFOA, 4) + TEST_FIELD_SIZE (MENUITEMINFOA, cbSize, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, cbSize, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, cbSize, 0) + TEST_FIELD_SIZE (MENUITEMINFOA, fMask, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, fMask, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, fMask, 4) + TEST_FIELD_SIZE (MENUITEMINFOA, fType, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, fType, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, fType, 8) + TEST_FIELD_SIZE (MENUITEMINFOA, fState, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, fState, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, fState, 12) + TEST_FIELD_SIZE (MENUITEMINFOA, wID, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, wID, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, wID, 16) + TEST_FIELD_SIZE (MENUITEMINFOA, hSubMenu, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, hSubMenu, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, hSubMenu, 20) + TEST_FIELD_SIZE (MENUITEMINFOA, hbmpChecked, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, hbmpChecked, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, hbmpChecked, 24) + TEST_FIELD_SIZE (MENUITEMINFOA, hbmpUnchecked, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, hbmpUnchecked, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, hbmpUnchecked, 28) + TEST_FIELD_SIZE (MENUITEMINFOA, dwItemData, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, dwItemData, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, dwItemData, 32) + TEST_FIELD_SIZE (MENUITEMINFOA, dwTypeData, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, dwTypeData, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, dwTypeData, 36) + TEST_FIELD_SIZE (MENUITEMINFOA, cch, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, cch, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, cch, 40) + TEST_FIELD_SIZE (MENUITEMINFOA, hbmpItem, 4) + TEST_FIELD_ALIGN (MENUITEMINFOA, hbmpItem, 4) + TEST_FIELD_OFFSET(MENUITEMINFOA, hbmpItem, 44) } static void test_pack_MENUITEMINFOW(void) { /* MENUITEMINFOW (pack 4) */ - TEST_TYPE(MENUITEMINFOW, 48, 4); - TEST_FIELD(MENUITEMINFOW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(MENUITEMINFOW, UINT, fMask, 4, 4, 4); - TEST_FIELD(MENUITEMINFOW, UINT, fType, 8, 4, 4); - TEST_FIELD(MENUITEMINFOW, UINT, fState, 12, 4, 4); - TEST_FIELD(MENUITEMINFOW, UINT, wID, 16, 4, 4); - TEST_FIELD(MENUITEMINFOW, HMENU, hSubMenu, 20, 4, 4); - TEST_FIELD(MENUITEMINFOW, HBITMAP, hbmpChecked, 24, 4, 4); - TEST_FIELD(MENUITEMINFOW, HBITMAP, hbmpUnchecked, 28, 4, 4); - TEST_FIELD(MENUITEMINFOW, ULONG_PTR, dwItemData, 32, 4, 4); - TEST_FIELD(MENUITEMINFOW, LPWSTR, dwTypeData, 36, 4, 4); - TEST_FIELD(MENUITEMINFOW, UINT, cch, 40, 4, 4); - TEST_FIELD(MENUITEMINFOW, HBITMAP, hbmpItem, 44, 4, 4); + TEST_TYPE_SIZE (MENUITEMINFOW, 48) + TEST_TYPE_ALIGN (MENUITEMINFOW, 4) + TEST_FIELD_SIZE (MENUITEMINFOW, cbSize, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, cbSize, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, cbSize, 0) + TEST_FIELD_SIZE (MENUITEMINFOW, fMask, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, fMask, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, fMask, 4) + TEST_FIELD_SIZE (MENUITEMINFOW, fType, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, fType, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, fType, 8) + TEST_FIELD_SIZE (MENUITEMINFOW, fState, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, fState, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, fState, 12) + TEST_FIELD_SIZE (MENUITEMINFOW, wID, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, wID, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, wID, 16) + TEST_FIELD_SIZE (MENUITEMINFOW, hSubMenu, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, hSubMenu, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, hSubMenu, 20) + TEST_FIELD_SIZE (MENUITEMINFOW, hbmpChecked, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, hbmpChecked, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, hbmpChecked, 24) + TEST_FIELD_SIZE (MENUITEMINFOW, hbmpUnchecked, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, hbmpUnchecked, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, hbmpUnchecked, 28) + TEST_FIELD_SIZE (MENUITEMINFOW, dwItemData, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, dwItemData, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, dwItemData, 32) + TEST_FIELD_SIZE (MENUITEMINFOW, dwTypeData, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, dwTypeData, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, dwTypeData, 36) + TEST_FIELD_SIZE (MENUITEMINFOW, cch, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, cch, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, cch, 40) + TEST_FIELD_SIZE (MENUITEMINFOW, hbmpItem, 4) + TEST_FIELD_ALIGN (MENUITEMINFOW, hbmpItem, 4) + TEST_FIELD_OFFSET(MENUITEMINFOW, hbmpItem, 44) } static void test_pack_MENUITEMTEMPLATE(void) { /* MENUITEMTEMPLATE (pack 4) */ - TEST_TYPE(MENUITEMTEMPLATE, 6, 2); - TEST_FIELD(MENUITEMTEMPLATE, WORD, mtOption, 0, 2, 2); - TEST_FIELD(MENUITEMTEMPLATE, WORD, mtID, 2, 2, 2); - TEST_FIELD(MENUITEMTEMPLATE, WCHAR[1], mtString, 4, 2, 2); + TEST_TYPE_SIZE (MENUITEMTEMPLATE, 6) + TEST_TYPE_ALIGN (MENUITEMTEMPLATE, 2) + TEST_FIELD_SIZE (MENUITEMTEMPLATE, mtOption, 2) + TEST_FIELD_ALIGN (MENUITEMTEMPLATE, mtOption, 2) + TEST_FIELD_OFFSET(MENUITEMTEMPLATE, mtOption, 0) + TEST_FIELD_SIZE (MENUITEMTEMPLATE, mtID, 2) + TEST_FIELD_ALIGN (MENUITEMTEMPLATE, mtID, 2) + TEST_FIELD_OFFSET(MENUITEMTEMPLATE, mtID, 2) + TEST_FIELD_SIZE (MENUITEMTEMPLATE, mtString, 2) + TEST_FIELD_ALIGN (MENUITEMTEMPLATE, mtString, 2) + TEST_FIELD_OFFSET(MENUITEMTEMPLATE, mtString, 4) } static void test_pack_MENUITEMTEMPLATEHEADER(void) { /* MENUITEMTEMPLATEHEADER (pack 4) */ - TEST_TYPE(MENUITEMTEMPLATEHEADER, 4, 2); - TEST_FIELD(MENUITEMTEMPLATEHEADER, WORD, versionNumber, 0, 2, 2); - TEST_FIELD(MENUITEMTEMPLATEHEADER, WORD, offset, 2, 2, 2); + TEST_TYPE_SIZE (MENUITEMTEMPLATEHEADER, 4) + TEST_TYPE_ALIGN (MENUITEMTEMPLATEHEADER, 2) + TEST_FIELD_SIZE (MENUITEMTEMPLATEHEADER, versionNumber, 2) + TEST_FIELD_ALIGN (MENUITEMTEMPLATEHEADER, versionNumber, 2) + TEST_FIELD_OFFSET(MENUITEMTEMPLATEHEADER, versionNumber, 0) + TEST_FIELD_SIZE (MENUITEMTEMPLATEHEADER, offset, 2) + TEST_FIELD_ALIGN (MENUITEMTEMPLATEHEADER, offset, 2) + TEST_FIELD_OFFSET(MENUITEMTEMPLATEHEADER, offset, 2) } static void test_pack_MINIMIZEDMETRICS(void) { /* MINIMIZEDMETRICS (pack 4) */ - TEST_TYPE(MINIMIZEDMETRICS, 20, 4); - TEST_FIELD(MINIMIZEDMETRICS, UINT, cbSize, 0, 4, 4); - TEST_FIELD(MINIMIZEDMETRICS, int, iWidth, 4, 4, 4); - TEST_FIELD(MINIMIZEDMETRICS, int, iHorzGap, 8, 4, 4); - TEST_FIELD(MINIMIZEDMETRICS, int, iVertGap, 12, 4, 4); - TEST_FIELD(MINIMIZEDMETRICS, int, iArrange, 16, 4, 4); + TEST_TYPE_SIZE (MINIMIZEDMETRICS, 20) + TEST_TYPE_ALIGN (MINIMIZEDMETRICS, 4) + TEST_FIELD_SIZE (MINIMIZEDMETRICS, cbSize, 4) + TEST_FIELD_ALIGN (MINIMIZEDMETRICS, cbSize, 4) + TEST_FIELD_OFFSET(MINIMIZEDMETRICS, cbSize, 0) + TEST_FIELD_SIZE (MINIMIZEDMETRICS, iWidth, 4) + TEST_FIELD_ALIGN (MINIMIZEDMETRICS, iWidth, 4) + TEST_FIELD_OFFSET(MINIMIZEDMETRICS, iWidth, 4) + TEST_FIELD_SIZE (MINIMIZEDMETRICS, iHorzGap, 4) + TEST_FIELD_ALIGN (MINIMIZEDMETRICS, iHorzGap, 4) + TEST_FIELD_OFFSET(MINIMIZEDMETRICS, iHorzGap, 8) + TEST_FIELD_SIZE (MINIMIZEDMETRICS, iVertGap, 4) + TEST_FIELD_ALIGN (MINIMIZEDMETRICS, iVertGap, 4) + TEST_FIELD_OFFSET(MINIMIZEDMETRICS, iVertGap, 12) + TEST_FIELD_SIZE (MINIMIZEDMETRICS, iArrange, 4) + TEST_FIELD_ALIGN (MINIMIZEDMETRICS, iArrange, 4) + TEST_FIELD_OFFSET(MINIMIZEDMETRICS, iArrange, 16) } static void test_pack_MINMAXINFO(void) { /* MINMAXINFO (pack 4) */ - TEST_TYPE(MINMAXINFO, 40, 4); - TEST_FIELD(MINMAXINFO, POINT, ptReserved, 0, 8, 4); - TEST_FIELD(MINMAXINFO, POINT, ptMaxSize, 8, 8, 4); - TEST_FIELD(MINMAXINFO, POINT, ptMaxPosition, 16, 8, 4); - TEST_FIELD(MINMAXINFO, POINT, ptMinTrackSize, 24, 8, 4); - TEST_FIELD(MINMAXINFO, POINT, ptMaxTrackSize, 32, 8, 4); + TEST_TYPE_SIZE (MINMAXINFO, 40) + TEST_TYPE_ALIGN (MINMAXINFO, 4) + TEST_FIELD_SIZE (MINMAXINFO, ptReserved, 8) + TEST_FIELD_ALIGN (MINMAXINFO, ptReserved, 4) + TEST_FIELD_OFFSET(MINMAXINFO, ptReserved, 0) + TEST_FIELD_SIZE (MINMAXINFO, ptMaxSize, 8) + TEST_FIELD_ALIGN (MINMAXINFO, ptMaxSize, 4) + TEST_FIELD_OFFSET(MINMAXINFO, ptMaxSize, 8) + TEST_FIELD_SIZE (MINMAXINFO, ptMaxPosition, 8) + TEST_FIELD_ALIGN (MINMAXINFO, ptMaxPosition, 4) + TEST_FIELD_OFFSET(MINMAXINFO, ptMaxPosition, 16) + TEST_FIELD_SIZE (MINMAXINFO, ptMinTrackSize, 8) + TEST_FIELD_ALIGN (MINMAXINFO, ptMinTrackSize, 4) + TEST_FIELD_OFFSET(MINMAXINFO, ptMinTrackSize, 24) + TEST_FIELD_SIZE (MINMAXINFO, ptMaxTrackSize, 8) + TEST_FIELD_ALIGN (MINMAXINFO, ptMaxTrackSize, 4) + TEST_FIELD_OFFSET(MINMAXINFO, ptMaxTrackSize, 32) } static void test_pack_MONITORENUMPROC(void) { /* MONITORENUMPROC */ - TEST_TYPE(MONITORENUMPROC, 4, 4); + TEST_TYPE_SIZE (MONITORENUMPROC, 4) + TEST_TYPE_ALIGN (MONITORENUMPROC, 4) } static void test_pack_MONITORINFO(void) { /* MONITORINFO (pack 4) */ - TEST_TYPE(MONITORINFO, 40, 4); - TEST_FIELD(MONITORINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(MONITORINFO, RECT, rcMonitor, 4, 16, 4); - TEST_FIELD(MONITORINFO, RECT, rcWork, 20, 16, 4); - TEST_FIELD(MONITORINFO, DWORD, dwFlags, 36, 4, 4); + TEST_TYPE_SIZE (MONITORINFO, 40) + TEST_TYPE_ALIGN (MONITORINFO, 4) + TEST_FIELD_SIZE (MONITORINFO, cbSize, 4) + TEST_FIELD_ALIGN (MONITORINFO, cbSize, 4) + TEST_FIELD_OFFSET(MONITORINFO, cbSize, 0) + TEST_FIELD_SIZE (MONITORINFO, rcMonitor, 16) + TEST_FIELD_ALIGN (MONITORINFO, rcMonitor, 4) + TEST_FIELD_OFFSET(MONITORINFO, rcMonitor, 4) + TEST_FIELD_SIZE (MONITORINFO, rcWork, 16) + TEST_FIELD_ALIGN (MONITORINFO, rcWork, 4) + TEST_FIELD_OFFSET(MONITORINFO, rcWork, 20) + TEST_FIELD_SIZE (MONITORINFO, dwFlags, 4) + TEST_FIELD_ALIGN (MONITORINFO, dwFlags, 4) + TEST_FIELD_OFFSET(MONITORINFO, dwFlags, 36) } static void test_pack_MONITORINFOEXA(void) { /* MONITORINFOEXA (pack 4) */ - TEST_TYPE(MONITORINFOEXA, 72, 4); - TEST_FIELD(MONITORINFOEXA, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(MONITORINFOEXA, RECT, rcMonitor, 4, 16, 4); - TEST_FIELD(MONITORINFOEXA, RECT, rcWork, 20, 16, 4); - TEST_FIELD(MONITORINFOEXA, DWORD, dwFlags, 36, 4, 4); - TEST_FIELD(MONITORINFOEXA, CHAR[CCHDEVICENAME], szDevice, 40, 32, 1); + TEST_TYPE_SIZE (MONITORINFOEXA, 72) + TEST_TYPE_ALIGN (MONITORINFOEXA, 4) + TEST_FIELD_SIZE (MONITORINFOEXA, cbSize, 4) + TEST_FIELD_ALIGN (MONITORINFOEXA, cbSize, 4) + TEST_FIELD_OFFSET(MONITORINFOEXA, cbSize, 0) + TEST_FIELD_SIZE (MONITORINFOEXA, rcMonitor, 16) + TEST_FIELD_ALIGN (MONITORINFOEXA, rcMonitor, 4) + TEST_FIELD_OFFSET(MONITORINFOEXA, rcMonitor, 4) + TEST_FIELD_SIZE (MONITORINFOEXA, rcWork, 16) + TEST_FIELD_ALIGN (MONITORINFOEXA, rcWork, 4) + TEST_FIELD_OFFSET(MONITORINFOEXA, rcWork, 20) + TEST_FIELD_SIZE (MONITORINFOEXA, dwFlags, 4) + TEST_FIELD_ALIGN (MONITORINFOEXA, dwFlags, 4) + TEST_FIELD_OFFSET(MONITORINFOEXA, dwFlags, 36) + TEST_FIELD_SIZE (MONITORINFOEXA, szDevice, 32) + TEST_FIELD_ALIGN (MONITORINFOEXA, szDevice, 1) + TEST_FIELD_OFFSET(MONITORINFOEXA, szDevice, 40) } static void test_pack_MONITORINFOEXW(void) { /* MONITORINFOEXW (pack 4) */ - TEST_TYPE(MONITORINFOEXW, 104, 4); - TEST_FIELD(MONITORINFOEXW, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(MONITORINFOEXW, RECT, rcMonitor, 4, 16, 4); - TEST_FIELD(MONITORINFOEXW, RECT, rcWork, 20, 16, 4); - TEST_FIELD(MONITORINFOEXW, DWORD, dwFlags, 36, 4, 4); - TEST_FIELD(MONITORINFOEXW, WCHAR[CCHDEVICENAME], szDevice, 40, 64, 2); + TEST_TYPE_SIZE (MONITORINFOEXW, 104) + TEST_TYPE_ALIGN (MONITORINFOEXW, 4) + TEST_FIELD_SIZE (MONITORINFOEXW, cbSize, 4) + TEST_FIELD_ALIGN (MONITORINFOEXW, cbSize, 4) + TEST_FIELD_OFFSET(MONITORINFOEXW, cbSize, 0) + TEST_FIELD_SIZE (MONITORINFOEXW, rcMonitor, 16) + TEST_FIELD_ALIGN (MONITORINFOEXW, rcMonitor, 4) + TEST_FIELD_OFFSET(MONITORINFOEXW, rcMonitor, 4) + TEST_FIELD_SIZE (MONITORINFOEXW, rcWork, 16) + TEST_FIELD_ALIGN (MONITORINFOEXW, rcWork, 4) + TEST_FIELD_OFFSET(MONITORINFOEXW, rcWork, 20) + TEST_FIELD_SIZE (MONITORINFOEXW, dwFlags, 4) + TEST_FIELD_ALIGN (MONITORINFOEXW, dwFlags, 4) + TEST_FIELD_OFFSET(MONITORINFOEXW, dwFlags, 36) + TEST_FIELD_SIZE (MONITORINFOEXW, szDevice, 64) + TEST_FIELD_ALIGN (MONITORINFOEXW, szDevice, 2) + TEST_FIELD_OFFSET(MONITORINFOEXW, szDevice, 40) } static void test_pack_MOUSEHOOKSTRUCT(void) { /* MOUSEHOOKSTRUCT (pack 4) */ - TEST_TYPE(MOUSEHOOKSTRUCT, 20, 4); - TEST_FIELD(MOUSEHOOKSTRUCT, POINT, pt, 0, 8, 4); - TEST_FIELD(MOUSEHOOKSTRUCT, HWND, hwnd, 8, 4, 4); - TEST_FIELD(MOUSEHOOKSTRUCT, UINT, wHitTestCode, 12, 4, 4); - TEST_FIELD(MOUSEHOOKSTRUCT, ULONG_PTR, dwExtraInfo, 16, 4, 4); + TEST_TYPE_SIZE (MOUSEHOOKSTRUCT, 20) + TEST_TYPE_ALIGN (MOUSEHOOKSTRUCT, 4) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCT, pt, 8) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCT, pt, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCT, pt, 0) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCT, hwnd, 4) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCT, hwnd, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCT, hwnd, 8) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCT, wHitTestCode, 4) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCT, wHitTestCode, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCT, wHitTestCode, 12) + TEST_FIELD_SIZE (MOUSEHOOKSTRUCT, dwExtraInfo, 4) + TEST_FIELD_ALIGN (MOUSEHOOKSTRUCT, dwExtraInfo, 4) + TEST_FIELD_OFFSET(MOUSEHOOKSTRUCT, dwExtraInfo, 16) } static void test_pack_MOUSEINPUT(void) { /* MOUSEINPUT (pack 4) */ - TEST_TYPE(MOUSEINPUT, 24, 4); - TEST_FIELD(MOUSEINPUT, LONG, dx, 0, 4, 4); - TEST_FIELD(MOUSEINPUT, LONG, dy, 4, 4, 4); - TEST_FIELD(MOUSEINPUT, DWORD, mouseData, 8, 4, 4); - TEST_FIELD(MOUSEINPUT, DWORD, dwFlags, 12, 4, 4); - TEST_FIELD(MOUSEINPUT, DWORD, time, 16, 4, 4); - TEST_FIELD(MOUSEINPUT, ULONG_PTR, dwExtraInfo, 20, 4, 4); + TEST_TYPE_SIZE (MOUSEINPUT, 24) + TEST_TYPE_ALIGN (MOUSEINPUT, 4) + TEST_FIELD_SIZE (MOUSEINPUT, dx, 4) + TEST_FIELD_ALIGN (MOUSEINPUT, dx, 4) + TEST_FIELD_OFFSET(MOUSEINPUT, dx, 0) + TEST_FIELD_SIZE (MOUSEINPUT, dy, 4) + TEST_FIELD_ALIGN (MOUSEINPUT, dy, 4) + TEST_FIELD_OFFSET(MOUSEINPUT, dy, 4) + TEST_FIELD_SIZE (MOUSEINPUT, mouseData, 4) + TEST_FIELD_ALIGN (MOUSEINPUT, mouseData, 4) + TEST_FIELD_OFFSET(MOUSEINPUT, mouseData, 8) + TEST_FIELD_SIZE (MOUSEINPUT, dwFlags, 4) + TEST_FIELD_ALIGN (MOUSEINPUT, dwFlags, 4) + TEST_FIELD_OFFSET(MOUSEINPUT, dwFlags, 12) + TEST_FIELD_SIZE (MOUSEINPUT, time, 4) + TEST_FIELD_ALIGN (MOUSEINPUT, time, 4) + TEST_FIELD_OFFSET(MOUSEINPUT, time, 16) + TEST_FIELD_SIZE (MOUSEINPUT, dwExtraInfo, 4) + TEST_FIELD_ALIGN (MOUSEINPUT, dwExtraInfo, 4) + TEST_FIELD_OFFSET(MOUSEINPUT, dwExtraInfo, 20) } static void test_pack_MOUSEKEYS(void) { /* MOUSEKEYS (pack 4) */ - TEST_TYPE(MOUSEKEYS, 28, 4); - TEST_FIELD(MOUSEKEYS, UINT, cbSize, 0, 4, 4); - TEST_FIELD(MOUSEKEYS, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(MOUSEKEYS, DWORD, iMaxSpeed, 8, 4, 4); - TEST_FIELD(MOUSEKEYS, DWORD, iTimeToMaxSpeed, 12, 4, 4); - TEST_FIELD(MOUSEKEYS, DWORD, iCtrlSpeed, 16, 4, 4); - TEST_FIELD(MOUSEKEYS, DWORD, dwReserved1, 20, 4, 4); - TEST_FIELD(MOUSEKEYS, DWORD, dwReserved2, 24, 4, 4); + TEST_TYPE_SIZE (MOUSEKEYS, 28) + TEST_TYPE_ALIGN (MOUSEKEYS, 4) + TEST_FIELD_SIZE (MOUSEKEYS, cbSize, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, cbSize, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, cbSize, 0) + TEST_FIELD_SIZE (MOUSEKEYS, dwFlags, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, dwFlags, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, dwFlags, 4) + TEST_FIELD_SIZE (MOUSEKEYS, iMaxSpeed, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, iMaxSpeed, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, iMaxSpeed, 8) + TEST_FIELD_SIZE (MOUSEKEYS, iTimeToMaxSpeed, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, iTimeToMaxSpeed, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, iTimeToMaxSpeed, 12) + TEST_FIELD_SIZE (MOUSEKEYS, iCtrlSpeed, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, iCtrlSpeed, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, iCtrlSpeed, 16) + TEST_FIELD_SIZE (MOUSEKEYS, dwReserved1, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, dwReserved1, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, dwReserved1, 20) + TEST_FIELD_SIZE (MOUSEKEYS, dwReserved2, 4) + TEST_FIELD_ALIGN (MOUSEKEYS, dwReserved2, 4) + TEST_FIELD_OFFSET(MOUSEKEYS, dwReserved2, 24) } static void test_pack_MSG(void) { /* MSG (pack 4) */ - TEST_TYPE(MSG, 28, 4); - TEST_FIELD(MSG, HWND, hwnd, 0, 4, 4); - TEST_FIELD(MSG, UINT, message, 4, 4, 4); - TEST_FIELD(MSG, WPARAM, wParam, 8, 4, 4); - TEST_FIELD(MSG, LPARAM, lParam, 12, 4, 4); - TEST_FIELD(MSG, DWORD, time, 16, 4, 4); - TEST_FIELD(MSG, POINT, pt, 20, 8, 4); + TEST_TYPE_SIZE (MSG, 28) + TEST_TYPE_ALIGN (MSG, 4) + TEST_FIELD_SIZE (MSG, hwnd, 4) + TEST_FIELD_ALIGN (MSG, hwnd, 4) + TEST_FIELD_OFFSET(MSG, hwnd, 0) + TEST_FIELD_SIZE (MSG, message, 4) + TEST_FIELD_ALIGN (MSG, message, 4) + TEST_FIELD_OFFSET(MSG, message, 4) + TEST_FIELD_SIZE (MSG, wParam, 4) + TEST_FIELD_ALIGN (MSG, wParam, 4) + TEST_FIELD_OFFSET(MSG, wParam, 8) + TEST_FIELD_SIZE (MSG, lParam, 4) + TEST_FIELD_ALIGN (MSG, lParam, 4) + TEST_FIELD_OFFSET(MSG, lParam, 12) + TEST_FIELD_SIZE (MSG, time, 4) + TEST_FIELD_ALIGN (MSG, time, 4) + TEST_FIELD_OFFSET(MSG, time, 16) + TEST_FIELD_SIZE (MSG, pt, 8) + TEST_FIELD_ALIGN (MSG, pt, 4) + TEST_FIELD_OFFSET(MSG, pt, 20) } static void test_pack_MSGBOXCALLBACK(void) { /* MSGBOXCALLBACK */ - TEST_TYPE(MSGBOXCALLBACK, 4, 4); + TEST_TYPE_SIZE (MSGBOXCALLBACK, 4) + TEST_TYPE_ALIGN (MSGBOXCALLBACK, 4) } static void test_pack_MSGBOXPARAMSA(void) { /* MSGBOXPARAMSA (pack 4) */ - TEST_TYPE(MSGBOXPARAMSA, 40, 4); - TEST_FIELD(MSGBOXPARAMSA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, HWND, hwndOwner, 4, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, HINSTANCE, hInstance, 8, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, LPCSTR, lpszText, 12, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, LPCSTR, lpszCaption, 16, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, DWORD, dwStyle, 20, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, LPCSTR, lpszIcon, 24, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, DWORD_PTR, dwContextHelpId, 28, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, MSGBOXCALLBACK, lpfnMsgBoxCallback, 32, 4, 4); - TEST_FIELD(MSGBOXPARAMSA, DWORD, dwLanguageId, 36, 4, 4); + TEST_TYPE_SIZE (MSGBOXPARAMSA, 40) + TEST_TYPE_ALIGN (MSGBOXPARAMSA, 4) + TEST_FIELD_SIZE (MSGBOXPARAMSA, cbSize, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, cbSize, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, cbSize, 0) + TEST_FIELD_SIZE (MSGBOXPARAMSA, hwndOwner, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, hwndOwner, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, hwndOwner, 4) + TEST_FIELD_SIZE (MSGBOXPARAMSA, hInstance, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, hInstance, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, hInstance, 8) + TEST_FIELD_SIZE (MSGBOXPARAMSA, lpszText, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, lpszText, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, lpszText, 12) + TEST_FIELD_SIZE (MSGBOXPARAMSA, lpszCaption, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, lpszCaption, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, lpszCaption, 16) + TEST_FIELD_SIZE (MSGBOXPARAMSA, dwStyle, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, dwStyle, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, dwStyle, 20) + TEST_FIELD_SIZE (MSGBOXPARAMSA, lpszIcon, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, lpszIcon, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, lpszIcon, 24) + TEST_FIELD_SIZE (MSGBOXPARAMSA, dwContextHelpId, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, dwContextHelpId, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, dwContextHelpId, 28) + TEST_FIELD_SIZE (MSGBOXPARAMSA, lpfnMsgBoxCallback, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, lpfnMsgBoxCallback, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, lpfnMsgBoxCallback, 32) + TEST_FIELD_SIZE (MSGBOXPARAMSA, dwLanguageId, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSA, dwLanguageId, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSA, dwLanguageId, 36) } static void test_pack_MSGBOXPARAMSW(void) { /* MSGBOXPARAMSW (pack 4) */ - TEST_TYPE(MSGBOXPARAMSW, 40, 4); - TEST_FIELD(MSGBOXPARAMSW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, HWND, hwndOwner, 4, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, HINSTANCE, hInstance, 8, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, LPCWSTR, lpszText, 12, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, LPCWSTR, lpszCaption, 16, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, DWORD, dwStyle, 20, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, LPCWSTR, lpszIcon, 24, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, DWORD_PTR, dwContextHelpId, 28, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, MSGBOXCALLBACK, lpfnMsgBoxCallback, 32, 4, 4); - TEST_FIELD(MSGBOXPARAMSW, DWORD, dwLanguageId, 36, 4, 4); + TEST_TYPE_SIZE (MSGBOXPARAMSW, 40) + TEST_TYPE_ALIGN (MSGBOXPARAMSW, 4) + TEST_FIELD_SIZE (MSGBOXPARAMSW, cbSize, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, cbSize, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, cbSize, 0) + TEST_FIELD_SIZE (MSGBOXPARAMSW, hwndOwner, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, hwndOwner, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, hwndOwner, 4) + TEST_FIELD_SIZE (MSGBOXPARAMSW, hInstance, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, hInstance, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, hInstance, 8) + TEST_FIELD_SIZE (MSGBOXPARAMSW, lpszText, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, lpszText, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, lpszText, 12) + TEST_FIELD_SIZE (MSGBOXPARAMSW, lpszCaption, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, lpszCaption, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, lpszCaption, 16) + TEST_FIELD_SIZE (MSGBOXPARAMSW, dwStyle, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, dwStyle, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, dwStyle, 20) + TEST_FIELD_SIZE (MSGBOXPARAMSW, lpszIcon, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, lpszIcon, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, lpszIcon, 24) + TEST_FIELD_SIZE (MSGBOXPARAMSW, dwContextHelpId, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, dwContextHelpId, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, dwContextHelpId, 28) + TEST_FIELD_SIZE (MSGBOXPARAMSW, lpfnMsgBoxCallback, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, lpfnMsgBoxCallback, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, lpfnMsgBoxCallback, 32) + TEST_FIELD_SIZE (MSGBOXPARAMSW, dwLanguageId, 4) + TEST_FIELD_ALIGN (MSGBOXPARAMSW, dwLanguageId, 4) + TEST_FIELD_OFFSET(MSGBOXPARAMSW, dwLanguageId, 36) } static void test_pack_MSLLHOOKSTRUCT(void) { /* MSLLHOOKSTRUCT (pack 4) */ - TEST_TYPE(MSLLHOOKSTRUCT, 24, 4); - TEST_FIELD(MSLLHOOKSTRUCT, POINT, pt, 0, 8, 4); - TEST_FIELD(MSLLHOOKSTRUCT, DWORD, mouseData, 8, 4, 4); - TEST_FIELD(MSLLHOOKSTRUCT, DWORD, flags, 12, 4, 4); - TEST_FIELD(MSLLHOOKSTRUCT, DWORD, time, 16, 4, 4); - TEST_FIELD(MSLLHOOKSTRUCT, ULONG_PTR, dwExtraInfo, 20, 4, 4); + TEST_TYPE_SIZE (MSLLHOOKSTRUCT, 24) + TEST_TYPE_ALIGN (MSLLHOOKSTRUCT, 4) + TEST_FIELD_SIZE (MSLLHOOKSTRUCT, pt, 8) + TEST_FIELD_ALIGN (MSLLHOOKSTRUCT, pt, 4) + TEST_FIELD_OFFSET(MSLLHOOKSTRUCT, pt, 0) + TEST_FIELD_SIZE (MSLLHOOKSTRUCT, mouseData, 4) + TEST_FIELD_ALIGN (MSLLHOOKSTRUCT, mouseData, 4) + TEST_FIELD_OFFSET(MSLLHOOKSTRUCT, mouseData, 8) + TEST_FIELD_SIZE (MSLLHOOKSTRUCT, flags, 4) + TEST_FIELD_ALIGN (MSLLHOOKSTRUCT, flags, 4) + TEST_FIELD_OFFSET(MSLLHOOKSTRUCT, flags, 12) + TEST_FIELD_SIZE (MSLLHOOKSTRUCT, time, 4) + TEST_FIELD_ALIGN (MSLLHOOKSTRUCT, time, 4) + TEST_FIELD_OFFSET(MSLLHOOKSTRUCT, time, 16) + TEST_FIELD_SIZE (MSLLHOOKSTRUCT, dwExtraInfo, 4) + TEST_FIELD_ALIGN (MSLLHOOKSTRUCT, dwExtraInfo, 4) + TEST_FIELD_OFFSET(MSLLHOOKSTRUCT, dwExtraInfo, 20) } static void test_pack_MULTIKEYHELPA(void) { /* MULTIKEYHELPA (pack 4) */ - TEST_TYPE(MULTIKEYHELPA, 8, 4); - TEST_FIELD(MULTIKEYHELPA, DWORD, mkSize, 0, 4, 4); - TEST_FIELD(MULTIKEYHELPA, CHAR, mkKeylist, 4, 1, 1); - TEST_FIELD(MULTIKEYHELPA, CHAR[1], szKeyphrase, 5, 1, 1); + TEST_TYPE_SIZE (MULTIKEYHELPA, 8) + TEST_TYPE_ALIGN (MULTIKEYHELPA, 4) + TEST_FIELD_SIZE (MULTIKEYHELPA, mkSize, 4) + TEST_FIELD_ALIGN (MULTIKEYHELPA, mkSize, 4) + TEST_FIELD_OFFSET(MULTIKEYHELPA, mkSize, 0) + TEST_FIELD_SIZE (MULTIKEYHELPA, mkKeylist, 1) + TEST_FIELD_ALIGN (MULTIKEYHELPA, mkKeylist, 1) + TEST_FIELD_OFFSET(MULTIKEYHELPA, mkKeylist, 4) + TEST_FIELD_SIZE (MULTIKEYHELPA, szKeyphrase, 1) + TEST_FIELD_ALIGN (MULTIKEYHELPA, szKeyphrase, 1) + TEST_FIELD_OFFSET(MULTIKEYHELPA, szKeyphrase, 5) } static void test_pack_MULTIKEYHELPW(void) { /* MULTIKEYHELPW (pack 4) */ - TEST_TYPE(MULTIKEYHELPW, 8, 4); - TEST_FIELD(MULTIKEYHELPW, DWORD, mkSize, 0, 4, 4); - TEST_FIELD(MULTIKEYHELPW, WCHAR, mkKeylist, 4, 2, 2); - TEST_FIELD(MULTIKEYHELPW, WCHAR[1], szKeyphrase, 6, 2, 2); + TEST_TYPE_SIZE (MULTIKEYHELPW, 8) + TEST_TYPE_ALIGN (MULTIKEYHELPW, 4) + TEST_FIELD_SIZE (MULTIKEYHELPW, mkSize, 4) + TEST_FIELD_ALIGN (MULTIKEYHELPW, mkSize, 4) + TEST_FIELD_OFFSET(MULTIKEYHELPW, mkSize, 0) + TEST_FIELD_SIZE (MULTIKEYHELPW, mkKeylist, 2) + TEST_FIELD_ALIGN (MULTIKEYHELPW, mkKeylist, 2) + TEST_FIELD_OFFSET(MULTIKEYHELPW, mkKeylist, 4) + TEST_FIELD_SIZE (MULTIKEYHELPW, szKeyphrase, 2) + TEST_FIELD_ALIGN (MULTIKEYHELPW, szKeyphrase, 2) + TEST_FIELD_OFFSET(MULTIKEYHELPW, szKeyphrase, 6) } static void test_pack_NAMEENUMPROCA(void) { /* NAMEENUMPROCA */ - TEST_TYPE(NAMEENUMPROCA, 4, 4); + TEST_TYPE_SIZE (NAMEENUMPROCA, 4) + TEST_TYPE_ALIGN (NAMEENUMPROCA, 4) } static void test_pack_NAMEENUMPROCW(void) { /* NAMEENUMPROCW */ - TEST_TYPE(NAMEENUMPROCW, 4, 4); + TEST_TYPE_SIZE (NAMEENUMPROCW, 4) + TEST_TYPE_ALIGN (NAMEENUMPROCW, 4) } static void test_pack_NCCALCSIZE_PARAMS(void) { /* NCCALCSIZE_PARAMS (pack 4) */ - TEST_TYPE(NCCALCSIZE_PARAMS, 52, 4); - TEST_FIELD(NCCALCSIZE_PARAMS, RECT[3], rgrc, 0, 48, 4); - TEST_FIELD(NCCALCSIZE_PARAMS, WINDOWPOS *, lppos, 48, 4, 4); + TEST_TYPE_SIZE (NCCALCSIZE_PARAMS, 52) + TEST_TYPE_ALIGN (NCCALCSIZE_PARAMS, 4) + TEST_FIELD_SIZE (NCCALCSIZE_PARAMS, rgrc, 48) + TEST_FIELD_ALIGN (NCCALCSIZE_PARAMS, rgrc, 4) + TEST_FIELD_OFFSET(NCCALCSIZE_PARAMS, rgrc, 0) + TEST_FIELD_SIZE (NCCALCSIZE_PARAMS, lppos, 4) + TEST_FIELD_ALIGN (NCCALCSIZE_PARAMS, lppos, 4) + TEST_FIELD_OFFSET(NCCALCSIZE_PARAMS, lppos, 48) } static void test_pack_NMHDR(void) { /* NMHDR (pack 4) */ - TEST_TYPE(NMHDR, 12, 4); - TEST_FIELD(NMHDR, HWND, hwndFrom, 0, 4, 4); - TEST_FIELD(NMHDR, UINT_PTR, idFrom, 4, 4, 4); - TEST_FIELD(NMHDR, UINT, code, 8, 4, 4); + TEST_TYPE_SIZE (NMHDR, 12) + TEST_TYPE_ALIGN (NMHDR, 4) + TEST_FIELD_SIZE (NMHDR, hwndFrom, 4) + TEST_FIELD_ALIGN (NMHDR, hwndFrom, 4) + TEST_FIELD_OFFSET(NMHDR, hwndFrom, 0) + TEST_FIELD_SIZE (NMHDR, idFrom, 4) + TEST_FIELD_ALIGN (NMHDR, idFrom, 4) + TEST_FIELD_OFFSET(NMHDR, idFrom, 4) + TEST_FIELD_SIZE (NMHDR, code, 4) + TEST_FIELD_ALIGN (NMHDR, code, 4) + TEST_FIELD_OFFSET(NMHDR, code, 8) } static void test_pack_NONCLIENTMETRICSA(void) { /* NONCLIENTMETRICSA (pack 4) */ - TEST_TYPE(NONCLIENTMETRICSA, 340, 4); - TEST_FIELD(NONCLIENTMETRICSA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iBorderWidth, 4, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iScrollWidth, 8, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iScrollHeight, 12, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iCaptionWidth, 16, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iCaptionHeight, 20, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, LOGFONTA, lfCaptionFont, 24, 60, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iSmCaptionWidth, 84, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iSmCaptionHeight, 88, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, LOGFONTA, lfSmCaptionFont, 92, 60, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iMenuWidth, 152, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, INT, iMenuHeight, 156, 4, 4); - TEST_FIELD(NONCLIENTMETRICSA, LOGFONTA, lfMenuFont, 160, 60, 4); - TEST_FIELD(NONCLIENTMETRICSA, LOGFONTA, lfStatusFont, 220, 60, 4); - TEST_FIELD(NONCLIENTMETRICSA, LOGFONTA, lfMessageFont, 280, 60, 4); + TEST_TYPE_SIZE (NONCLIENTMETRICSA, 340) + TEST_TYPE_ALIGN (NONCLIENTMETRICSA, 4) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, cbSize, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, cbSize, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, cbSize, 0) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iBorderWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iBorderWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iBorderWidth, 4) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iScrollWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iScrollWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iScrollWidth, 8) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iScrollHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iScrollHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iScrollHeight, 12) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iCaptionWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iCaptionWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iCaptionWidth, 16) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iCaptionHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iCaptionHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iCaptionHeight, 20) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfCaptionFont, 60) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfCaptionFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfCaptionFont, 24) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iSmCaptionWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iSmCaptionWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iSmCaptionWidth, 84) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iSmCaptionHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iSmCaptionHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iSmCaptionHeight, 88) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfSmCaptionFont, 60) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfSmCaptionFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfSmCaptionFont, 92) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iMenuWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iMenuWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iMenuWidth, 152) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iMenuHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iMenuHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iMenuHeight, 156) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfMenuFont, 60) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfMenuFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfMenuFont, 160) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfStatusFont, 60) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfStatusFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfStatusFont, 220) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfMessageFont, 60) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfMessageFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfMessageFont, 280) } static void test_pack_NONCLIENTMETRICSW(void) { /* NONCLIENTMETRICSW (pack 4) */ - TEST_TYPE(NONCLIENTMETRICSW, 500, 4); - TEST_FIELD(NONCLIENTMETRICSW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iBorderWidth, 4, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iScrollWidth, 8, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iScrollHeight, 12, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iCaptionWidth, 16, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iCaptionHeight, 20, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, LOGFONTW, lfCaptionFont, 24, 92, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iSmCaptionWidth, 116, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iSmCaptionHeight, 120, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, LOGFONTW, lfSmCaptionFont, 124, 92, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iMenuWidth, 216, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, INT, iMenuHeight, 220, 4, 4); - TEST_FIELD(NONCLIENTMETRICSW, LOGFONTW, lfMenuFont, 224, 92, 4); - TEST_FIELD(NONCLIENTMETRICSW, LOGFONTW, lfStatusFont, 316, 92, 4); - TEST_FIELD(NONCLIENTMETRICSW, LOGFONTW, lfMessageFont, 408, 92, 4); + TEST_TYPE_SIZE (NONCLIENTMETRICSW, 500) + TEST_TYPE_ALIGN (NONCLIENTMETRICSW, 4) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, cbSize, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, cbSize, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, cbSize, 0) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iBorderWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iBorderWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iBorderWidth, 4) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iScrollWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iScrollWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iScrollWidth, 8) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iScrollHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iScrollHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iScrollHeight, 12) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iCaptionWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iCaptionWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iCaptionWidth, 16) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iCaptionHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iCaptionHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iCaptionHeight, 20) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfCaptionFont, 92) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfCaptionFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfCaptionFont, 24) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iSmCaptionWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iSmCaptionWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iSmCaptionWidth, 116) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iSmCaptionHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iSmCaptionHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iSmCaptionHeight, 120) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfSmCaptionFont, 92) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfSmCaptionFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfSmCaptionFont, 124) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iMenuWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iMenuWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iMenuWidth, 216) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iMenuHeight, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iMenuHeight, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iMenuHeight, 220) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfMenuFont, 92) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfMenuFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfMenuFont, 224) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfStatusFont, 92) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfStatusFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfStatusFont, 316) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfMessageFont, 92) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfMessageFont, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfMessageFont, 408) } static void test_pack_PAINTSTRUCT(void) { /* PAINTSTRUCT (pack 4) */ - TEST_TYPE(PAINTSTRUCT, 64, 4); - TEST_FIELD(PAINTSTRUCT, HDC, hdc, 0, 4, 4); - TEST_FIELD(PAINTSTRUCT, BOOL, fErase, 4, 4, 4); - TEST_FIELD(PAINTSTRUCT, RECT, rcPaint, 8, 16, 4); - TEST_FIELD(PAINTSTRUCT, BOOL, fRestore, 24, 4, 4); - TEST_FIELD(PAINTSTRUCT, BOOL, fIncUpdate, 28, 4, 4); - TEST_FIELD(PAINTSTRUCT, BYTE[32], rgbReserved, 32, 32, 1); + TEST_TYPE_SIZE (PAINTSTRUCT, 64) + TEST_TYPE_ALIGN (PAINTSTRUCT, 4) + TEST_FIELD_SIZE (PAINTSTRUCT, hdc, 4) + TEST_FIELD_ALIGN (PAINTSTRUCT, hdc, 4) + TEST_FIELD_OFFSET(PAINTSTRUCT, hdc, 0) + TEST_FIELD_SIZE (PAINTSTRUCT, fErase, 4) + TEST_FIELD_ALIGN (PAINTSTRUCT, fErase, 4) + TEST_FIELD_OFFSET(PAINTSTRUCT, fErase, 4) + TEST_FIELD_SIZE (PAINTSTRUCT, rcPaint, 16) + TEST_FIELD_ALIGN (PAINTSTRUCT, rcPaint, 4) + TEST_FIELD_OFFSET(PAINTSTRUCT, rcPaint, 8) + TEST_FIELD_SIZE (PAINTSTRUCT, fRestore, 4) + TEST_FIELD_ALIGN (PAINTSTRUCT, fRestore, 4) + TEST_FIELD_OFFSET(PAINTSTRUCT, fRestore, 24) + TEST_FIELD_SIZE (PAINTSTRUCT, fIncUpdate, 4) + TEST_FIELD_ALIGN (PAINTSTRUCT, fIncUpdate, 4) + TEST_FIELD_OFFSET(PAINTSTRUCT, fIncUpdate, 28) + TEST_FIELD_SIZE (PAINTSTRUCT, rgbReserved, 32) + TEST_FIELD_ALIGN (PAINTSTRUCT, rgbReserved, 1) + TEST_FIELD_OFFSET(PAINTSTRUCT, rgbReserved, 32) } static void test_pack_PCOMBOBOXINFO(void) { /* PCOMBOBOXINFO */ - TEST_TYPE(PCOMBOBOXINFO, 4, 4); - TEST_TYPE_POINTER(PCOMBOBOXINFO, 52, 4); + TEST_TYPE_SIZE (PCOMBOBOXINFO, 4) + TEST_TYPE_ALIGN (PCOMBOBOXINFO, 4) + TEST_TARGET_SIZE (PCOMBOBOXINFO, 52) + TEST_TARGET_ALIGN(PCOMBOBOXINFO, 4) } static void test_pack_PCOMPAREITEMSTRUCT(void) { /* PCOMPAREITEMSTRUCT */ - TEST_TYPE(PCOMPAREITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(PCOMPAREITEMSTRUCT, 32, 4); + TEST_TYPE_SIZE (PCOMPAREITEMSTRUCT, 4) + TEST_TYPE_ALIGN (PCOMPAREITEMSTRUCT, 4) + TEST_TARGET_SIZE (PCOMPAREITEMSTRUCT, 32) + TEST_TARGET_ALIGN(PCOMPAREITEMSTRUCT, 4) } static void test_pack_PCOPYDATASTRUCT(void) { /* PCOPYDATASTRUCT */ - TEST_TYPE(PCOPYDATASTRUCT, 4, 4); - TEST_TYPE_POINTER(PCOPYDATASTRUCT, 12, 4); + TEST_TYPE_SIZE (PCOPYDATASTRUCT, 4) + TEST_TYPE_ALIGN (PCOPYDATASTRUCT, 4) + TEST_TARGET_SIZE (PCOPYDATASTRUCT, 12) + TEST_TARGET_ALIGN(PCOPYDATASTRUCT, 4) } static void test_pack_PCURSORINFO(void) { /* PCURSORINFO */ - TEST_TYPE(PCURSORINFO, 4, 4); - TEST_TYPE_POINTER(PCURSORINFO, 20, 4); + TEST_TYPE_SIZE (PCURSORINFO, 4) + TEST_TYPE_ALIGN (PCURSORINFO, 4) + TEST_TARGET_SIZE (PCURSORINFO, 20) + TEST_TARGET_ALIGN(PCURSORINFO, 4) } static void test_pack_PCWPRETSTRUCT(void) { /* PCWPRETSTRUCT */ - TEST_TYPE(PCWPRETSTRUCT, 4, 4); - TEST_TYPE_POINTER(PCWPRETSTRUCT, 20, 4); + TEST_TYPE_SIZE (PCWPRETSTRUCT, 4) + TEST_TYPE_ALIGN (PCWPRETSTRUCT, 4) + TEST_TARGET_SIZE (PCWPRETSTRUCT, 20) + TEST_TARGET_ALIGN(PCWPRETSTRUCT, 4) } static void test_pack_PCWPSTRUCT(void) { /* PCWPSTRUCT */ - TEST_TYPE(PCWPSTRUCT, 4, 4); - TEST_TYPE_POINTER(PCWPSTRUCT, 16, 4); + TEST_TYPE_SIZE (PCWPSTRUCT, 4) + TEST_TYPE_ALIGN (PCWPSTRUCT, 4) + TEST_TARGET_SIZE (PCWPSTRUCT, 16) + TEST_TARGET_ALIGN(PCWPSTRUCT, 4) } static void test_pack_PDEBUGHOOKINFO(void) { /* PDEBUGHOOKINFO */ - TEST_TYPE(PDEBUGHOOKINFO, 4, 4); - TEST_TYPE_POINTER(PDEBUGHOOKINFO, 20, 4); + TEST_TYPE_SIZE (PDEBUGHOOKINFO, 4) + TEST_TYPE_ALIGN (PDEBUGHOOKINFO, 4) + TEST_TARGET_SIZE (PDEBUGHOOKINFO, 20) + TEST_TARGET_ALIGN(PDEBUGHOOKINFO, 4) } static void test_pack_PDELETEITEMSTRUCT(void) { /* PDELETEITEMSTRUCT */ - TEST_TYPE(PDELETEITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(PDELETEITEMSTRUCT, 20, 4); + TEST_TYPE_SIZE (PDELETEITEMSTRUCT, 4) + TEST_TYPE_ALIGN (PDELETEITEMSTRUCT, 4) + TEST_TARGET_SIZE (PDELETEITEMSTRUCT, 20) + TEST_TARGET_ALIGN(PDELETEITEMSTRUCT, 4) } static void test_pack_PDLGITEMTEMPLATEA(void) { /* PDLGITEMTEMPLATEA */ - TEST_TYPE(PDLGITEMTEMPLATEA, 4, 4); - TEST_TYPE_POINTER(PDLGITEMTEMPLATEA, 18, 2); + TEST_TYPE_SIZE (PDLGITEMTEMPLATEA, 4) + TEST_TYPE_ALIGN (PDLGITEMTEMPLATEA, 4) + TEST_TARGET_SIZE (PDLGITEMTEMPLATEA, 18) + TEST_TARGET_ALIGN(PDLGITEMTEMPLATEA, 2) } static void test_pack_PDLGITEMTEMPLATEW(void) { /* PDLGITEMTEMPLATEW */ - TEST_TYPE(PDLGITEMTEMPLATEW, 4, 4); - TEST_TYPE_POINTER(PDLGITEMTEMPLATEW, 18, 2); + TEST_TYPE_SIZE (PDLGITEMTEMPLATEW, 4) + TEST_TYPE_ALIGN (PDLGITEMTEMPLATEW, 4) + TEST_TARGET_SIZE (PDLGITEMTEMPLATEW, 18) + TEST_TARGET_ALIGN(PDLGITEMTEMPLATEW, 2) } static void test_pack_PDRAWITEMSTRUCT(void) { /* PDRAWITEMSTRUCT */ - TEST_TYPE(PDRAWITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(PDRAWITEMSTRUCT, 48, 4); + TEST_TYPE_SIZE (PDRAWITEMSTRUCT, 4) + TEST_TYPE_ALIGN (PDRAWITEMSTRUCT, 4) + TEST_TARGET_SIZE (PDRAWITEMSTRUCT, 48) + TEST_TARGET_ALIGN(PDRAWITEMSTRUCT, 4) } static void test_pack_PEVENTMSG(void) { /* PEVENTMSG */ - TEST_TYPE(PEVENTMSG, 4, 4); - TEST_TYPE_POINTER(PEVENTMSG, 20, 4); + TEST_TYPE_SIZE (PEVENTMSG, 4) + TEST_TYPE_ALIGN (PEVENTMSG, 4) + TEST_TARGET_SIZE (PEVENTMSG, 20) + TEST_TARGET_ALIGN(PEVENTMSG, 4) } static void test_pack_PFLASHWINFO(void) { /* PFLASHWINFO */ - TEST_TYPE(PFLASHWINFO, 4, 4); - TEST_TYPE_POINTER(PFLASHWINFO, 20, 4); + TEST_TYPE_SIZE (PFLASHWINFO, 4) + TEST_TYPE_ALIGN (PFLASHWINFO, 4) + TEST_TARGET_SIZE (PFLASHWINFO, 20) + TEST_TARGET_ALIGN(PFLASHWINFO, 4) } static void test_pack_PGUITHREADINFO(void) { /* PGUITHREADINFO */ - TEST_TYPE(PGUITHREADINFO, 4, 4); - TEST_TYPE_POINTER(PGUITHREADINFO, 48, 4); + TEST_TYPE_SIZE (PGUITHREADINFO, 4) + TEST_TYPE_ALIGN (PGUITHREADINFO, 4) + TEST_TARGET_SIZE (PGUITHREADINFO, 48) + TEST_TARGET_ALIGN(PGUITHREADINFO, 4) } static void test_pack_PHARDWAREHOOKSTRUCT(void) { /* PHARDWAREHOOKSTRUCT */ - TEST_TYPE(PHARDWAREHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(PHARDWAREHOOKSTRUCT, 16, 4); + TEST_TYPE_SIZE (PHARDWAREHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (PHARDWAREHOOKSTRUCT, 4) + TEST_TARGET_SIZE (PHARDWAREHOOKSTRUCT, 16) + TEST_TARGET_ALIGN(PHARDWAREHOOKSTRUCT, 4) } static void test_pack_PHARDWAREINPUT(void) { /* PHARDWAREINPUT */ - TEST_TYPE(PHARDWAREINPUT, 4, 4); - TEST_TYPE_POINTER(PHARDWAREINPUT, 8, 4); + TEST_TYPE_SIZE (PHARDWAREINPUT, 4) + TEST_TYPE_ALIGN (PHARDWAREINPUT, 4) + TEST_TARGET_SIZE (PHARDWAREINPUT, 8) + TEST_TARGET_ALIGN(PHARDWAREINPUT, 4) } static void test_pack_PHDEVNOTIFY(void) { /* PHDEVNOTIFY */ - TEST_TYPE(PHDEVNOTIFY, 4, 4); - TEST_TYPE_POINTER(PHDEVNOTIFY, 4, 4); + TEST_TYPE_SIZE (PHDEVNOTIFY, 4) + TEST_TYPE_ALIGN (PHDEVNOTIFY, 4) + TEST_TARGET_SIZE (PHDEVNOTIFY, 4) + TEST_TARGET_ALIGN(PHDEVNOTIFY, 4) } static void test_pack_PHELPWININFOA(void) { /* PHELPWININFOA */ - TEST_TYPE(PHELPWININFOA, 4, 4); - TEST_TYPE_POINTER(PHELPWININFOA, 28, 4); + TEST_TYPE_SIZE (PHELPWININFOA, 4) + TEST_TYPE_ALIGN (PHELPWININFOA, 4) + TEST_TARGET_SIZE (PHELPWININFOA, 28) + TEST_TARGET_ALIGN(PHELPWININFOA, 4) } static void test_pack_PHELPWININFOW(void) { /* PHELPWININFOW */ - TEST_TYPE(PHELPWININFOW, 4, 4); - TEST_TYPE_POINTER(PHELPWININFOW, 28, 4); + TEST_TYPE_SIZE (PHELPWININFOW, 4) + TEST_TYPE_ALIGN (PHELPWININFOW, 4) + TEST_TARGET_SIZE (PHELPWININFOW, 28) + TEST_TARGET_ALIGN(PHELPWININFOW, 4) } static void test_pack_PICONINFO(void) { /* PICONINFO */ - TEST_TYPE(PICONINFO, 4, 4); - TEST_TYPE_POINTER(PICONINFO, 20, 4); + TEST_TYPE_SIZE (PICONINFO, 4) + TEST_TYPE_ALIGN (PICONINFO, 4) + TEST_TARGET_SIZE (PICONINFO, 20) + TEST_TARGET_ALIGN(PICONINFO, 4) } static void test_pack_PICONMETRICSA(void) { /* PICONMETRICSA */ - TEST_TYPE(PICONMETRICSA, 4, 4); - TEST_TYPE_POINTER(PICONMETRICSA, 76, 4); + TEST_TYPE_SIZE (PICONMETRICSA, 4) + TEST_TYPE_ALIGN (PICONMETRICSA, 4) + TEST_TARGET_SIZE (PICONMETRICSA, 76) + TEST_TARGET_ALIGN(PICONMETRICSA, 4) } static void test_pack_PICONMETRICSW(void) { /* PICONMETRICSW */ - TEST_TYPE(PICONMETRICSW, 4, 4); - TEST_TYPE_POINTER(PICONMETRICSW, 108, 4); + TEST_TYPE_SIZE (PICONMETRICSW, 4) + TEST_TYPE_ALIGN (PICONMETRICSW, 4) + TEST_TARGET_SIZE (PICONMETRICSW, 108) + TEST_TARGET_ALIGN(PICONMETRICSW, 4) } static void test_pack_PINPUT(void) { /* PINPUT */ - TEST_TYPE(PINPUT, 4, 4); + TEST_TYPE_SIZE (PINPUT, 4) + TEST_TYPE_ALIGN (PINPUT, 4) } static void test_pack_PKBDLLHOOKSTRUCT(void) { /* PKBDLLHOOKSTRUCT */ - TEST_TYPE(PKBDLLHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(PKBDLLHOOKSTRUCT, 20, 4); + TEST_TYPE_SIZE (PKBDLLHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (PKBDLLHOOKSTRUCT, 4) + TEST_TARGET_SIZE (PKBDLLHOOKSTRUCT, 20) + TEST_TARGET_ALIGN(PKBDLLHOOKSTRUCT, 4) } static void test_pack_PKEYBDINPUT(void) { /* PKEYBDINPUT */ - TEST_TYPE(PKEYBDINPUT, 4, 4); - TEST_TYPE_POINTER(PKEYBDINPUT, 16, 4); + TEST_TYPE_SIZE (PKEYBDINPUT, 4) + TEST_TYPE_ALIGN (PKEYBDINPUT, 4) + TEST_TARGET_SIZE (PKEYBDINPUT, 16) + TEST_TARGET_ALIGN(PKEYBDINPUT, 4) } static void test_pack_PMDINEXTMENU(void) { /* PMDINEXTMENU */ - TEST_TYPE(PMDINEXTMENU, 4, 4); - TEST_TYPE_POINTER(PMDINEXTMENU, 12, 4); + TEST_TYPE_SIZE (PMDINEXTMENU, 4) + TEST_TYPE_ALIGN (PMDINEXTMENU, 4) + TEST_TARGET_SIZE (PMDINEXTMENU, 12) + TEST_TARGET_ALIGN(PMDINEXTMENU, 4) } static void test_pack_PMEASUREITEMSTRUCT(void) { /* PMEASUREITEMSTRUCT */ - TEST_TYPE(PMEASUREITEMSTRUCT, 4, 4); - TEST_TYPE_POINTER(PMEASUREITEMSTRUCT, 24, 4); + TEST_TYPE_SIZE (PMEASUREITEMSTRUCT, 4) + TEST_TYPE_ALIGN (PMEASUREITEMSTRUCT, 4) + TEST_TARGET_SIZE (PMEASUREITEMSTRUCT, 24) + TEST_TARGET_ALIGN(PMEASUREITEMSTRUCT, 4) } static void test_pack_PMENUITEMTEMPLATE(void) { /* PMENUITEMTEMPLATE */ - TEST_TYPE(PMENUITEMTEMPLATE, 4, 4); - TEST_TYPE_POINTER(PMENUITEMTEMPLATE, 6, 2); + TEST_TYPE_SIZE (PMENUITEMTEMPLATE, 4) + TEST_TYPE_ALIGN (PMENUITEMTEMPLATE, 4) + TEST_TARGET_SIZE (PMENUITEMTEMPLATE, 6) + TEST_TARGET_ALIGN(PMENUITEMTEMPLATE, 2) } static void test_pack_PMENUITEMTEMPLATEHEADER(void) { /* PMENUITEMTEMPLATEHEADER */ - TEST_TYPE(PMENUITEMTEMPLATEHEADER, 4, 4); - TEST_TYPE_POINTER(PMENUITEMTEMPLATEHEADER, 4, 2); + TEST_TYPE_SIZE (PMENUITEMTEMPLATEHEADER, 4) + TEST_TYPE_ALIGN (PMENUITEMTEMPLATEHEADER, 4) + TEST_TARGET_SIZE (PMENUITEMTEMPLATEHEADER, 4) + TEST_TARGET_ALIGN(PMENUITEMTEMPLATEHEADER, 2) } static void test_pack_PMINIMIZEDMETRICS(void) { /* PMINIMIZEDMETRICS */ - TEST_TYPE(PMINIMIZEDMETRICS, 4, 4); - TEST_TYPE_POINTER(PMINIMIZEDMETRICS, 20, 4); + TEST_TYPE_SIZE (PMINIMIZEDMETRICS, 4) + TEST_TYPE_ALIGN (PMINIMIZEDMETRICS, 4) + TEST_TARGET_SIZE (PMINIMIZEDMETRICS, 20) + TEST_TARGET_ALIGN(PMINIMIZEDMETRICS, 4) } static void test_pack_PMINMAXINFO(void) { /* PMINMAXINFO */ - TEST_TYPE(PMINMAXINFO, 4, 4); - TEST_TYPE_POINTER(PMINMAXINFO, 40, 4); + TEST_TYPE_SIZE (PMINMAXINFO, 4) + TEST_TYPE_ALIGN (PMINMAXINFO, 4) + TEST_TARGET_SIZE (PMINMAXINFO, 40) + TEST_TARGET_ALIGN(PMINMAXINFO, 4) } static void test_pack_PMOUSEHOOKSTRUCT(void) { /* PMOUSEHOOKSTRUCT */ - TEST_TYPE(PMOUSEHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(PMOUSEHOOKSTRUCT, 20, 4); + TEST_TYPE_SIZE (PMOUSEHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (PMOUSEHOOKSTRUCT, 4) + TEST_TARGET_SIZE (PMOUSEHOOKSTRUCT, 20) + TEST_TARGET_ALIGN(PMOUSEHOOKSTRUCT, 4) } static void test_pack_PMOUSEINPUT(void) { /* PMOUSEINPUT */ - TEST_TYPE(PMOUSEINPUT, 4, 4); - TEST_TYPE_POINTER(PMOUSEINPUT, 24, 4); + TEST_TYPE_SIZE (PMOUSEINPUT, 4) + TEST_TYPE_ALIGN (PMOUSEINPUT, 4) + TEST_TARGET_SIZE (PMOUSEINPUT, 24) + TEST_TARGET_ALIGN(PMOUSEINPUT, 4) } static void test_pack_PMSG(void) { /* PMSG */ - TEST_TYPE(PMSG, 4, 4); - TEST_TYPE_POINTER(PMSG, 28, 4); + TEST_TYPE_SIZE (PMSG, 4) + TEST_TYPE_ALIGN (PMSG, 4) + TEST_TARGET_SIZE (PMSG, 28) + TEST_TARGET_ALIGN(PMSG, 4) } static void test_pack_PMSGBOXPARAMSA(void) { /* PMSGBOXPARAMSA */ - TEST_TYPE(PMSGBOXPARAMSA, 4, 4); - TEST_TYPE_POINTER(PMSGBOXPARAMSA, 40, 4); + TEST_TYPE_SIZE (PMSGBOXPARAMSA, 4) + TEST_TYPE_ALIGN (PMSGBOXPARAMSA, 4) + TEST_TARGET_SIZE (PMSGBOXPARAMSA, 40) + TEST_TARGET_ALIGN(PMSGBOXPARAMSA, 4) } static void test_pack_PMSGBOXPARAMSW(void) { /* PMSGBOXPARAMSW */ - TEST_TYPE(PMSGBOXPARAMSW, 4, 4); - TEST_TYPE_POINTER(PMSGBOXPARAMSW, 40, 4); + TEST_TYPE_SIZE (PMSGBOXPARAMSW, 4) + TEST_TYPE_ALIGN (PMSGBOXPARAMSW, 4) + TEST_TARGET_SIZE (PMSGBOXPARAMSW, 40) + TEST_TARGET_ALIGN(PMSGBOXPARAMSW, 4) } static void test_pack_PMSLLHOOKSTRUCT(void) { /* PMSLLHOOKSTRUCT */ - TEST_TYPE(PMSLLHOOKSTRUCT, 4, 4); - TEST_TYPE_POINTER(PMSLLHOOKSTRUCT, 24, 4); + TEST_TYPE_SIZE (PMSLLHOOKSTRUCT, 4) + TEST_TYPE_ALIGN (PMSLLHOOKSTRUCT, 4) + TEST_TARGET_SIZE (PMSLLHOOKSTRUCT, 24) + TEST_TARGET_ALIGN(PMSLLHOOKSTRUCT, 4) } static void test_pack_PMULTIKEYHELPA(void) { /* PMULTIKEYHELPA */ - TEST_TYPE(PMULTIKEYHELPA, 4, 4); - TEST_TYPE_POINTER(PMULTIKEYHELPA, 8, 4); + TEST_TYPE_SIZE (PMULTIKEYHELPA, 4) + TEST_TYPE_ALIGN (PMULTIKEYHELPA, 4) + TEST_TARGET_SIZE (PMULTIKEYHELPA, 8) + TEST_TARGET_ALIGN(PMULTIKEYHELPA, 4) } static void test_pack_PMULTIKEYHELPW(void) { /* PMULTIKEYHELPW */ - TEST_TYPE(PMULTIKEYHELPW, 4, 4); - TEST_TYPE_POINTER(PMULTIKEYHELPW, 8, 4); + TEST_TYPE_SIZE (PMULTIKEYHELPW, 4) + TEST_TYPE_ALIGN (PMULTIKEYHELPW, 4) + TEST_TARGET_SIZE (PMULTIKEYHELPW, 8) + TEST_TARGET_ALIGN(PMULTIKEYHELPW, 4) } static void test_pack_PNONCLIENTMETRICSA(void) { /* PNONCLIENTMETRICSA */ - TEST_TYPE(PNONCLIENTMETRICSA, 4, 4); - TEST_TYPE_POINTER(PNONCLIENTMETRICSA, 340, 4); + TEST_TYPE_SIZE (PNONCLIENTMETRICSA, 4) + TEST_TYPE_ALIGN (PNONCLIENTMETRICSA, 4) + TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 340) + TEST_TARGET_ALIGN(PNONCLIENTMETRICSA, 4) } static void test_pack_PNONCLIENTMETRICSW(void) { /* PNONCLIENTMETRICSW */ - TEST_TYPE(PNONCLIENTMETRICSW, 4, 4); - TEST_TYPE_POINTER(PNONCLIENTMETRICSW, 500, 4); + TEST_TYPE_SIZE (PNONCLIENTMETRICSW, 4) + TEST_TYPE_ALIGN (PNONCLIENTMETRICSW, 4) + TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 500) + TEST_TARGET_ALIGN(PNONCLIENTMETRICSW, 4) } static void test_pack_PPAINTSTRUCT(void) { /* PPAINTSTRUCT */ - TEST_TYPE(PPAINTSTRUCT, 4, 4); - TEST_TYPE_POINTER(PPAINTSTRUCT, 64, 4); + TEST_TYPE_SIZE (PPAINTSTRUCT, 4) + TEST_TYPE_ALIGN (PPAINTSTRUCT, 4) + TEST_TARGET_SIZE (PPAINTSTRUCT, 64) + TEST_TARGET_ALIGN(PPAINTSTRUCT, 4) } static void test_pack_PROPENUMPROCA(void) { /* PROPENUMPROCA */ - TEST_TYPE(PROPENUMPROCA, 4, 4); + TEST_TYPE_SIZE (PROPENUMPROCA, 4) + TEST_TYPE_ALIGN (PROPENUMPROCA, 4) } static void test_pack_PROPENUMPROCEXA(void) { /* PROPENUMPROCEXA */ - TEST_TYPE(PROPENUMPROCEXA, 4, 4); + TEST_TYPE_SIZE (PROPENUMPROCEXA, 4) + TEST_TYPE_ALIGN (PROPENUMPROCEXA, 4) } static void test_pack_PROPENUMPROCEXW(void) { /* PROPENUMPROCEXW */ - TEST_TYPE(PROPENUMPROCEXW, 4, 4); + TEST_TYPE_SIZE (PROPENUMPROCEXW, 4) + TEST_TYPE_ALIGN (PROPENUMPROCEXW, 4) } static void test_pack_PROPENUMPROCW(void) { /* PROPENUMPROCW */ - TEST_TYPE(PROPENUMPROCW, 4, 4); + TEST_TYPE_SIZE (PROPENUMPROCW, 4) + TEST_TYPE_ALIGN (PROPENUMPROCW, 4) } static void test_pack_PTITLEBARINFO(void) { /* PTITLEBARINFO */ - TEST_TYPE(PTITLEBARINFO, 4, 4); - TEST_TYPE_POINTER(PTITLEBARINFO, 44, 4); + TEST_TYPE_SIZE (PTITLEBARINFO, 4) + TEST_TYPE_ALIGN (PTITLEBARINFO, 4) + TEST_TARGET_SIZE (PTITLEBARINFO, 44) + TEST_TARGET_ALIGN(PTITLEBARINFO, 4) } static void test_pack_PUSEROBJECTFLAGS(void) { /* PUSEROBJECTFLAGS */ - TEST_TYPE(PUSEROBJECTFLAGS, 4, 4); - TEST_TYPE_POINTER(PUSEROBJECTFLAGS, 12, 4); + TEST_TYPE_SIZE (PUSEROBJECTFLAGS, 4) + TEST_TYPE_ALIGN (PUSEROBJECTFLAGS, 4) + TEST_TARGET_SIZE (PUSEROBJECTFLAGS, 12) + TEST_TARGET_ALIGN(PUSEROBJECTFLAGS, 4) } static void test_pack_PWINDOWINFO(void) { /* PWINDOWINFO */ - TEST_TYPE(PWINDOWINFO, 4, 4); - TEST_TYPE_POINTER(PWINDOWINFO, 60, 4); + TEST_TYPE_SIZE (PWINDOWINFO, 4) + TEST_TYPE_ALIGN (PWINDOWINFO, 4) + TEST_TARGET_SIZE (PWINDOWINFO, 60) + TEST_TARGET_ALIGN(PWINDOWINFO, 4) } static void test_pack_PWINDOWPLACEMENT(void) { /* PWINDOWPLACEMENT */ - TEST_TYPE(PWINDOWPLACEMENT, 4, 4); - TEST_TYPE_POINTER(PWINDOWPLACEMENT, 44, 4); + TEST_TYPE_SIZE (PWINDOWPLACEMENT, 4) + TEST_TYPE_ALIGN (PWINDOWPLACEMENT, 4) + TEST_TARGET_SIZE (PWINDOWPLACEMENT, 44) + TEST_TARGET_ALIGN(PWINDOWPLACEMENT, 4) } static void test_pack_PWINDOWPOS(void) { /* PWINDOWPOS */ - TEST_TYPE(PWINDOWPOS, 4, 4); - TEST_TYPE_POINTER(PWINDOWPOS, 28, 4); + TEST_TYPE_SIZE (PWINDOWPOS, 4) + TEST_TYPE_ALIGN (PWINDOWPOS, 4) + TEST_TARGET_SIZE (PWINDOWPOS, 28) + TEST_TARGET_ALIGN(PWINDOWPOS, 4) } static void test_pack_PWNDCLASSA(void) { /* PWNDCLASSA */ - TEST_TYPE(PWNDCLASSA, 4, 4); - TEST_TYPE_POINTER(PWNDCLASSA, 40, 4); + TEST_TYPE_SIZE (PWNDCLASSA, 4) + TEST_TYPE_ALIGN (PWNDCLASSA, 4) + TEST_TARGET_SIZE (PWNDCLASSA, 40) + TEST_TARGET_ALIGN(PWNDCLASSA, 4) } static void test_pack_PWNDCLASSEXA(void) { /* PWNDCLASSEXA */ - TEST_TYPE(PWNDCLASSEXA, 4, 4); - TEST_TYPE_POINTER(PWNDCLASSEXA, 48, 4); + TEST_TYPE_SIZE (PWNDCLASSEXA, 4) + TEST_TYPE_ALIGN (PWNDCLASSEXA, 4) + TEST_TARGET_SIZE (PWNDCLASSEXA, 48) + TEST_TARGET_ALIGN(PWNDCLASSEXA, 4) } static void test_pack_PWNDCLASSEXW(void) { /* PWNDCLASSEXW */ - TEST_TYPE(PWNDCLASSEXW, 4, 4); - TEST_TYPE_POINTER(PWNDCLASSEXW, 48, 4); + TEST_TYPE_SIZE (PWNDCLASSEXW, 4) + TEST_TYPE_ALIGN (PWNDCLASSEXW, 4) + TEST_TARGET_SIZE (PWNDCLASSEXW, 48) + TEST_TARGET_ALIGN(PWNDCLASSEXW, 4) } static void test_pack_PWNDCLASSW(void) { /* PWNDCLASSW */ - TEST_TYPE(PWNDCLASSW, 4, 4); - TEST_TYPE_POINTER(PWNDCLASSW, 40, 4); + TEST_TYPE_SIZE (PWNDCLASSW, 4) + TEST_TYPE_ALIGN (PWNDCLASSW, 4) + TEST_TARGET_SIZE (PWNDCLASSW, 40) + TEST_TARGET_ALIGN(PWNDCLASSW, 4) } static void test_pack_SCROLLINFO(void) { /* SCROLLINFO (pack 4) */ - TEST_TYPE(SCROLLINFO, 28, 4); - TEST_FIELD(SCROLLINFO, UINT, cbSize, 0, 4, 4); - TEST_FIELD(SCROLLINFO, UINT, fMask, 4, 4, 4); - TEST_FIELD(SCROLLINFO, INT, nMin, 8, 4, 4); - TEST_FIELD(SCROLLINFO, INT, nMax, 12, 4, 4); - TEST_FIELD(SCROLLINFO, UINT, nPage, 16, 4, 4); - TEST_FIELD(SCROLLINFO, INT, nPos, 20, 4, 4); - TEST_FIELD(SCROLLINFO, INT, nTrackPos, 24, 4, 4); + TEST_TYPE_SIZE (SCROLLINFO, 28) + TEST_TYPE_ALIGN (SCROLLINFO, 4) + TEST_FIELD_SIZE (SCROLLINFO, cbSize, 4) + TEST_FIELD_ALIGN (SCROLLINFO, cbSize, 4) + TEST_FIELD_OFFSET(SCROLLINFO, cbSize, 0) + TEST_FIELD_SIZE (SCROLLINFO, fMask, 4) + TEST_FIELD_ALIGN (SCROLLINFO, fMask, 4) + TEST_FIELD_OFFSET(SCROLLINFO, fMask, 4) + TEST_FIELD_SIZE (SCROLLINFO, nMin, 4) + TEST_FIELD_ALIGN (SCROLLINFO, nMin, 4) + TEST_FIELD_OFFSET(SCROLLINFO, nMin, 8) + TEST_FIELD_SIZE (SCROLLINFO, nMax, 4) + TEST_FIELD_ALIGN (SCROLLINFO, nMax, 4) + TEST_FIELD_OFFSET(SCROLLINFO, nMax, 12) + TEST_FIELD_SIZE (SCROLLINFO, nPage, 4) + TEST_FIELD_ALIGN (SCROLLINFO, nPage, 4) + TEST_FIELD_OFFSET(SCROLLINFO, nPage, 16) + TEST_FIELD_SIZE (SCROLLINFO, nPos, 4) + TEST_FIELD_ALIGN (SCROLLINFO, nPos, 4) + TEST_FIELD_OFFSET(SCROLLINFO, nPos, 20) + TEST_FIELD_SIZE (SCROLLINFO, nTrackPos, 4) + TEST_FIELD_ALIGN (SCROLLINFO, nTrackPos, 4) + TEST_FIELD_OFFSET(SCROLLINFO, nTrackPos, 24) } static void test_pack_SENDASYNCPROC(void) { /* SENDASYNCPROC */ - TEST_TYPE(SENDASYNCPROC, 4, 4); + TEST_TYPE_SIZE (SENDASYNCPROC, 4) + TEST_TYPE_ALIGN (SENDASYNCPROC, 4) } static void test_pack_SERIALKEYSA(void) { /* SERIALKEYSA (pack 4) */ - TEST_TYPE(SERIALKEYSA, 28, 4); - TEST_FIELD(SERIALKEYSA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(SERIALKEYSA, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(SERIALKEYSA, LPSTR, lpszActivePort, 8, 4, 4); - TEST_FIELD(SERIALKEYSA, LPSTR, lpszPort, 12, 4, 4); - TEST_FIELD(SERIALKEYSA, UINT, iBaudRate, 16, 4, 4); - TEST_FIELD(SERIALKEYSA, UINT, iPortState, 20, 4, 4); - TEST_FIELD(SERIALKEYSA, UINT, iActive, 24, 4, 4); + TEST_TYPE_SIZE (SERIALKEYSA, 28) + TEST_TYPE_ALIGN (SERIALKEYSA, 4) + TEST_FIELD_SIZE (SERIALKEYSA, cbSize, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, cbSize, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, cbSize, 0) + TEST_FIELD_SIZE (SERIALKEYSA, dwFlags, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, dwFlags, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, dwFlags, 4) + TEST_FIELD_SIZE (SERIALKEYSA, lpszActivePort, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, lpszActivePort, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, lpszActivePort, 8) + TEST_FIELD_SIZE (SERIALKEYSA, lpszPort, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, lpszPort, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, lpszPort, 12) + TEST_FIELD_SIZE (SERIALKEYSA, iBaudRate, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, iBaudRate, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, iBaudRate, 16) + TEST_FIELD_SIZE (SERIALKEYSA, iPortState, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, iPortState, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, iPortState, 20) + TEST_FIELD_SIZE (SERIALKEYSA, iActive, 4) + TEST_FIELD_ALIGN (SERIALKEYSA, iActive, 4) + TEST_FIELD_OFFSET(SERIALKEYSA, iActive, 24) } static void test_pack_SERIALKEYSW(void) { /* SERIALKEYSW (pack 4) */ - TEST_TYPE(SERIALKEYSW, 28, 4); - TEST_FIELD(SERIALKEYSW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(SERIALKEYSW, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(SERIALKEYSW, LPWSTR, lpszActivePort, 8, 4, 4); - TEST_FIELD(SERIALKEYSW, LPWSTR, lpszPort, 12, 4, 4); - TEST_FIELD(SERIALKEYSW, UINT, iBaudRate, 16, 4, 4); - TEST_FIELD(SERIALKEYSW, UINT, iPortState, 20, 4, 4); - TEST_FIELD(SERIALKEYSW, UINT, iActive, 24, 4, 4); + TEST_TYPE_SIZE (SERIALKEYSW, 28) + TEST_TYPE_ALIGN (SERIALKEYSW, 4) + TEST_FIELD_SIZE (SERIALKEYSW, cbSize, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, cbSize, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, cbSize, 0) + TEST_FIELD_SIZE (SERIALKEYSW, dwFlags, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, dwFlags, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, dwFlags, 4) + TEST_FIELD_SIZE (SERIALKEYSW, lpszActivePort, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, lpszActivePort, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, lpszActivePort, 8) + TEST_FIELD_SIZE (SERIALKEYSW, lpszPort, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, lpszPort, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, lpszPort, 12) + TEST_FIELD_SIZE (SERIALKEYSW, iBaudRate, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, iBaudRate, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, iBaudRate, 16) + TEST_FIELD_SIZE (SERIALKEYSW, iPortState, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, iPortState, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, iPortState, 20) + TEST_FIELD_SIZE (SERIALKEYSW, iActive, 4) + TEST_FIELD_ALIGN (SERIALKEYSW, iActive, 4) + TEST_FIELD_OFFSET(SERIALKEYSW, iActive, 24) } static void test_pack_SOUNDSENTRYA(void) { /* SOUNDSENTRYA (pack 4) */ - TEST_TYPE(SOUNDSENTRYA, 48, 4); - TEST_FIELD(SOUNDSENTRYA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iFSTextEffect, 8, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iFSTextEffectMSec, 12, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iFSTextEffectColorBits, 16, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iFSGrafEffect, 20, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iFSGrafEffectMSec, 24, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iFSGrafEffectColor, 28, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iWindowsEffect, 32, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iWindowsEffectMSec, 36, 4, 4); - TEST_FIELD(SOUNDSENTRYA, LPSTR, lpszWindowsEffectDLL, 40, 4, 4); - TEST_FIELD(SOUNDSENTRYA, DWORD, iWindowsEffectOrdinal, 44, 4, 4); + TEST_TYPE_SIZE (SOUNDSENTRYA, 48) + TEST_TYPE_ALIGN (SOUNDSENTRYA, 4) + TEST_FIELD_SIZE (SOUNDSENTRYA, cbSize, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, cbSize, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, cbSize, 0) + TEST_FIELD_SIZE (SOUNDSENTRYA, dwFlags, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, dwFlags, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, dwFlags, 4) + TEST_FIELD_SIZE (SOUNDSENTRYA, iFSTextEffect, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iFSTextEffect, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iFSTextEffect, 8) + TEST_FIELD_SIZE (SOUNDSENTRYA, iFSTextEffectMSec, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iFSTextEffectMSec, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iFSTextEffectMSec, 12) + TEST_FIELD_SIZE (SOUNDSENTRYA, iFSTextEffectColorBits, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iFSTextEffectColorBits, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iFSTextEffectColorBits, 16) + TEST_FIELD_SIZE (SOUNDSENTRYA, iFSGrafEffect, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iFSGrafEffect, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iFSGrafEffect, 20) + TEST_FIELD_SIZE (SOUNDSENTRYA, iFSGrafEffectMSec, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iFSGrafEffectMSec, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iFSGrafEffectMSec, 24) + TEST_FIELD_SIZE (SOUNDSENTRYA, iFSGrafEffectColor, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iFSGrafEffectColor, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iFSGrafEffectColor, 28) + TEST_FIELD_SIZE (SOUNDSENTRYA, iWindowsEffect, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iWindowsEffect, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iWindowsEffect, 32) + TEST_FIELD_SIZE (SOUNDSENTRYA, iWindowsEffectMSec, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iWindowsEffectMSec, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iWindowsEffectMSec, 36) + TEST_FIELD_SIZE (SOUNDSENTRYA, lpszWindowsEffectDLL, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, lpszWindowsEffectDLL, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, lpszWindowsEffectDLL, 40) + TEST_FIELD_SIZE (SOUNDSENTRYA, iWindowsEffectOrdinal, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYA, iWindowsEffectOrdinal, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYA, iWindowsEffectOrdinal, 44) } static void test_pack_SOUNDSENTRYW(void) { /* SOUNDSENTRYW (pack 4) */ - TEST_TYPE(SOUNDSENTRYW, 48, 4); - TEST_FIELD(SOUNDSENTRYW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iFSTextEffect, 8, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iFSTextEffectMSec, 12, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iFSTextEffectColorBits, 16, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iFSGrafEffect, 20, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iFSGrafEffectMSec, 24, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iFSGrafEffectColor, 28, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iWindowsEffect, 32, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iWindowsEffectMSec, 36, 4, 4); - TEST_FIELD(SOUNDSENTRYW, LPWSTR, lpszWindowsEffectDLL, 40, 4, 4); - TEST_FIELD(SOUNDSENTRYW, DWORD, iWindowsEffectOrdinal, 44, 4, 4); + TEST_TYPE_SIZE (SOUNDSENTRYW, 48) + TEST_TYPE_ALIGN (SOUNDSENTRYW, 4) + TEST_FIELD_SIZE (SOUNDSENTRYW, cbSize, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, cbSize, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, cbSize, 0) + TEST_FIELD_SIZE (SOUNDSENTRYW, dwFlags, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, dwFlags, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, dwFlags, 4) + TEST_FIELD_SIZE (SOUNDSENTRYW, iFSTextEffect, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iFSTextEffect, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iFSTextEffect, 8) + TEST_FIELD_SIZE (SOUNDSENTRYW, iFSTextEffectMSec, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iFSTextEffectMSec, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iFSTextEffectMSec, 12) + TEST_FIELD_SIZE (SOUNDSENTRYW, iFSTextEffectColorBits, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iFSTextEffectColorBits, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iFSTextEffectColorBits, 16) + TEST_FIELD_SIZE (SOUNDSENTRYW, iFSGrafEffect, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iFSGrafEffect, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iFSGrafEffect, 20) + TEST_FIELD_SIZE (SOUNDSENTRYW, iFSGrafEffectMSec, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iFSGrafEffectMSec, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iFSGrafEffectMSec, 24) + TEST_FIELD_SIZE (SOUNDSENTRYW, iFSGrafEffectColor, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iFSGrafEffectColor, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iFSGrafEffectColor, 28) + TEST_FIELD_SIZE (SOUNDSENTRYW, iWindowsEffect, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iWindowsEffect, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iWindowsEffect, 32) + TEST_FIELD_SIZE (SOUNDSENTRYW, iWindowsEffectMSec, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iWindowsEffectMSec, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iWindowsEffectMSec, 36) + TEST_FIELD_SIZE (SOUNDSENTRYW, lpszWindowsEffectDLL, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, lpszWindowsEffectDLL, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, lpszWindowsEffectDLL, 40) + TEST_FIELD_SIZE (SOUNDSENTRYW, iWindowsEffectOrdinal, 4) + TEST_FIELD_ALIGN (SOUNDSENTRYW, iWindowsEffectOrdinal, 4) + TEST_FIELD_OFFSET(SOUNDSENTRYW, iWindowsEffectOrdinal, 44) } static void test_pack_STICKYKEYS(void) { /* STICKYKEYS (pack 4) */ - TEST_TYPE(STICKYKEYS, 8, 4); - TEST_FIELD(STICKYKEYS, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(STICKYKEYS, DWORD, dwFlags, 4, 4, 4); + TEST_TYPE_SIZE (STICKYKEYS, 8) + TEST_TYPE_ALIGN (STICKYKEYS, 4) + TEST_FIELD_SIZE (STICKYKEYS, cbSize, 4) + TEST_FIELD_ALIGN (STICKYKEYS, cbSize, 4) + TEST_FIELD_OFFSET(STICKYKEYS, cbSize, 0) + TEST_FIELD_SIZE (STICKYKEYS, dwFlags, 4) + TEST_FIELD_ALIGN (STICKYKEYS, dwFlags, 4) + TEST_FIELD_OFFSET(STICKYKEYS, dwFlags, 4) } static void test_pack_STYLESTRUCT(void) { /* STYLESTRUCT (pack 4) */ - TEST_TYPE(STYLESTRUCT, 8, 4); - TEST_FIELD(STYLESTRUCT, DWORD, styleOld, 0, 4, 4); - TEST_FIELD(STYLESTRUCT, DWORD, styleNew, 4, 4, 4); + TEST_TYPE_SIZE (STYLESTRUCT, 8) + TEST_TYPE_ALIGN (STYLESTRUCT, 4) + TEST_FIELD_SIZE (STYLESTRUCT, styleOld, 4) + TEST_FIELD_ALIGN (STYLESTRUCT, styleOld, 4) + TEST_FIELD_OFFSET(STYLESTRUCT, styleOld, 0) + TEST_FIELD_SIZE (STYLESTRUCT, styleNew, 4) + TEST_FIELD_ALIGN (STYLESTRUCT, styleNew, 4) + TEST_FIELD_OFFSET(STYLESTRUCT, styleNew, 4) } static void test_pack_TIMERPROC(void) { /* TIMERPROC */ - TEST_TYPE(TIMERPROC, 4, 4); + TEST_TYPE_SIZE (TIMERPROC, 4) + TEST_TYPE_ALIGN (TIMERPROC, 4) } static void test_pack_TITLEBARINFO(void) { /* TITLEBARINFO (pack 4) */ - TEST_TYPE(TITLEBARINFO, 44, 4); - TEST_FIELD(TITLEBARINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(TITLEBARINFO, RECT, rcTitleBar, 4, 16, 4); - TEST_FIELD(TITLEBARINFO, DWORD[CCHILDREN_TITLEBAR+1], rgstate, 20, 24, 4); + TEST_TYPE_SIZE (TITLEBARINFO, 44) + TEST_TYPE_ALIGN (TITLEBARINFO, 4) + TEST_FIELD_SIZE (TITLEBARINFO, cbSize, 4) + TEST_FIELD_ALIGN (TITLEBARINFO, cbSize, 4) + TEST_FIELD_OFFSET(TITLEBARINFO, cbSize, 0) + TEST_FIELD_SIZE (TITLEBARINFO, rcTitleBar, 16) + TEST_FIELD_ALIGN (TITLEBARINFO, rcTitleBar, 4) + TEST_FIELD_OFFSET(TITLEBARINFO, rcTitleBar, 4) + TEST_FIELD_SIZE (TITLEBARINFO, rgstate, 24) + TEST_FIELD_ALIGN (TITLEBARINFO, rgstate, 4) + TEST_FIELD_OFFSET(TITLEBARINFO, rgstate, 20) } static void test_pack_TOGGLEKEYS(void) { /* TOGGLEKEYS (pack 4) */ - TEST_TYPE(TOGGLEKEYS, 8, 4); - TEST_FIELD(TOGGLEKEYS, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(TOGGLEKEYS, DWORD, dwFlags, 4, 4, 4); + TEST_TYPE_SIZE (TOGGLEKEYS, 8) + TEST_TYPE_ALIGN (TOGGLEKEYS, 4) + TEST_FIELD_SIZE (TOGGLEKEYS, cbSize, 4) + TEST_FIELD_ALIGN (TOGGLEKEYS, cbSize, 4) + TEST_FIELD_OFFSET(TOGGLEKEYS, cbSize, 0) + TEST_FIELD_SIZE (TOGGLEKEYS, dwFlags, 4) + TEST_FIELD_ALIGN (TOGGLEKEYS, dwFlags, 4) + TEST_FIELD_OFFSET(TOGGLEKEYS, dwFlags, 4) } static void test_pack_TPMPARAMS(void) { /* TPMPARAMS (pack 4) */ - TEST_TYPE(TPMPARAMS, 20, 4); - TEST_FIELD(TPMPARAMS, UINT, cbSize, 0, 4, 4); - TEST_FIELD(TPMPARAMS, RECT, rcExclude, 4, 16, 4); + TEST_TYPE_SIZE (TPMPARAMS, 20) + TEST_TYPE_ALIGN (TPMPARAMS, 4) + TEST_FIELD_SIZE (TPMPARAMS, cbSize, 4) + TEST_FIELD_ALIGN (TPMPARAMS, cbSize, 4) + TEST_FIELD_OFFSET(TPMPARAMS, cbSize, 0) + TEST_FIELD_SIZE (TPMPARAMS, rcExclude, 16) + TEST_FIELD_ALIGN (TPMPARAMS, rcExclude, 4) + TEST_FIELD_OFFSET(TPMPARAMS, rcExclude, 4) } static void test_pack_TRACKMOUSEEVENT(void) { /* TRACKMOUSEEVENT (pack 4) */ - TEST_TYPE(TRACKMOUSEEVENT, 16, 4); - TEST_FIELD(TRACKMOUSEEVENT, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(TRACKMOUSEEVENT, DWORD, dwFlags, 4, 4, 4); - TEST_FIELD(TRACKMOUSEEVENT, HWND, hwndTrack, 8, 4, 4); - TEST_FIELD(TRACKMOUSEEVENT, DWORD, dwHoverTime, 12, 4, 4); + TEST_TYPE_SIZE (TRACKMOUSEEVENT, 16) + TEST_TYPE_ALIGN (TRACKMOUSEEVENT, 4) + TEST_FIELD_SIZE (TRACKMOUSEEVENT, cbSize, 4) + TEST_FIELD_ALIGN (TRACKMOUSEEVENT, cbSize, 4) + TEST_FIELD_OFFSET(TRACKMOUSEEVENT, cbSize, 0) + TEST_FIELD_SIZE (TRACKMOUSEEVENT, dwFlags, 4) + TEST_FIELD_ALIGN (TRACKMOUSEEVENT, dwFlags, 4) + TEST_FIELD_OFFSET(TRACKMOUSEEVENT, dwFlags, 4) + TEST_FIELD_SIZE (TRACKMOUSEEVENT, hwndTrack, 4) + TEST_FIELD_ALIGN (TRACKMOUSEEVENT, hwndTrack, 4) + TEST_FIELD_OFFSET(TRACKMOUSEEVENT, hwndTrack, 8) + TEST_FIELD_SIZE (TRACKMOUSEEVENT, dwHoverTime, 4) + TEST_FIELD_ALIGN (TRACKMOUSEEVENT, dwHoverTime, 4) + TEST_FIELD_OFFSET(TRACKMOUSEEVENT, dwHoverTime, 12) } static void test_pack_USEROBJECTFLAGS(void) { /* USEROBJECTFLAGS (pack 4) */ - TEST_TYPE(USEROBJECTFLAGS, 12, 4); - TEST_FIELD(USEROBJECTFLAGS, BOOL, fInherit, 0, 4, 4); - TEST_FIELD(USEROBJECTFLAGS, BOOL, fReserved, 4, 4, 4); - TEST_FIELD(USEROBJECTFLAGS, DWORD, dwFlags, 8, 4, 4); + TEST_TYPE_SIZE (USEROBJECTFLAGS, 12) + TEST_TYPE_ALIGN (USEROBJECTFLAGS, 4) + TEST_FIELD_SIZE (USEROBJECTFLAGS, fInherit, 4) + TEST_FIELD_ALIGN (USEROBJECTFLAGS, fInherit, 4) + TEST_FIELD_OFFSET(USEROBJECTFLAGS, fInherit, 0) + TEST_FIELD_SIZE (USEROBJECTFLAGS, fReserved, 4) + TEST_FIELD_ALIGN (USEROBJECTFLAGS, fReserved, 4) + TEST_FIELD_OFFSET(USEROBJECTFLAGS, fReserved, 4) + TEST_FIELD_SIZE (USEROBJECTFLAGS, dwFlags, 4) + TEST_FIELD_ALIGN (USEROBJECTFLAGS, dwFlags, 4) + TEST_FIELD_OFFSET(USEROBJECTFLAGS, dwFlags, 8) } static void test_pack_WINDOWINFO(void) { /* WINDOWINFO (pack 4) */ - TEST_TYPE(WINDOWINFO, 60, 4); - TEST_FIELD(WINDOWINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(WINDOWINFO, RECT, rcWindow, 4, 16, 4); - TEST_FIELD(WINDOWINFO, RECT, rcClient, 20, 16, 4); - TEST_FIELD(WINDOWINFO, DWORD, dwStyle, 36, 4, 4); - TEST_FIELD(WINDOWINFO, DWORD, dwExStyle, 40, 4, 4); - TEST_FIELD(WINDOWINFO, DWORD, dwWindowStatus, 44, 4, 4); - TEST_FIELD(WINDOWINFO, UINT, cxWindowBorders, 48, 4, 4); - TEST_FIELD(WINDOWINFO, UINT, cyWindowBorders, 52, 4, 4); - TEST_FIELD(WINDOWINFO, ATOM, atomWindowType, 56, 2, 2); - TEST_FIELD(WINDOWINFO, WORD, wCreatorVersion, 58, 2, 2); + TEST_TYPE_SIZE (WINDOWINFO, 60) + TEST_TYPE_ALIGN (WINDOWINFO, 4) + TEST_FIELD_SIZE (WINDOWINFO, cbSize, 4) + TEST_FIELD_ALIGN (WINDOWINFO, cbSize, 4) + TEST_FIELD_OFFSET(WINDOWINFO, cbSize, 0) + TEST_FIELD_SIZE (WINDOWINFO, rcWindow, 16) + TEST_FIELD_ALIGN (WINDOWINFO, rcWindow, 4) + TEST_FIELD_OFFSET(WINDOWINFO, rcWindow, 4) + TEST_FIELD_SIZE (WINDOWINFO, rcClient, 16) + TEST_FIELD_ALIGN (WINDOWINFO, rcClient, 4) + TEST_FIELD_OFFSET(WINDOWINFO, rcClient, 20) + TEST_FIELD_SIZE (WINDOWINFO, dwStyle, 4) + TEST_FIELD_ALIGN (WINDOWINFO, dwStyle, 4) + TEST_FIELD_OFFSET(WINDOWINFO, dwStyle, 36) + TEST_FIELD_SIZE (WINDOWINFO, dwExStyle, 4) + TEST_FIELD_ALIGN (WINDOWINFO, dwExStyle, 4) + TEST_FIELD_OFFSET(WINDOWINFO, dwExStyle, 40) + TEST_FIELD_SIZE (WINDOWINFO, dwWindowStatus, 4) + TEST_FIELD_ALIGN (WINDOWINFO, dwWindowStatus, 4) + TEST_FIELD_OFFSET(WINDOWINFO, dwWindowStatus, 44) + TEST_FIELD_SIZE (WINDOWINFO, cxWindowBorders, 4) + TEST_FIELD_ALIGN (WINDOWINFO, cxWindowBorders, 4) + TEST_FIELD_OFFSET(WINDOWINFO, cxWindowBorders, 48) + TEST_FIELD_SIZE (WINDOWINFO, cyWindowBorders, 4) + TEST_FIELD_ALIGN (WINDOWINFO, cyWindowBorders, 4) + TEST_FIELD_OFFSET(WINDOWINFO, cyWindowBorders, 52) + TEST_FIELD_SIZE (WINDOWINFO, atomWindowType, 2) + TEST_FIELD_ALIGN (WINDOWINFO, atomWindowType, 2) + TEST_FIELD_OFFSET(WINDOWINFO, atomWindowType, 56) + TEST_FIELD_SIZE (WINDOWINFO, wCreatorVersion, 2) + TEST_FIELD_ALIGN (WINDOWINFO, wCreatorVersion, 2) + TEST_FIELD_OFFSET(WINDOWINFO, wCreatorVersion, 58) } static void test_pack_WINDOWPLACEMENT(void) { /* WINDOWPLACEMENT (pack 4) */ - TEST_TYPE(WINDOWPLACEMENT, 44, 4); - TEST_FIELD(WINDOWPLACEMENT, UINT, length, 0, 4, 4); - TEST_FIELD(WINDOWPLACEMENT, UINT, flags, 4, 4, 4); - TEST_FIELD(WINDOWPLACEMENT, UINT, showCmd, 8, 4, 4); - TEST_FIELD(WINDOWPLACEMENT, POINT, ptMinPosition, 12, 8, 4); - TEST_FIELD(WINDOWPLACEMENT, POINT, ptMaxPosition, 20, 8, 4); - TEST_FIELD(WINDOWPLACEMENT, RECT, rcNormalPosition, 28, 16, 4); + TEST_TYPE_SIZE (WINDOWPLACEMENT, 44) + TEST_TYPE_ALIGN (WINDOWPLACEMENT, 4) + TEST_FIELD_SIZE (WINDOWPLACEMENT, length, 4) + TEST_FIELD_ALIGN (WINDOWPLACEMENT, length, 4) + TEST_FIELD_OFFSET(WINDOWPLACEMENT, length, 0) + TEST_FIELD_SIZE (WINDOWPLACEMENT, flags, 4) + TEST_FIELD_ALIGN (WINDOWPLACEMENT, flags, 4) + TEST_FIELD_OFFSET(WINDOWPLACEMENT, flags, 4) + TEST_FIELD_SIZE (WINDOWPLACEMENT, showCmd, 4) + TEST_FIELD_ALIGN (WINDOWPLACEMENT, showCmd, 4) + TEST_FIELD_OFFSET(WINDOWPLACEMENT, showCmd, 8) + TEST_FIELD_SIZE (WINDOWPLACEMENT, ptMinPosition, 8) + TEST_FIELD_ALIGN (WINDOWPLACEMENT, ptMinPosition, 4) + TEST_FIELD_OFFSET(WINDOWPLACEMENT, ptMinPosition, 12) + TEST_FIELD_SIZE (WINDOWPLACEMENT, ptMaxPosition, 8) + TEST_FIELD_ALIGN (WINDOWPLACEMENT, ptMaxPosition, 4) + TEST_FIELD_OFFSET(WINDOWPLACEMENT, ptMaxPosition, 20) + TEST_FIELD_SIZE (WINDOWPLACEMENT, rcNormalPosition, 16) + TEST_FIELD_ALIGN (WINDOWPLACEMENT, rcNormalPosition, 4) + TEST_FIELD_OFFSET(WINDOWPLACEMENT, rcNormalPosition, 28) } static void test_pack_WINDOWPOS(void) { /* WINDOWPOS (pack 4) */ - TEST_TYPE(WINDOWPOS, 28, 4); - TEST_FIELD(WINDOWPOS, HWND, hwnd, 0, 4, 4); - TEST_FIELD(WINDOWPOS, HWND, hwndInsertAfter, 4, 4, 4); - TEST_FIELD(WINDOWPOS, INT, x, 8, 4, 4); - TEST_FIELD(WINDOWPOS, INT, y, 12, 4, 4); - TEST_FIELD(WINDOWPOS, INT, cx, 16, 4, 4); - TEST_FIELD(WINDOWPOS, INT, cy, 20, 4, 4); - TEST_FIELD(WINDOWPOS, UINT, flags, 24, 4, 4); + TEST_TYPE_SIZE (WINDOWPOS, 28) + TEST_TYPE_ALIGN (WINDOWPOS, 4) + TEST_FIELD_SIZE (WINDOWPOS, hwnd, 4) + TEST_FIELD_ALIGN (WINDOWPOS, hwnd, 4) + TEST_FIELD_OFFSET(WINDOWPOS, hwnd, 0) + TEST_FIELD_SIZE (WINDOWPOS, hwndInsertAfter, 4) + TEST_FIELD_ALIGN (WINDOWPOS, hwndInsertAfter, 4) + TEST_FIELD_OFFSET(WINDOWPOS, hwndInsertAfter, 4) + TEST_FIELD_SIZE (WINDOWPOS, x, 4) + TEST_FIELD_ALIGN (WINDOWPOS, x, 4) + TEST_FIELD_OFFSET(WINDOWPOS, x, 8) + TEST_FIELD_SIZE (WINDOWPOS, y, 4) + TEST_FIELD_ALIGN (WINDOWPOS, y, 4) + TEST_FIELD_OFFSET(WINDOWPOS, y, 12) + TEST_FIELD_SIZE (WINDOWPOS, cx, 4) + TEST_FIELD_ALIGN (WINDOWPOS, cx, 4) + TEST_FIELD_OFFSET(WINDOWPOS, cx, 16) + TEST_FIELD_SIZE (WINDOWPOS, cy, 4) + TEST_FIELD_ALIGN (WINDOWPOS, cy, 4) + TEST_FIELD_OFFSET(WINDOWPOS, cy, 20) + TEST_FIELD_SIZE (WINDOWPOS, flags, 4) + TEST_FIELD_ALIGN (WINDOWPOS, flags, 4) + TEST_FIELD_OFFSET(WINDOWPOS, flags, 24) } static void test_pack_WINEVENTPROC(void) { /* WINEVENTPROC */ - TEST_TYPE(WINEVENTPROC, 4, 4); + TEST_TYPE_SIZE (WINEVENTPROC, 4) + TEST_TYPE_ALIGN (WINEVENTPROC, 4) } static void test_pack_WINSTAENUMPROCA(void) { /* WINSTAENUMPROCA */ - TEST_TYPE(WINSTAENUMPROCA, 4, 4); + TEST_TYPE_SIZE (WINSTAENUMPROCA, 4) + TEST_TYPE_ALIGN (WINSTAENUMPROCA, 4) } static void test_pack_WINSTAENUMPROCW(void) { /* WINSTAENUMPROCW */ - TEST_TYPE(WINSTAENUMPROCW, 4, 4); + TEST_TYPE_SIZE (WINSTAENUMPROCW, 4) + TEST_TYPE_ALIGN (WINSTAENUMPROCW, 4) } static void test_pack_WNDCLASSA(void) { /* WNDCLASSA (pack 4) */ - TEST_TYPE(WNDCLASSA, 40, 4); - TEST_FIELD(WNDCLASSA, UINT, style, 0, 4, 4); - TEST_FIELD(WNDCLASSA, WNDPROC, lpfnWndProc, 4, 4, 4); - TEST_FIELD(WNDCLASSA, INT, cbClsExtra, 8, 4, 4); - TEST_FIELD(WNDCLASSA, INT, cbWndExtra, 12, 4, 4); - TEST_FIELD(WNDCLASSA, HINSTANCE, hInstance, 16, 4, 4); - TEST_FIELD(WNDCLASSA, HICON, hIcon, 20, 4, 4); - TEST_FIELD(WNDCLASSA, HCURSOR, hCursor, 24, 4, 4); - TEST_FIELD(WNDCLASSA, HBRUSH, hbrBackground, 28, 4, 4); - TEST_FIELD(WNDCLASSA, LPCSTR, lpszMenuName, 32, 4, 4); - TEST_FIELD(WNDCLASSA, LPCSTR, lpszClassName, 36, 4, 4); + TEST_TYPE_SIZE (WNDCLASSA, 40) + TEST_TYPE_ALIGN (WNDCLASSA, 4) + TEST_FIELD_SIZE (WNDCLASSA, style, 4) + TEST_FIELD_ALIGN (WNDCLASSA, style, 4) + TEST_FIELD_OFFSET(WNDCLASSA, style, 0) + TEST_FIELD_SIZE (WNDCLASSA, lpfnWndProc, 4) + TEST_FIELD_ALIGN (WNDCLASSA, lpfnWndProc, 4) + TEST_FIELD_OFFSET(WNDCLASSA, lpfnWndProc, 4) + TEST_FIELD_SIZE (WNDCLASSA, cbClsExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSA, cbClsExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSA, cbClsExtra, 8) + TEST_FIELD_SIZE (WNDCLASSA, cbWndExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSA, cbWndExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSA, cbWndExtra, 12) + TEST_FIELD_SIZE (WNDCLASSA, hInstance, 4) + TEST_FIELD_ALIGN (WNDCLASSA, hInstance, 4) + TEST_FIELD_OFFSET(WNDCLASSA, hInstance, 16) + TEST_FIELD_SIZE (WNDCLASSA, hIcon, 4) + TEST_FIELD_ALIGN (WNDCLASSA, hIcon, 4) + TEST_FIELD_OFFSET(WNDCLASSA, hIcon, 20) + TEST_FIELD_SIZE (WNDCLASSA, hCursor, 4) + TEST_FIELD_ALIGN (WNDCLASSA, hCursor, 4) + TEST_FIELD_OFFSET(WNDCLASSA, hCursor, 24) + TEST_FIELD_SIZE (WNDCLASSA, hbrBackground, 4) + TEST_FIELD_ALIGN (WNDCLASSA, hbrBackground, 4) + TEST_FIELD_OFFSET(WNDCLASSA, hbrBackground, 28) + TEST_FIELD_SIZE (WNDCLASSA, lpszMenuName, 4) + TEST_FIELD_ALIGN (WNDCLASSA, lpszMenuName, 4) + TEST_FIELD_OFFSET(WNDCLASSA, lpszMenuName, 32) + TEST_FIELD_SIZE (WNDCLASSA, lpszClassName, 4) + TEST_FIELD_ALIGN (WNDCLASSA, lpszClassName, 4) + TEST_FIELD_OFFSET(WNDCLASSA, lpszClassName, 36) } static void test_pack_WNDCLASSEXA(void) { /* WNDCLASSEXA (pack 4) */ - TEST_TYPE(WNDCLASSEXA, 48, 4); - TEST_FIELD(WNDCLASSEXA, UINT, cbSize, 0, 4, 4); - TEST_FIELD(WNDCLASSEXA, UINT, style, 4, 4, 4); - TEST_FIELD(WNDCLASSEXA, WNDPROC, lpfnWndProc, 8, 4, 4); - TEST_FIELD(WNDCLASSEXA, INT, cbClsExtra, 12, 4, 4); - TEST_FIELD(WNDCLASSEXA, INT, cbWndExtra, 16, 4, 4); - TEST_FIELD(WNDCLASSEXA, HINSTANCE, hInstance, 20, 4, 4); - TEST_FIELD(WNDCLASSEXA, HICON, hIcon, 24, 4, 4); - TEST_FIELD(WNDCLASSEXA, HCURSOR, hCursor, 28, 4, 4); - TEST_FIELD(WNDCLASSEXA, HBRUSH, hbrBackground, 32, 4, 4); - TEST_FIELD(WNDCLASSEXA, LPCSTR, lpszMenuName, 36, 4, 4); - TEST_FIELD(WNDCLASSEXA, LPCSTR, lpszClassName, 40, 4, 4); - TEST_FIELD(WNDCLASSEXA, HICON, hIconSm, 44, 4, 4); + TEST_TYPE_SIZE (WNDCLASSEXA, 48) + TEST_TYPE_ALIGN (WNDCLASSEXA, 4) + TEST_FIELD_SIZE (WNDCLASSEXA, cbSize, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, cbSize, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, cbSize, 0) + TEST_FIELD_SIZE (WNDCLASSEXA, style, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, style, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, style, 4) + TEST_FIELD_SIZE (WNDCLASSEXA, lpfnWndProc, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, lpfnWndProc, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, lpfnWndProc, 8) + TEST_FIELD_SIZE (WNDCLASSEXA, cbClsExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, cbClsExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, cbClsExtra, 12) + TEST_FIELD_SIZE (WNDCLASSEXA, cbWndExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, cbWndExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, cbWndExtra, 16) + TEST_FIELD_SIZE (WNDCLASSEXA, hInstance, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, hInstance, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, hInstance, 20) + TEST_FIELD_SIZE (WNDCLASSEXA, hIcon, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, hIcon, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, hIcon, 24) + TEST_FIELD_SIZE (WNDCLASSEXA, hCursor, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, hCursor, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, hCursor, 28) + TEST_FIELD_SIZE (WNDCLASSEXA, hbrBackground, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, hbrBackground, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, hbrBackground, 32) + TEST_FIELD_SIZE (WNDCLASSEXA, lpszMenuName, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, lpszMenuName, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, lpszMenuName, 36) + TEST_FIELD_SIZE (WNDCLASSEXA, lpszClassName, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, lpszClassName, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, lpszClassName, 40) + TEST_FIELD_SIZE (WNDCLASSEXA, hIconSm, 4) + TEST_FIELD_ALIGN (WNDCLASSEXA, hIconSm, 4) + TEST_FIELD_OFFSET(WNDCLASSEXA, hIconSm, 44) } static void test_pack_WNDCLASSEXW(void) { /* WNDCLASSEXW (pack 4) */ - TEST_TYPE(WNDCLASSEXW, 48, 4); - TEST_FIELD(WNDCLASSEXW, UINT, cbSize, 0, 4, 4); - TEST_FIELD(WNDCLASSEXW, UINT, style, 4, 4, 4); - TEST_FIELD(WNDCLASSEXW, WNDPROC, lpfnWndProc, 8, 4, 4); - TEST_FIELD(WNDCLASSEXW, INT, cbClsExtra, 12, 4, 4); - TEST_FIELD(WNDCLASSEXW, INT, cbWndExtra, 16, 4, 4); - TEST_FIELD(WNDCLASSEXW, HINSTANCE, hInstance, 20, 4, 4); - TEST_FIELD(WNDCLASSEXW, HICON, hIcon, 24, 4, 4); - TEST_FIELD(WNDCLASSEXW, HCURSOR, hCursor, 28, 4, 4); - TEST_FIELD(WNDCLASSEXW, HBRUSH, hbrBackground, 32, 4, 4); - TEST_FIELD(WNDCLASSEXW, LPCWSTR, lpszMenuName, 36, 4, 4); - TEST_FIELD(WNDCLASSEXW, LPCWSTR, lpszClassName, 40, 4, 4); - TEST_FIELD(WNDCLASSEXW, HICON, hIconSm, 44, 4, 4); + TEST_TYPE_SIZE (WNDCLASSEXW, 48) + TEST_TYPE_ALIGN (WNDCLASSEXW, 4) + TEST_FIELD_SIZE (WNDCLASSEXW, cbSize, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, cbSize, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, cbSize, 0) + TEST_FIELD_SIZE (WNDCLASSEXW, style, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, style, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, style, 4) + TEST_FIELD_SIZE (WNDCLASSEXW, lpfnWndProc, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, lpfnWndProc, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, lpfnWndProc, 8) + TEST_FIELD_SIZE (WNDCLASSEXW, cbClsExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, cbClsExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, cbClsExtra, 12) + TEST_FIELD_SIZE (WNDCLASSEXW, cbWndExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, cbWndExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, cbWndExtra, 16) + TEST_FIELD_SIZE (WNDCLASSEXW, hInstance, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, hInstance, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, hInstance, 20) + TEST_FIELD_SIZE (WNDCLASSEXW, hIcon, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, hIcon, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, hIcon, 24) + TEST_FIELD_SIZE (WNDCLASSEXW, hCursor, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, hCursor, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, hCursor, 28) + TEST_FIELD_SIZE (WNDCLASSEXW, hbrBackground, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, hbrBackground, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, hbrBackground, 32) + TEST_FIELD_SIZE (WNDCLASSEXW, lpszMenuName, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, lpszMenuName, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, lpszMenuName, 36) + TEST_FIELD_SIZE (WNDCLASSEXW, lpszClassName, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, lpszClassName, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, lpszClassName, 40) + TEST_FIELD_SIZE (WNDCLASSEXW, hIconSm, 4) + TEST_FIELD_ALIGN (WNDCLASSEXW, hIconSm, 4) + TEST_FIELD_OFFSET(WNDCLASSEXW, hIconSm, 44) } static void test_pack_WNDCLASSW(void) { /* WNDCLASSW (pack 4) */ - TEST_TYPE(WNDCLASSW, 40, 4); - TEST_FIELD(WNDCLASSW, UINT, style, 0, 4, 4); - TEST_FIELD(WNDCLASSW, WNDPROC, lpfnWndProc, 4, 4, 4); - TEST_FIELD(WNDCLASSW, INT, cbClsExtra, 8, 4, 4); - TEST_FIELD(WNDCLASSW, INT, cbWndExtra, 12, 4, 4); - TEST_FIELD(WNDCLASSW, HINSTANCE, hInstance, 16, 4, 4); - TEST_FIELD(WNDCLASSW, HICON, hIcon, 20, 4, 4); - TEST_FIELD(WNDCLASSW, HCURSOR, hCursor, 24, 4, 4); - TEST_FIELD(WNDCLASSW, HBRUSH, hbrBackground, 28, 4, 4); - TEST_FIELD(WNDCLASSW, LPCWSTR, lpszMenuName, 32, 4, 4); - TEST_FIELD(WNDCLASSW, LPCWSTR, lpszClassName, 36, 4, 4); + TEST_TYPE_SIZE (WNDCLASSW, 40) + TEST_TYPE_ALIGN (WNDCLASSW, 4) + TEST_FIELD_SIZE (WNDCLASSW, style, 4) + TEST_FIELD_ALIGN (WNDCLASSW, style, 4) + TEST_FIELD_OFFSET(WNDCLASSW, style, 0) + TEST_FIELD_SIZE (WNDCLASSW, lpfnWndProc, 4) + TEST_FIELD_ALIGN (WNDCLASSW, lpfnWndProc, 4) + TEST_FIELD_OFFSET(WNDCLASSW, lpfnWndProc, 4) + TEST_FIELD_SIZE (WNDCLASSW, cbClsExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSW, cbClsExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSW, cbClsExtra, 8) + TEST_FIELD_SIZE (WNDCLASSW, cbWndExtra, 4) + TEST_FIELD_ALIGN (WNDCLASSW, cbWndExtra, 4) + TEST_FIELD_OFFSET(WNDCLASSW, cbWndExtra, 12) + TEST_FIELD_SIZE (WNDCLASSW, hInstance, 4) + TEST_FIELD_ALIGN (WNDCLASSW, hInstance, 4) + TEST_FIELD_OFFSET(WNDCLASSW, hInstance, 16) + TEST_FIELD_SIZE (WNDCLASSW, hIcon, 4) + TEST_FIELD_ALIGN (WNDCLASSW, hIcon, 4) + TEST_FIELD_OFFSET(WNDCLASSW, hIcon, 20) + TEST_FIELD_SIZE (WNDCLASSW, hCursor, 4) + TEST_FIELD_ALIGN (WNDCLASSW, hCursor, 4) + TEST_FIELD_OFFSET(WNDCLASSW, hCursor, 24) + TEST_FIELD_SIZE (WNDCLASSW, hbrBackground, 4) + TEST_FIELD_ALIGN (WNDCLASSW, hbrBackground, 4) + TEST_FIELD_OFFSET(WNDCLASSW, hbrBackground, 28) + TEST_FIELD_SIZE (WNDCLASSW, lpszMenuName, 4) + TEST_FIELD_ALIGN (WNDCLASSW, lpszMenuName, 4) + TEST_FIELD_OFFSET(WNDCLASSW, lpszMenuName, 32) + TEST_FIELD_SIZE (WNDCLASSW, lpszClassName, 4) + TEST_FIELD_ALIGN (WNDCLASSW, lpszClassName, 4) + TEST_FIELD_OFFSET(WNDCLASSW, lpszClassName, 36) } static void test_pack_WNDENUMPROC(void) { /* WNDENUMPROC */ - TEST_TYPE(WNDENUMPROC, 4, 4); + TEST_TYPE_SIZE (WNDENUMPROC, 4) + TEST_TYPE_ALIGN (WNDENUMPROC, 4) } static void test_pack_WNDPROC(void) { /* WNDPROC */ - TEST_TYPE(WNDPROC, 4, 4); + TEST_TYPE_SIZE (WNDPROC, 4) + TEST_TYPE_ALIGN (WNDPROC, 4) } static void test_pack(void) @@ -2477,5 +3835,9 @@ static void test_pack(void) START_TEST(generated) { +#ifdef _WIN64 + ok(0, "The type size / alignment tests don't support Win64 yet\n"); +#else test_pack(); +#endif } diff --git a/rostests/winetests/user32/input.c b/rostests/winetests/user32/input.c index 4297fe21877..889244f0e3a 100755 --- a/rostests/winetests/user32/input.c +++ b/rostests/winetests/user32/input.c @@ -44,6 +44,9 @@ * */ +#define _WIN32_WINNT 0x401 +#define _WIN32_IE 0x0500 + #include #include @@ -60,7 +63,7 @@ static long timetag = 0x10000000; static UINT (WINAPI *pSendInput) (UINT, INPUT*, size_t); static int (WINAPI *pGetMouseMovePointsEx) (UINT, LPMOUSEMOVEPOINT, LPMOUSEMOVEPOINT, int, DWORD); -#define MAXKEYEVENTS 6 +#define MAXKEYEVENTS 10 #define MAXKEYMESSAGES MAXKEYEVENTS /* assuming a key event generates one and only one message */ @@ -200,7 +203,7 @@ static int KbdMessage( KEV kev, WPARAM *pwParam, LPARAM *plParam ) * . retrieve the messages from the input queue * . verify */ -static void do_test( HWND hwnd, int seqnr, const KEV td[] ) +static BOOL do_test( HWND hwnd, int seqnr, const KEV td[] ) { INPUT inputs[MAXKEYEVENTS]; KMSG expmsg[MAXKEYEVENTS]; @@ -233,22 +236,27 @@ static void do_test( HWND hwnd, int seqnr, const KEV td[] ) MSGNAME[msg.message - WM_KEYFIRST], msg.wParam, msg.lParam, msg.time); if( i < kmctr ) { ok( msg.message == expmsg[i].message && - msg.wParam == expmsg[i].wParam && - msg.lParam == expmsg[i].lParam, - "wrong message! expected:\n" - "message[%d] %-15s wParam %04lx lParam %08lx\n",i, - MSGNAME[(expmsg[i]).message - WM_KEYFIRST], - expmsg[i].wParam, expmsg[i].lParam ); + msg.wParam == expmsg[i].wParam && + msg.lParam == expmsg[i].lParam, + "%u/%u: wrong message %x/%08lx/%08lx expected %s/%08lx/%08lx\n", + seqnr, i, msg.message, msg.wParam, msg.lParam, + MSGNAME[(expmsg[i]).message - WM_KEYFIRST], expmsg[i].wParam, expmsg[i].lParam ); } i++; } if (winetest_debug > 1) trace("%d messages retrieved\n", i); + if (!i && kmctr) + { + skip( "simulated keyboard input doesn't work\n" ); + return FALSE; + } ok( i == kmctr, "message count is wrong: got %d expected: %d\n", i, kmctr); + return TRUE; } /* test all combinations of the specified key events */ -static void TestASet( HWND hWnd, int nrkev, const KEV kevdwn[], const KEV kevup[] ) +static BOOL TestASet( HWND hWnd, int nrkev, const KEV kevdwn[], const KEV kevup[] ) { int i,j,k,l,m,n; static int count=0; @@ -263,7 +271,7 @@ static void TestASet( HWND hWnd, int nrkev, const KEV kevdwn[], const KEV kevup[ kbuf[1] = kevdwn[1-i]; kbuf[2] = kevup[j]; kbuf[3] = kevup[1-j]; - do_test( hWnd, count++, kbuf); + if (!do_test( hWnd, count++, kbuf)) return FALSE; } } } @@ -285,7 +293,7 @@ static void TestASet( HWND hWnd, int nrkev, const KEV kevdwn[], const KEV kevup[ kbuf[3] = kevup[l]; kbuf[4] = kevup[m]; kbuf[5] = kevup[n]; - do_test( hWnd, count++, kbuf); + if (!do_test( hWnd, count++, kbuf)) return FALSE; } } } @@ -293,6 +301,7 @@ static void TestASet( HWND hWnd, int nrkev, const KEV kevdwn[], const KEV kevup[ } } } + return TRUE; } /* test each set specified in the global testkeyset array */ @@ -300,30 +309,13 @@ static void TestSysKeys( HWND hWnd) { int i; for(i=0; testkeyset[i].nrkev;i++) - TestASet( hWnd, testkeyset[i].nrkev, testkeyset[i].keydwn, - testkeyset[i].keyup); + if (!TestASet( hWnd, testkeyset[i].nrkev, testkeyset[i].keydwn, testkeyset[i].keyup)) break; } static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { - switch (msg) { - case WM_USER: - SetFocus(hWnd); - /* window has focus, now do the test */ - if( hWnd == hWndTest) TestSysKeys( hWnd); - /* finished :-) */ - break; - - case WM_DESTROY: - PostQuitMessage( 0 ); - break; - - default: - return( DefWindowProcA( hWnd, msg, wParam, lParam ) ); - } - - return 0; + return DefWindowProcA( hWnd, msg, wParam, lParam ); } static void test_Input_whitebox(void) @@ -336,24 +328,28 @@ static void test_Input_whitebox(void) wclass.style = CS_HREDRAW | CS_VREDRAW; wclass.lpfnWndProc = WndProc; wclass.hInstance = hInstance; - wclass.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION ); - wclass.hCursor = LoadCursorA( NULL, IDC_ARROW); - wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1); + wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); wclass.lpszMenuName = 0; wclass.cbClsExtra = 0; wclass.cbWndExtra = 0; - assert (RegisterClassA( &wclass )); + RegisterClassA( &wclass ); /* create the test window that will receive the keystrokes */ - assert ( hWndTest = CreateWindowA( wclass.lpszClassName, "InputSysKeyTest", - WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100, - NULL, NULL, hInstance, NULL) ); + hWndTest = CreateWindowA( wclass.lpszClassName, "InputSysKeyTest", + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100, + NULL, NULL, hInstance, NULL); + assert( hWndTest ); ShowWindow( hWndTest, SW_SHOW); + SetWindowPos( hWndTest, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); + SetForegroundWindow( hWndTest ); UpdateWindow( hWndTest); /* flush pending messages */ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); - SendMessageA(hWndTest, WM_USER, 0, 0); + SetFocus( hWndTest ); + TestSysKeys( hWndTest ); DestroyWindow(hWndTest); } @@ -374,7 +370,6 @@ static void empty_message_queue(void) DispatchMessage(&msg); } diff = time - GetTickCount(); - min_timeout = 20; } } @@ -575,12 +570,15 @@ struct sendinput_test_s { /* RMENU == LMENU */ /* 38 */ {VK_RMENU, 0, 0, - {{VK_MENU, 0x00}, {VK_LMENU, 0x00}, {0}}, - {{WM_SYSKEYDOWN, hook|wparam, VK_RMENU}, + {{VK_MENU, 0x00}, {VK_LMENU, 0x00}, {VK_CONTROL, 0x00, 1}, {VK_LCONTROL, 0x01, 1}, {0}}, + {{WM_SYSKEYDOWN, hook|wparam|optional, VK_LCONTROL}, + {WM_SYSKEYDOWN, hook|wparam, VK_RMENU}, {WM_SYSKEYDOWN, wparam|lparam, VK_MENU, 0}, {0}}}, {VK_RMENU, KEYEVENTF_KEYUP, 1, - {{VK_MENU, 0x80}, {VK_LMENU, 0x80}, {0}}, - {{WM_KEYUP, hook|wparam, VK_RMENU}, + {{VK_MENU, 0x80}, {VK_LMENU, 0x80}, {VK_CONTROL, 0x81, 1}, {VK_LCONTROL, 0x80, 1}, {0}}, + {{WM_KEYUP, hook|wparam|optional, VK_LCONTROL}, + {WM_KEYUP, hook|wparam, VK_RMENU}, + {WM_SYSKEYUP, wparam|lparam|optional, VK_CONTROL, KF_UP}, {WM_SYSKEYUP, wparam|lparam, VK_MENU, KF_UP}, {WM_SYSCOMMAND}, {0}}}, /* LMENU | KEYEVENTF_EXTENDEDKEY == RMENU */ @@ -597,12 +595,15 @@ struct sendinput_test_s { /* RMENU | KEYEVENTF_EXTENDEDKEY == RMENU */ /* 42 */ {VK_RMENU, KEYEVENTF_EXTENDEDKEY, 0, - {{VK_MENU, 0x00}, {VK_RMENU, 0x00}, {0}}, - {{WM_SYSKEYDOWN, hook|wparam|lparam, VK_RMENU, LLKHF_EXTENDED}, + {{VK_MENU, 0x00}, {VK_RMENU, 0x00}, {VK_CONTROL, 0x00, 1}, {VK_LCONTROL, 0x01, 1}, {0}}, + {{WM_SYSKEYDOWN, hook|wparam|lparam|optional, VK_LCONTROL, 0}, + {WM_SYSKEYDOWN, hook|wparam|lparam, VK_RMENU, LLKHF_EXTENDED}, {WM_SYSKEYDOWN, wparam|lparam, VK_MENU, KF_EXTENDED}, {0}}}, {VK_RMENU, KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY, 1, - {{VK_MENU, 0x80}, {VK_RMENU, 0x80}, {0}}, - {{WM_KEYUP, hook|wparam|lparam, VK_RMENU, LLKHF_UP|LLKHF_EXTENDED}, + {{VK_MENU, 0x80}, {VK_RMENU, 0x80}, {VK_CONTROL, 0x81, 1}, {VK_LCONTROL, 0x80, 1}, {0}}, + {{WM_KEYUP, hook|wparam|lparam|optional, VK_LCONTROL, LLKHF_UP}, + {WM_KEYUP, hook|wparam|lparam, VK_RMENU, LLKHF_UP|LLKHF_EXTENDED}, + {WM_SYSKEYUP, wparam|lparam|optional, VK_CONTROL, KF_UP}, {WM_SYSKEYUP, wparam|lparam, VK_MENU, KF_UP|KF_EXTENDED}, {WM_SYSCOMMAND}, {0}}}, /* MENU == LMENU */ @@ -619,12 +620,14 @@ struct sendinput_test_s { /* MENU | KEYEVENTF_EXTENDEDKEY == RMENU */ /* 46 */ {VK_MENU, KEYEVENTF_EXTENDEDKEY, 0, - {{VK_MENU, 0x00}, {VK_RMENU, 0x00}, {0}}, - {{WM_SYSKEYDOWN, hook/*|wparam*/|lparam, VK_MENU, LLKHF_EXTENDED}, + {{VK_MENU, 0x00}, {VK_RMENU, 0x00}, {VK_CONTROL, 0x00, 1}, {VK_LCONTROL, 0x01, 1}, {0}}, + {{WM_SYSKEYDOWN, hook|wparam|lparam|optional, VK_CONTROL, 0}, + {WM_SYSKEYDOWN, hook/*|wparam*/|lparam, VK_MENU, LLKHF_EXTENDED}, {WM_SYSKEYDOWN, wparam|lparam, VK_MENU, KF_EXTENDED}, {0}}}, {VK_MENU, KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY, 1, - {{VK_MENU, 0x80}, {VK_RMENU, 0x80}, {0}}, - {{WM_KEYUP, hook/*|wparam*/|lparam, VK_MENU, LLKHF_UP|LLKHF_EXTENDED}, + {{VK_MENU, 0x80}, {VK_RMENU, 0x80}, {VK_CONTROL, 0x81, 1}, {VK_LCONTROL, 0x80, 1}, {0}}, + {{WM_KEYUP, hook|wparam|lparam|optional, VK_CONTROL, LLKHF_UP}, + {WM_KEYUP, hook/*|wparam*/|lparam, VK_MENU, LLKHF_UP|LLKHF_EXTENDED}, {WM_SYSKEYUP, wparam|lparam, VK_MENU, KF_UP|KF_EXTENDED}, {WM_SYSCOMMAND}, {0}}}, @@ -665,7 +668,7 @@ static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, struct sendinput_tes int matched = ((ks1[t->wVk]&0x80) == (t->before_state&0x80) && (ks2[t->wVk]&0x80) == (~t->before_state&0x80)); - if (!matched && test->_todo_wine) + if (!matched && !t->optional && test->_todo_wine) { failcount++; todo_wine { @@ -701,12 +704,13 @@ static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, struct sendinput_tes if (expected->message == actual->message) { - ok((expected->flags & hook) == (actual->flags & hook), - "%2d (%x/%x): the msg 0x%04x should have been sent by a hook\n", - id, test->wVk, test->dwFlags, expected->message); - if (expected->flags & wparam) { + if ((expected->flags & optional) && (expected->wParam != actual->wParam)) + { + expected++; + continue; + } if (expected->wParam != actual->wParam && test->_todo_wine) { failcount++; @@ -733,6 +737,10 @@ static void compare_and_check(int id, BYTE *ks1, BYTE *ks2, struct sendinput_tes "%2d (%x/%x): in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", id, test->wVk, test->dwFlags, expected->message, expected->lParam, actual->lParam); } + ok((expected->flags & hook) == (actual->flags & hook), + "%2d (%x/%x): the msg 0x%04x should have been sent by a hook\n", + id, test->wVk, test->dwFlags, expected->message); + } else if (expected->flags & optional) { @@ -794,12 +802,17 @@ static LRESULT CALLBACK WndProc2(HWND hWnd, UINT Msg, WPARAM wParam, Msg != WM_NCHITTEST && Msg != WM_GETTEXT && Msg != WM_GETICON && + Msg != WM_IME_SELECT && Msg != WM_DEVICECHANGE) { - sent_messages[sent_messages_cnt].message = Msg; - sent_messages[sent_messages_cnt].flags = 0; - sent_messages[sent_messages_cnt].wParam = wParam; - sent_messages[sent_messages_cnt++].lParam = HIWORD(lParam) & (KF_UP|KF_EXTENDED); + ok(sent_messages_cnt < MAXKEYMESSAGES, "Too many messages\n"); + if (sent_messages_cnt < MAXKEYMESSAGES) + { + sent_messages[sent_messages_cnt].message = Msg; + sent_messages[sent_messages_cnt].flags = 0; + sent_messages[sent_messages_cnt].wParam = wParam; + sent_messages[sent_messages_cnt++].lParam = HIWORD(lParam) & (KF_UP|KF_EXTENDED); + } } return DefWindowProc(hWnd, Msg, wParam, lParam); } @@ -810,10 +823,14 @@ static LRESULT CALLBACK hook_proc(int code, WPARAM wparam, LPARAM lparam) if (code == HC_ACTION) { - sent_messages[sent_messages_cnt].message = wparam; - sent_messages[sent_messages_cnt].flags = hook; - sent_messages[sent_messages_cnt].wParam = hook_info->vkCode; - sent_messages[sent_messages_cnt++].lParam = hook_info->flags & (LLKHF_UP|LLKHF_EXTENDED); + ok(sent_messages_cnt < MAXKEYMESSAGES, "Too many messages\n"); + if (sent_messages_cnt < MAXKEYMESSAGES) + { + sent_messages[sent_messages_cnt].message = wparam; + sent_messages[sent_messages_cnt].flags = hook; + sent_messages[sent_messages_cnt].wParam = hook_info->vkCode; + sent_messages[sent_messages_cnt++].lParam = hook_info->flags & (LLKHF_UP|LLKHF_EXTENDED); + } if(0) /* For some reason not stable on Wine */ { @@ -838,16 +855,12 @@ static void test_Input_blackbox(void) HWND window; HHOOK hook; - if (!pSendInput) - { - skip("SendInput is not available\n"); - return; - } - window = CreateWindow("Static", NULL, WS_POPUP|WS_HSCROLL|WS_VSCROLL |WS_VISIBLE, 0, 0, 200, 60, NULL, NULL, NULL, NULL); ok(window != NULL, "error: %d\n", (int) GetLastError()); + SetWindowPos( window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); + SetForegroundWindow( window ); hook = SetWindowsHookExA(WH_KEYBOARD_LL, hook_proc, GetModuleHandleA( NULL ), 0); @@ -872,6 +885,11 @@ static void test_Input_blackbox(void) pSendInput(1, (INPUT*)&i, sizeof(TEST_INPUT)); empty_message_queue(); GetKeyboardState(ks2); + if (!ii && !sent_messages_cnt && !memcmp( ks1, ks2, sizeof(ks1) )) + { + win_skip( "window doesn't receive the queued input\n" ); + break; + } compare_and_check(ii, ks1, ks2, &sendinput_test[ii]); } @@ -1170,7 +1188,8 @@ static void test_key_map(void) s = MapVirtualKeyEx(VK_SHIFT, MAPVK_VK_TO_VSC, kl); ok(s != 0, "MapVirtualKeyEx(VK_SHIFT) should return non-zero\n"); sL = MapVirtualKeyEx(VK_LSHIFT, MAPVK_VK_TO_VSC, kl); - ok(s == sL, "%x != %x\n", s, sL); + ok(s == sL || broken(sL == 0), /* win9x */ + "%x != %x\n", s, sL); kL = MapVirtualKeyEx(0x2a, MAPVK_VSC_TO_VK, kl); ok(kL == VK_SHIFT, "Scan code -> vKey = %x (not VK_SHIFT)\n", kL); @@ -1178,9 +1197,11 @@ static void test_key_map(void) ok(kR == VK_SHIFT, "Scan code -> vKey = %x (not VK_SHIFT)\n", kR); kL = MapVirtualKeyEx(0x2a, MAPVK_VSC_TO_VK_EX, kl); - ok(kL == VK_LSHIFT, "Scan code -> vKey = %x (not VK_LSHIFT)\n", kL); + ok(kL == VK_LSHIFT || broken(kL == 0), /* win9x */ + "Scan code -> vKey = %x (not VK_LSHIFT)\n", kL); kR = MapVirtualKeyEx(0x36, MAPVK_VSC_TO_VK_EX, kl); - ok(kR == VK_RSHIFT, "Scan code -> vKey = %x (not VK_RSHIFT)\n", kR); + ok(kR == VK_RSHIFT || broken(kR == 0), /* win9x */ + "Scan code -> vKey = %x (not VK_RSHIFT)\n", kR); /* test that MAPVK_VSC_TO_VK prefers the non-numpad vkey if there's ambiguity */ for (i = 0; i < sizeof(numpad_collisions)/sizeof(numpad_collisions[0]); i++) @@ -1213,7 +1234,7 @@ static void test_ToUnicode(void) ret = ToUnicode(VK_RETURN, SC_RETURN, state, wStr, 2, 0); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - skip("ToUnicode is not implemented\n"); + win_skip("ToUnicode is not implemented\n"); return; } @@ -1237,23 +1258,32 @@ static void test_ToUnicode(void) todo_wine ok(ret == 0, "ToUnicode for CTRL + SHIFT + Return didn't return 0 (was %i)\n", ret); } +static void test_get_async_key_state(void) +{ + /* input value sanity checks */ + ok(0 == GetAsyncKeyState(1000000), "GetAsyncKeyState did not return 0\n"); + ok(0 == GetAsyncKeyState(-1000000), "GetAsyncKeyState did not return 0\n"); +} + START_TEST(input) { init_function_pointers(); - if (!pSendInput) - skip("SendInput is not available\n"); - else + if (pSendInput) + { + test_Input_blackbox(); test_Input_whitebox(); + } + else win_skip("SendInput is not available\n"); - test_Input_blackbox(); test_keynames(); test_mouse_ll_hook(); test_key_map(); test_ToUnicode(); + test_get_async_key_state(); if(pGetMouseMovePointsEx) test_GetMouseMovePointsEx(); else - skip("GetMouseMovePointsEx is not available\n"); + win_skip("GetMouseMovePointsEx is not available\n"); } diff --git a/rostests/winetests/user32/listbox.c b/rostests/winetests/user32/listbox.c index c8723576335..0aef698dbf5 100644 --- a/rostests/winetests/user32/listbox.c +++ b/rostests/winetests/user32/listbox.c @@ -50,7 +50,7 @@ static HWND create_listbox (DWORD add_style, HWND parent) { HWND handle; - int ctl_id=0; + INT_PTR ctl_id=0; if (parent) ctl_id=1; handle=CreateWindow ("LISTBOX", "TestList", @@ -59,10 +59,10 @@ create_listbox (DWORD add_style, HWND parent) parent, (HMENU)ctl_id, NULL, 0); assert (handle); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[0]); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[1]); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[2]); - SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) strings[3]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[0]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[1]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[2]); + SendMessage (handle, LB_ADDSTRING, 0, (LPARAM) strings[3]); #ifdef VISIBLE ShowWindow (handle, SW_SHOW); @@ -287,7 +287,7 @@ static void test_ownerdraw(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandle(0); cls.hIcon = 0; - cls.hCursor = LoadCursor(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursor(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "main_window_class"; @@ -569,6 +569,7 @@ static void test_listbox_LB_DIR(void) char pathBuffer[MAX_PATH]; char * p; char driveletter; + const char *wildcard = "*"; HANDLE file; file = CreateFileA( "wtest1.tmp.c", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); @@ -587,12 +588,13 @@ static void test_listbox_LB_DIR(void) /* Test for standard usage */ /* This should list all the files in the test directory. */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, 0, (LPARAM)pathBuffer); if (res == -1) /* "*" wildcard doesn't work on win9x */ { - strcpy(pathBuffer, "*.*"); + wildcard = "*.*"; + strcpy(pathBuffer, wildcard); res = SendMessage(hList, LB_DIR, 0, (LPARAM)pathBuffer); } ok (res >= 0, "SendMessage(LB_DIR, 0, *) failed - 0x%08x\n", GetLastError()); @@ -647,15 +649,9 @@ static void test_listbox_LB_DIR(void) } /* Test DDL_DIRECTORY */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, DDL_DIRECTORY, (LPARAM)pathBuffer); - if (res == -1 || res <= itemCount_allFiles) /* "*" wildcard doesn't work on win9x */ - { - strcpy(pathBuffer, "*.*"); - SendMessage(hList, LB_RESETCONTENT, 0, 0); - res = SendMessage(hList, LB_DIR, DDL_DIRECTORY, (LPARAM)pathBuffer); - } ok (res > 0, "SendMessage(LB_DIR, DDL_DIRECTORY, *) failed - 0x%08x\n", GetLastError()); /* There should be some content in the listbox. @@ -711,7 +707,7 @@ static void test_listbox_LB_DIR(void) /* Test DDL_DRIVES|DDL_EXCLUSIVE */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, DDL_DRIVES|DDL_EXCLUSIVE, (LPARAM)pathBuffer); ok (res >= 0, "SendMessage(LB_DIR, DDL_DRIVES|DDL_EXCLUSIVE, *) failed - 0x%08x\n", GetLastError()); @@ -758,7 +754,7 @@ static void test_listbox_LB_DIR(void) itemCount_justFiles, itemCount_justDrives); /* Test DDL_DRIVES. */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, DDL_DRIVES, (LPARAM)pathBuffer); ok (res > 0, "SendMessage(LB_DIR, DDL_DRIVES, *) failed - 0x%08x\n", GetLastError()); @@ -769,8 +765,7 @@ static void test_listbox_LB_DIR(void) * been added. */ itemCount = SendMessage(hList, LB_GETCOUNT, 0, 0); - ok (itemCount == itemCount_justDrives + itemCount_allFiles || - broken(itemCount == itemCount_justDrives), /* "*" wildcard broken on win9x */ + ok (itemCount == itemCount_justDrives + itemCount_allFiles, "SendMessage(LB_DIR, DDL_DRIVES, *) filled with %d entries, expected %d\n", itemCount, itemCount_justDrives + itemCount_allFiles); ok(res + 1 == itemCount, "SendMessage(LB_DIR, DDL_DRIVES, *) returned incorrect index!\n"); @@ -822,7 +817,7 @@ static void test_listbox_LB_DIR(void) /* Test DDL_DIRECTORY|DDL_DRIVES. This does *not* imply DDL_EXCLUSIVE */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, DDL_DIRECTORY|DDL_DRIVES, (LPARAM)pathBuffer); ok (res > 0, "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_DRIVES, *) failed - 0x%08x\n", GetLastError()); @@ -831,8 +826,7 @@ static void test_listbox_LB_DIR(void) * be exactly the number of plain files, plus the number of mapped drives. */ itemCount = SendMessage(hList, LB_GETCOUNT, 0, 0); - ok (itemCount == itemCount_allFiles + itemCount_justDrives + itemCount_allDirs || - broken(itemCount == itemCount_justDrives + itemCount_allDirs), /* "*" wildcard broken on win9x */ + ok (itemCount == itemCount_allFiles + itemCount_justDrives + itemCount_allDirs, "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_DRIVES) filled with %d entries, expected %d\n", itemCount, itemCount_allFiles + itemCount_justDrives + itemCount_allDirs); ok(res + 1 == itemCount, "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_DRIVES, w*.c) returned incorrect index!\n"); @@ -898,7 +892,7 @@ static void test_listbox_LB_DIR(void) } /* Test DDL_DIRECTORY|DDL_EXCLUSIVE. */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, (LPARAM)pathBuffer); ok (res != -1, "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err %u\n", GetLastError()); @@ -940,7 +934,7 @@ static void test_listbox_LB_DIR(void) itemCount, 0); /* Test DDL_DIRECTORY|DDL_DRIVES|DDL_EXCLUSIVE. */ - strcpy(pathBuffer, "*"); + strcpy(pathBuffer, wildcard); SendMessage(hList, LB_RESETCONTENT, 0, 0); res = SendMessage(hList, LB_DIR, DDL_DIRECTORY|DDL_DRIVES|DDL_EXCLUSIVE, (LPARAM)pathBuffer); ok (res > 0, "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_DRIVES|DDL_EXCLUSIVE, w*.c,) failed - 0x%08x\n", GetLastError()); diff --git a/rostests/winetests/user32/menu.c b/rostests/winetests/user32/menu.c index adc9410d22c..4d0e7d4ad3f 100755 --- a/rostests/winetests/user32/menu.c +++ b/rostests/winetests/user32/menu.c @@ -169,8 +169,8 @@ static LRESULT WINAPI menu_ownerdraw_wnd_proc(HWND hwnd, UINT msg, RECT rc; GetMenuItemRect( hwnd, (HMENU)pdis->hwndItem, pdis->itemData ,&rc); trace("WM_DRAWITEM received hwnd %p hmenu %p itemdata %ld item %d rc %d,%d-%d,%d itemrc: %d,%d-%d,%d\n", - hwnd, (HMENU)pdis->hwndItem, pdis->itemData, - pdis->itemID, pdis->rcItem.left, pdis->rcItem.top, + hwnd, pdis->hwndItem, pdis->itemData, pdis->itemID, + pdis->rcItem.left, pdis->rcItem.top, pdis->rcItem.right,pdis->rcItem.bottom, rc.left,rc.top,rc.right,rc.bottom); oldpen=SelectObject( pdis->hDC, GetStockObject( @@ -285,7 +285,7 @@ static void test_menu_ownerdraw(void) NULL, NULL, NULL, NULL); ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError()); if( !hwnd) return; - SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG)menu_ownerdraw_wnd_proc); + SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_ownerdraw_wnd_proc); hmenu = CreatePopupMenu(); ok(hmenu != NULL, "CreateMenu failed with error %d\n", GetLastError()); if( !hmenu) { DestroyWindow(hwnd);return;} @@ -293,7 +293,7 @@ static void test_menu_ownerdraw(void) for( j=0;j<2;j++) /* create columns */ for(i=0;i<2;i++) { /* create rows */ ret = AppendMenu( hmenu, MF_OWNERDRAW | - (i==0 ? MF_MENUBREAK : 0), k, (LPCTSTR) k); + (i==0 ? MF_MENUBREAK : 0), k, MAKEINTRESOURCE(k)); k++; ok( ret, "AppendMenu failed for %d\n", k-1); } @@ -444,53 +444,56 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, DrawMenuBar( hwnd); } ret = GetMenuItemRect( hwnd, hmenu, 0, &rc); - /* check menu width */ - if( ispop) - expect = ( text || hbmp ? - 4 + (mnuopt != 1 ? GetSystemMetrics(SM_CXMENUCHECK) : 0) - : 0) + - arrowwidth + MOD_avec + (hbmp ? bmpsize.cx + 2 : 0) + - (text && hastab ? /* TAB space */ - MOD_avec + ( hastab==2 ? sc_size.cx : 0) : 0) + - (text ? 2 + (text[0] ? size.cx :0): 0) ; - else - expect = !(text || hbmp) ? 0 : - ( hbmp ? (text ? 2:0) + bmpsize.cx : 0 ) + - (text ? 2 * MOD_avec + (text[0] ? size.cx :0): 0) ; - ok( rc.right - rc.left == expect, + if (0) /* comment out menu size checks, behavior is different in almost every Windows version */ + { + /* check menu width */ + if( ispop) + expect = ( text || hbmp ? + 4 + (mnuopt != 1 ? GetSystemMetrics(SM_CXMENUCHECK) : 0) + : 0) + + arrowwidth + MOD_avec + (hbmp ? bmpsize.cx + 2 : 0) + + (text && hastab ? /* TAB space */ + MOD_avec + ( hastab==2 ? sc_size.cx : 0) : 0) + + (text ? 2 + (text[0] ? size.cx :0): 0) ; + else + expect = !(text || hbmp) ? 0 : + ( hbmp ? (text ? 2:0) + bmpsize.cx : 0 ) + + (text ? 2 * MOD_avec + (text[0] ? size.cx :0): 0) ; + ok( rc.right - rc.left == expect, "menu width wrong, got %d expected %d\n", rc.right - rc.left, expect); - failed = failed || !(rc.right - rc.left == expect); - /* check menu height */ - if( ispop) - expect = max( ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : 0), - max( (text ? max( 2 + size.cy, MOD_hic + 4) : 0), - (hbmp ? bmpsize.cy + 2 : 0))); - else - expect = ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : - max( GetSystemMetrics( SM_CYMENU) - 1, (hbmp ? bmpsize.cy : 0))); - ok( rc.bottom - rc.top == expect, + failed = failed || !(rc.right - rc.left == expect); + /* check menu height */ + if( ispop) + expect = max( ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : 0), + max( (text ? max( 2 + size.cy, MOD_hic + 4) : 0), + (hbmp ? bmpsize.cy + 2 : 0))); + else + expect = ( !(text || hbmp) ? GetSystemMetrics( SM_CYMENUSIZE)/2 : + max( GetSystemMetrics( SM_CYMENU) - 1, (hbmp ? bmpsize.cy : 0))); + ok( rc.bottom - rc.top == expect, "menu height wrong, got %d expected %d (%d)\n", rc.bottom - rc.top, expect, GetSystemMetrics( SM_CYMENU)); - failed = failed || !(rc.bottom - rc.top == expect); - if( hbmp == HBMMENU_CALLBACK && MOD_GotDrawItemMsg) { - /* check the position of the bitmap */ - /* horizontal */ - if (!ispop) - expect = 3; - else if (mnuopt == 0) - expect = 4 + GetSystemMetrics(SM_CXMENUCHECK); - else if (mnuopt == 1) - expect = 4; - else /* mnuopt == 2 */ - expect = 2; - ok( expect == MOD_rc[0].left, + failed = failed || !(rc.bottom - rc.top == expect); + if( hbmp == HBMMENU_CALLBACK && MOD_GotDrawItemMsg) { + /* check the position of the bitmap */ + /* horizontal */ + if (!ispop) + expect = 3; + else if (mnuopt == 0) + expect = 4 + GetSystemMetrics(SM_CXMENUCHECK); + else if (mnuopt == 1) + expect = 4; + else /* mnuopt == 2 */ + expect = 2; + ok( expect == MOD_rc[0].left, "bitmap left is %d expected %d\n", MOD_rc[0].left, expect); - failed = failed || !(expect == MOD_rc[0].left); - /* vertical */ - expect = (rc.bottom - rc.top - MOD_rc[0].bottom + MOD_rc[0].top) / 2; - ok( expect == MOD_rc[0].top, + failed = failed || !(expect == MOD_rc[0].left); + /* vertical */ + expect = (rc.bottom - rc.top - MOD_rc[0].bottom + MOD_rc[0].top) / 2; + ok( expect == MOD_rc[0].top, "bitmap top is %d expected %d\n", MOD_rc[0].top, expect); - failed = failed || !(expect == MOD_rc[0].top); + failed = failed || !(expect == MOD_rc[0].top); + } } /* if there was a failure, report details */ if( failed) { @@ -524,7 +527,7 @@ static void test_menu_bmp_and_string(void) if( !pGetMenuInfo) { - skip("GetMenuInfo is not available\n"); + win_skip("GetMenuInfo is not available\n"); return; } @@ -538,7 +541,7 @@ static void test_menu_bmp_and_string(void) ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError()); if( !hwnd) return; - SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG)menu_ownerdraw_wnd_proc); + SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_ownerdraw_wnd_proc); if( winetest_debug) trace(" check %d,%d arrow %d avechar %d\n", @@ -552,7 +555,7 @@ static void test_menu_bmp_and_string(void) for( szidx=0; szidx < sizeof( bmsizes) / sizeof( SIZE); szidx++) { HBITMAP hbm = CreateBitmap( bmsizes[szidx].cx, bmsizes[szidx].cy,1,1,bmfill); HBITMAP bitmaps[] = { HBMMENU_CALLBACK, hbm, NULL }; - ok( (int)hbm, "CreateBitmap failed err %d\n", GetLastError()); + ok( hbm != 0, "CreateBitmap failed err %d\n", GetLastError()); for( txtidx = 0; txtidx < sizeof(MOD_txtsizes)/sizeof(MOD_txtsizes[0]); txtidx++) { for( hassub = 0; hassub < 2 ; hassub++) { /* add submenu item */ for( mnuopt = 0; mnuopt < 3 ; mnuopt++){ /* test MNS_NOCHECK/MNS_CHECKORBMP */ @@ -630,9 +633,9 @@ static void test_menu_add_string( void ) ok (!strcmp( strback, "Dummy string" ), "Menu text from Ansi version incorrect\n"); SetLastError(0xdeadbeef); - ret = GetMenuStringW( hmenu, 0, (WCHAR *)strbackW, 99, MF_BYPOSITION); + ret = GetMenuStringW( hmenu, 0, strbackW, 99, MF_BYPOSITION ); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - skip("GetMenuStringW is not implemented\n"); + win_skip("GetMenuStringW is not implemented\n"); else { ok (ret, "GetMenuStringW on ownerdraw entry failed\n"); @@ -695,7 +698,7 @@ static void test_menu_add_string( void ) SetLastError(0xdeadbeef); ret = GetMenuStringW( hmenu, 0, NULL, 0, MF_BYPOSITION); if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - skip("GetMenuStringW is not implemented\n"); + win_skip("GetMenuStringW is not implemented\n"); else ok (!ret, "GetMenuStringW on ownerdraw entry succeeded.\n"); @@ -717,130 +720,173 @@ static WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ) return dst; } +static void insert_menu_item( int line, HMENU hmenu, BOOL ansi, UINT mask, UINT type, UINT state, UINT id, + HMENU submenu, HBITMAP checked, HBITMAP unchecked, ULONG_PTR data, + void *type_data, UINT len, HBITMAP item, BOOL expect ) +{ + MENUITEMINFOA info; + BOOL ret; -#define DMIINFF( i, e, field)\ - ok((int)((i)->field)==(int)((e)->field) || (int)((i)->field)==(0xffff & (int)((e)->field)), \ - "%s got 0x%x expected 0x%x\n", #field, (int)((i)->field), (int)((e)->field)); + /* magic bitmap handle to test smaller cbSize */ + if (item == (HBITMAP)(ULONG_PTR)0xdeadbeef) + info.cbSize = FIELD_OFFSET(MENUITEMINFOA,hbmpItem); + else + info.cbSize = sizeof(info); + info.fMask = mask; + info.fType = type; + info.fState = state; + info.wID = id; + info.hSubMenu = submenu; + info.hbmpChecked = checked; + info.hbmpUnchecked = unchecked; + info.dwItemData = data; + info.dwTypeData = type_data; + info.cch = len; + info.hbmpItem = item; + SetLastError( 0xdeadbeef ); + if (ansi) ret = InsertMenuItemA( hmenu, 0, TRUE, &info ); + else ret = InsertMenuItemW( hmenu, 0, TRUE, (MENUITEMINFOW*)&info ); + if (!expect) ok_(__FILE__, line)( !ret, "InsertMenuItem should have failed.\n" ); + else ok_(__FILE__, line)( ret, "InsertMenuItem failed, err %u\n", GetLastError()); +} -#define DUMPMIINF(s,i,e)\ -{\ - DMIINFF( i, e, fMask)\ - DMIINFF( i, e, fType)\ - DMIINFF( i, e, fState)\ - DMIINFF( i, e, wID)\ - DMIINFF( i, e, hSubMenu)\ - DMIINFF( i, e, hbmpChecked)\ - DMIINFF( i, e, hbmpUnchecked)\ - DMIINFF( i, e, dwItemData)\ - DMIINFF( i, e, dwTypeData)\ - DMIINFF( i, e, cch)\ - if( s==sizeof(MENUITEMINFOA)) DMIINFF( i, e, hbmpItem)\ -} +static void check_menu_item_info( int line, HMENU hmenu, BOOL ansi, UINT mask, UINT type, UINT state, + UINT id, HMENU submenu, HBITMAP checked, HBITMAP unchecked, + ULONG_PTR data, void *type_data, UINT in_len, UINT out_len, + HBITMAP item, LPCSTR expname, BOOL expect, BOOL expstring ) +{ + MENUITEMINFOA info; + BOOL ret; + WCHAR buffer[80]; -/* insert menu item */ -#define TMII_INSMI( a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,\ - eret1)\ -{\ - MENUITEMINFOA info1=a1 b1,c1,d1,e1,f1,(void*)g1,(void*)h1,(void*)i1,j1,(void*)k1,l1,(void*)m1 n1;\ - HMENU hmenu = CreateMenu();\ - BOOL ret, stop = FALSE;\ - SetLastError( 0xdeadbeef);\ - if(ansi)strcpy( string, init);\ - else strcpyW( (WCHAR*)string, (WCHAR*)init);\ - if( ansi) ret = InsertMenuItemA(hmenu, 0, TRUE, &info1 );\ - else ret = InsertMenuItemW(hmenu, 0, TRUE, (MENUITEMINFOW*)&info1 );\ - if( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)\ - {\ - skip("InsertMenuItem%s not implemented\n", ansi ? "A" : "W");\ - break;\ - }\ - if( !(eret1)) { ok( (eret1)==ret,"InsertMenuItem should have failed.\n");\ - stop = TRUE;\ - } else ok( (eret1)==ret,"InsertMenuItem failed, err %d\n",GetLastError());\ + SetLastError( 0xdeadbeef ); + memset( &info, 0xcc, sizeof(info) ); + info.cbSize = sizeof(info); + info.fMask = mask; + info.dwTypeData = type_data; + info.cch = in_len; + ret = ansi ? GetMenuItemInfoA( hmenu, 0, TRUE, &info ) : + GetMenuItemInfoW( hmenu, 0, TRUE, (MENUITEMINFOW *)&info ); + if (!expect) + { + ok_(__FILE__, line)( !ret, "GetMenuItemInfo should have failed.\n" ); + return; + } + ok_(__FILE__, line)( ret, "GetMenuItemInfo failed, err %u\n", GetLastError()); + if (mask & MIIM_TYPE) + ok_(__FILE__, line)( info.fType == type || info.fType == LOWORD(type), + "wrong type %x/%x\n", info.fType, type ); + if (mask & MIIM_STATE) + ok_(__FILE__, line)( info.fState == state || info.fState == LOWORD(state), + "wrong state %x/%x\n", info.fState, state ); + if (mask & MIIM_ID) + ok_(__FILE__, line)( info.wID == id || info.wID == LOWORD(id), + "wrong id %x/%x\n", info.wID, id ); + if (mask & MIIM_SUBMENU) + ok_(__FILE__, line)( info.hSubMenu == submenu || (ULONG_PTR)info.hSubMenu == LOWORD(submenu), + "wrong submenu %p/%p\n", info.hSubMenu, submenu ); + if (mask & MIIM_CHECKMARKS) + { + ok_(__FILE__, line)( info.hbmpChecked == checked || (ULONG_PTR)info.hbmpChecked == LOWORD(checked), + "wrong bmpchecked %p/%p\n", info.hbmpChecked, checked ); + ok_(__FILE__, line)( info.hbmpUnchecked == unchecked || (ULONG_PTR)info.hbmpUnchecked == LOWORD(unchecked), + "wrong bmpunchecked %p/%p\n", info.hbmpUnchecked, unchecked ); + } + if (mask & MIIM_DATA) + ok_(__FILE__, line)( info.dwItemData == data || info.dwItemData == LOWORD(data), + "wrong item data %lx/%lx\n", info.dwItemData, data ); + if (mask & MIIM_BITMAP) + ok_(__FILE__, line)( info.hbmpItem == item || (ULONG_PTR)info.hbmpItem == LOWORD(item), + "wrong bmpitem %p/%p\n", info.hbmpItem, item ); + ok_(__FILE__, line)( info.dwTypeData == type_data || (ULONG_PTR)info.dwTypeData == LOWORD(type_data), + "wrong type data %p/%p\n", info.dwTypeData, type_data ); + ok_(__FILE__, line)( info.cch == out_len, "wrong len %x/%x\n", info.cch, out_len ); + if (expname) + { + if(ansi) + ok_(__FILE__, line)( !strncmp( expname, info.dwTypeData, out_len ), + "menu item name differed from '%s' '%s'\n", expname, info.dwTypeData ); + else + ok_(__FILE__, line)( !strncmpW( (WCHAR *)expname, (WCHAR *)info.dwTypeData, out_len ), + "menu item name wrong\n" ); + + SetLastError( 0xdeadbeef ); + ret = ansi ? GetMenuStringA( hmenu, 0, (char *)buffer, 80, MF_BYPOSITION ) : + GetMenuStringW( hmenu, 0, buffer, 80, MF_BYPOSITION ); + if (expstring) + ok_(__FILE__, line)( ret, "GetMenuString failed, err %u\n", GetLastError()); + else + ok_(__FILE__, line)( !ret, "GetMenuString should have failed\n" ); + } +} + +static void modify_menu( int line, HMENU hmenu, BOOL ansi, UINT flags, UINT_PTR id, void *data ) +{ + BOOL ret; + + SetLastError( 0xdeadbeef ); + if (ansi) ret = ModifyMenuA( hmenu, 0, flags, id, data ); + else ret = ModifyMenuW( hmenu, 0, flags, id, data ); + ok_(__FILE__,line)( ret, "ModifyMenuA failed, err %u\n", GetLastError()); +} + +static void set_menu_item_info( int line, HMENU hmenu, BOOL ansi, UINT mask, UINT type, UINT state, + UINT id, HMENU submenu, HBITMAP checked, HBITMAP unchecked, ULONG_PTR data, + void *type_data, UINT len, HBITMAP item ) + +{ + MENUITEMINFOA info; + BOOL ret; + + /* magic bitmap handle to test smaller cbSize */ + if (item == (HBITMAP)(ULONG_PTR)0xdeadbeef) + info.cbSize = FIELD_OFFSET(MENUITEMINFOA,hbmpItem); + else + info.cbSize = sizeof(info); + info.fMask = mask; + info.fType = type; + info.fState = state; + info.wID = id; + info.hSubMenu = submenu; + info.hbmpChecked = checked; + info.hbmpUnchecked = unchecked; + info.dwItemData = data; + info.dwTypeData = type_data; + info.cch = len; + info.hbmpItem = item; + SetLastError( 0xdeadbeef ); + if (ansi) ret = SetMenuItemInfoA( hmenu, 0, TRUE, &info ); + else ret = SetMenuItemInfoW( hmenu, 0, TRUE, (MENUITEMINFOW*)&info ); + ok_(__FILE__, line)( ret, "SetMenuItemInfo failed, err %u\n", GetLastError()); +} + +#define TMII_INSMI( c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,eret1 )\ + hmenu = CreateMenu();\ + submenu = CreateMenu();\ + if(ansi)strcpy( string, init );\ + else strcpyW( string, init );\ + insert_menu_item( __LINE__, hmenu, ansi, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1, eret1 ) /* GetMenuItemInfo + GetMenuString */ -#define TMII_GMII( a2,b2,c2,d2,e2,f2,g2,h2,i2,j2,k2,l2,m2,n2,\ - a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,n3,\ +#define TMII_GMII( c2,l2,\ + d3,e3,f3,g3,h3,i3,j3,k3,l3,m3,\ expname, eret2, eret3)\ -{\ - MENUITEMINFOA info2A=a2 b2,c2,d2,e2,f2,(void*)g2,(void*)h2,(void*)i2,j2,(void*)k2,l2,(void*)m2 n2;\ - MENUITEMINFOA einfoA=a3 b3,c3,d3,e3,f3,(void*)g3,(void*)h3,(void*)i3,j3,(void*)k3,l3,(void*)m3 n3;\ - MENUITEMINFOA *info2 = &info2A;\ - MENUITEMINFOA *einfo = &einfoA;\ - MENUITEMINFOW *info2W = (MENUITEMINFOW *)&info2A;\ - if( !stop) {\ - SetLastError( 0xdeadbeef);\ - ret = ansi ? GetMenuItemInfoA( hmenu, 0, TRUE, info2 ) :\ - GetMenuItemInfoW( hmenu, 0, TRUE, info2W );\ - if( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)\ - {\ - skip("GetMenuItemInfo%s not implemented\n", ansi ? "A" : "W");\ - break;\ - }\ - if( !(eret2)) ok( (eret2)==ret,"GetMenuItemInfo should have failed.\n");\ - else { \ - ok( (eret2)==ret,"GetMenuItemInfo failed, err %d\n",GetLastError());\ - ret = memcmp( info2, einfo, sizeof einfoA);\ - /* ok( ret==0, "Got wrong menu item info data\n");*/\ - if( ret) DUMPMIINF(info2A.cbSize, &info2A, &einfoA)\ - if( einfo->dwTypeData == string) {\ - if(ansi) ok( !strncmp( expname, info2->dwTypeData, einfo->cch ), "menu item name differed \"%s\"\n",\ - einfo->dwTypeData ? einfo->dwTypeData: "");\ - else ok( !strncmpW( (WCHAR*)expname, (WCHAR*)info2->dwTypeData, einfo->cch ), "menu item name differed \"%s\"\n",\ - einfo->dwTypeData ? einfo->dwTypeData: "");\ - ret = ansi ? GetMenuStringA( hmenu, 0, string, 80, MF_BYPOSITION) :\ - GetMenuStringW( hmenu, 0, string, 80, MF_BYPOSITION);\ - if( (eret3)){\ - ok( ret, "GetMenuString failed, err %d\n",GetLastError());\ - }else\ - ok( !ret, "GetMenuString should have failed\n");\ - }\ - }\ - }\ -} + check_menu_item_info( __LINE__, hmenu, ansi, c2, d3, e3, f3, g3, h3, i3, j3, k3, l2, l3, m3, \ + expname, eret2, eret3 ) #define TMII_DONE \ RemoveMenu(hmenu, 0, TRUE );\ DestroyMenu( hmenu );\ - DestroyMenu( submenu );\ -submenu = CreateMenu();\ -} + DestroyMenu( submenu ); + /* modify menu */ -#define TMII_MODM( flags, id, data, eret )\ -if( !stop) {\ - SetLastError( 0xdeadbeef);\ - if(ansi)ret = ModifyMenuA( hmenu, 0, flags, (UINT_PTR)id, (char*)data);\ - else ret = ModifyMenuW( hmenu, 0, flags, (UINT_PTR)id, (WCHAR*)data);\ - if( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)\ - {\ - skip("ModifyMenu%s not implemented\n", ansi ? "A" : "W");\ - break;\ - }\ - if( !(eret)) ok( (eret)==ret,"ModifyMenuA should have failed.\n");\ - else ok( (eret)==ret,"ModifyMenuA failed, err %d\n",GetLastError());\ -} +#define TMII_MODM( flags, id, data ) \ + modify_menu( __LINE__, hmenu, ansi, flags, id, data ) /* SetMenuItemInfo */ -#define TMII_SMII( a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,\ - eret1)\ -if( !stop) {\ - MENUITEMINFOA info1=a1 b1,c1,d1,e1,f1,(void*)g1,(void*)h1,(void*)i1,j1,(void*)k1,l1,(void*)m1 n1;\ - SetLastError( 0xdeadbeef);\ - if(ansi)strcpy( string, init);\ - else strcpyW( (WCHAR*)string, (WCHAR*)init);\ - if( ansi) ret = SetMenuItemInfoA(hmenu, 0, TRUE, &info1 );\ - else ret = SetMenuItemInfoW(hmenu, 0, TRUE, (MENUITEMINFOW*)&info1 );\ - if( GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)\ - {\ - skip("SetMenuItemInfo%s not implemented\n", ansi ? "A" : "W");\ - break;\ - }\ - if( !(eret1)) { ok( (eret1)==ret,"InsertMenuItem should have failed.\n");\ - stop = TRUE;\ - } else ok( (eret1)==ret,"InsertMenuItem failed, err %d\n",GetLastError());\ -} - +#define TMII_SMII( c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1 ) \ + set_menu_item_info( __LINE__, hmenu, ansi, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1 ) #define OK 1 @@ -849,7 +895,6 @@ if( !stop) {\ static void test_menu_iteminfo( void ) { - int S=sizeof( MENUITEMINFOA); int ansi = TRUE; char txtA[]="wine"; char initA[]="XYZ"; @@ -860,7 +905,8 @@ static void test_menu_iteminfo( void ) void *txt, *init, *empty, *string; HBITMAP hbm = CreateBitmap(1,1,1,1,NULL); char stringA[0x80]; - HMENU submenu=CreateMenu(); + HMENU hmenu, submenu=CreateMenu(); + HBITMAP dummy_hbm = (HBITMAP)(ULONG_PTR)0xdeadbeef; do { if( ansi) {txt=txtA;init=initA;empty=emptyA;string=stringA;} @@ -868,481 +914,465 @@ static void test_menu_iteminfo( void ) trace( "%s string %p hbm %p txt %p\n", ansi ? "ANSI tests: " : "Unicode tests:", string, hbm, txt); /* test all combinations of MFT_STRING, MFT_OWNERDRAW and MFT_BITMAP */ /* (since MFT_STRING is zero, there are four of them) */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, 0, 0, 0, 0, 0, 0, txt, 0, 0, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, 0, 0, 0, 0, 0, 0, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, 0, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_STRING|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 0, 0, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, hbm, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, hbm, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, ER ); TMII_DONE /* not enough space for name*/ - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, NULL, 0, -9, }, - {, S, MIIM_TYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, NULL, 4, 0, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 0, + MFT_STRING, 0, 0, 0, 0, 0, 0, NULL, 4, 0, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 5, -9, }, - {, S, MIIM_TYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 5, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 4, -9, }, - {, S, MIIM_TYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 3, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 4, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 3, 0, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, NULL, 0, -9, }, - {, S, MIIM_TYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING, MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 0, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 0, 0, + NULL, OK, ER ); TMII_DONE /* cannot combine MIIM_TYPE with some other flags */ - TMII_INSMI( {, S, MIIM_TYPE|MIIM_STRING, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, ER) - TMII_GMII ( {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE|MIIM_STRING, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_STRING, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - empty, ER, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_STRING, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + NULL, ER, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE|MIIM_FTYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, ER) - TMII_GMII ( {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE|MIIM_FTYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - empty, ER, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_FTYPE, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + NULL, ER, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE|MIIM_BITMAP, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, 6, hbm, }, ER) - TMII_GMII ( {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE|MIIM_BITMAP, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, 6, hbm, ER ); TMII_DONE /* but succeeds with some others */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_SUBMENU, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE|MIIM_SUBMENU, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_SUBMENU, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_STATE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE|MIIM_STATE, MFT_STRING, 0, -9, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_STATE, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE|MIIM_ID, MFT_STRING, -1, 888, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_ID, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE|MIIM_ID, MFT_STRING, -9, 888, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE|MIIM_ID, MFT_STRING, -1, 888, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_ID, 80, + MFT_STRING, 0, 888, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE|MIIM_DATA, MFT_STRING, -1, -1, -1, -1, -1, 999, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_DATA, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE|MIIM_DATA, MFT_STRING, -9, -9, 0, -9, -9, 999, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE|MIIM_DATA, MFT_STRING, -1, -1, 0, 0, 0, 999, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_DATA, 80, + MFT_STRING, 0, 0, 0, 0, 0, 999, string, 4, 0, + txt, OK, OK ); TMII_DONE /* to be continued */ /* set text with MIIM_TYPE and retrieve with MIIM_STRING */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, -9, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE /* set text with MIIM_TYPE and retrieve with MIIM_STRING; MFT_OWNERDRAW causes an empty string */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 0, -9, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_STRING|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 0, -9, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 80, -9, }, - init, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_GMII ( MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 80, 0, + init, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, 0, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, 0, -9, -9, -9, 0, -9, -9, -9, string, 80, -9, }, - init, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( 0, 80, + 0, 0, 0, 0, 0, 0, 0, string, 80, 0, + init, OK, OK ); TMII_DONE /* contrary to MIIM_TYPE,you can set the text for an owner draw menu */ - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 4, -9, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE /* same but retrieve with MIIM_TYPE */ - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 0, -9, }, - empty, OK, ER ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, string, 0, -9, }, - empty, OK, ER ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); TMII_DONE /* How is that with bitmaps? */ - TMII_INSMI( {, S, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, ER ) + TMII_INSMI( MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_BITMAP|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_BITMAP|MIIM_FTYPE, 0, -9, -9, 0, -9, -9, -9, string, 80, hbm, }, - init, OK, ER ) + TMII_INSMI( MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_GMII ( MIIM_BITMAP|MIIM_FTYPE, 80, + 0, 0, 0, 0, 0, 0, 0, string, 80, hbm, + init, OK, ER ); TMII_DONE /* MIIM_BITMAP does not like MFT_BITMAP */ - TMII_INSMI( {, S, MIIM_BITMAP|MIIM_FTYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, ER) - TMII_GMII ( {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - init, OK, OK ) + TMII_INSMI( MIIM_BITMAP|MIIM_FTYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, 0, -1, hbm, ER ); TMII_DONE /* no problem with OWNERDRAWN */ - TMII_INSMI( {, S, MIIM_BITMAP|MIIM_FTYPE, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_BITMAP|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_BITMAP|MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 80, hbm, }, - init, OK, ER ) + TMII_INSMI( MIIM_BITMAP|MIIM_FTYPE, MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_GMII ( MIIM_BITMAP|MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 80, hbm, + init, OK, ER ); TMII_DONE /* setting MFT_BITMAP with MFT_FTYPE fails anyway */ - TMII_INSMI( {, S, MIIM_FTYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, ER) - TMII_GMII ( {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - empty, OK, OK ) + TMII_INSMI( MIIM_FTYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, 0, -1, 0, ER ); TMII_DONE /* menu with submenu */ - TMII_INSMI( {, S, MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, submenu, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_SUBMENU, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_SUBMENU, -9, -9, -9, submenu, -9, -9, -9, string, 80, -9, }, - init, OK, ER ) + TMII_INSMI( MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, submenu, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( MIIM_SUBMENU, 80, + 0, 0, 0, submenu, 0, 0, 0, string, 80, 0, + init, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, submenu, -1, -1, -1, empty, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_SUBMENU, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_SUBMENU, -9, -9, -9, submenu, -9, -9, -9, string, 80, -9, }, - init, OK, ER ) + TMII_INSMI( MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, submenu, 0, 0, -1, empty, 0, 0, OK ); + TMII_GMII ( MIIM_SUBMENU, 80, + 0, 0, 0, submenu, 0, 0, 0, string, 80, 0, + init, OK, ER ); TMII_DONE /* menu with submenu, without MIIM_SUBMENU the submenufield is cleared */ - TMII_INSMI( {, S, MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, submenu, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING|MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, string, 0, -9, }, - empty, OK, ER ) - TMII_GMII ( {, S, MIIM_SUBMENU|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_SUBMENU|MIIM_FTYPE, MFT_SEPARATOR, -9, -9, submenu, -9, -9, -9, string, 80, -9, }, - empty, OK, ER ) + TMII_INSMI( MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, submenu, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_STRING|MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); + TMII_GMII ( MIIM_SUBMENU|MIIM_FTYPE, 80, + MFT_SEPARATOR, 0, 0, submenu, 0, 0, 0, string, 80, 0, + empty, OK, ER ); TMII_DONE /* menu with invalid submenu */ - TMII_INSMI( {, S, MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, 999, -1, -1, -1, txt, 0, -1, }, ER) - TMII_GMII ( {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - {, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, - init, OK, ER ) + TMII_INSMI( MIIM_SUBMENU|MIIM_FTYPE, MFT_STRING, -1, -1, (HMENU)999, 0, 0, -1, txt, 0, 0, ER ); TMII_DONE /* Separator */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, txt, 0, 0, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, 0, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, 0, 0, 0, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP|MFT_SEPARATOR, -1, -1, -1, -1, -1, -1, hbm, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP|MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP|MFT_SEPARATOR, -1, -1, 0, 0, 0, -1, hbm, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP|MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, ER ); TMII_DONE /* SEPARATOR and STRING go well together */ /* BITMAP and STRING go well together */ - TMII_INSMI( {, S, MIIM_STRING|MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, hbm, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, hbm, + txt, OK, OK ); TMII_DONE /* BITMAP, SEPARATOR and STRING go well together */ - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, string, 4, hbm, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, string, 4, hbm, + txt, OK, OK ); TMII_DONE /* last two tests, but use MIIM_TYPE to retrieve info */ - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING, MFT_SEPARATOR, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING, MFT_SEPARATOR, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_STRING|MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP, -9, -9, 0, -9, -9, -9, hbm, 4, hbm, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP, 0, 0, 0, 0, 0, 0, hbm, 4, hbm, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR|MFT_BITMAP, -9, -9, 0, -9, -9, -9, hbm, 4, hbm, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR|MFT_BITMAP, 0, 0, 0, 0, 0, 0, hbm, 4, hbm, + NULL, OK, OK ); TMII_DONE /* same three with MFT_OWNERDRAW */ - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING, MFT_SEPARATOR|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 6, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING, MFT_SEPARATOR|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 6, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, hbm, 4, hbm, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, hbm, 4, hbm, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR|MFT_BITMAP|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, hbm, 4, hbm, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR|MFT_BITMAP|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, hbm, 4, hbm, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE|MIIM_ID, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE|MIIM_ID, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE /* test with modifymenu: string is preserved after setting OWNERDRAW */ - TMII_INSMI( {, S, MIIM_STRING, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_MODM( MFT_OWNERDRAW, -1, 787, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_DATA, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_DATA, MFT_OWNERDRAW, -9, -9, 0, -9, -9, 787, string, 4, -9, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_MODM( MFT_OWNERDRAW, -1, (void*)787 ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_DATA, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 787, string, 4, 0, + txt, OK, OK ); TMII_DONE /* same with bitmap: now the text is cleared */ - TMII_INSMI( {, S, MIIM_STRING, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_MODM( MFT_BITMAP, 545, hbm, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, MFT_BITMAP, -9, 545, 0, -9, -9, -9, string, 0, hbm, }, - empty, OK, ER ) + TMII_INSMI( MIIM_STRING, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_MODM( MFT_BITMAP, 545, hbm ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, 80, + MFT_BITMAP, 0, 545, 0, 0, 0, 0, string, 0, hbm, + empty, OK, ER ); TMII_DONE /* start with bitmap: now setting text clears it (though he flag is raised) */ - TMII_INSMI( {, S, MIIM_BITMAP, MFT_STRING, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, MFT_STRING, -9, 0, 0, -9, -9, -9, string, 0, hbm, }, - empty, OK, ER ) - TMII_MODM( MFT_STRING, 545, txt, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, MFT_STRING, -9, 545, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_BITMAP, MFT_STRING, -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 0, hbm, + empty, OK, ER ); + TMII_MODM( MFT_STRING, 545, txt ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, 80, + MFT_STRING, 0, 545, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE /*repeat with text NULL */ - TMII_INSMI( {, S, MIIM_BITMAP, MFT_STRING, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_MODM( MFT_STRING, 545, NULL, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, MFT_SEPARATOR, -9, 545, 0, -9, -9, -9, string, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_BITMAP, MFT_STRING, -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_MODM( MFT_STRING, 545, NULL ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, 80, + MFT_SEPARATOR, 0, 545, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); TMII_DONE /* repeat with text "" */ - TMII_INSMI( {, S, MIIM_BITMAP, -1 , -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_MODM( MFT_STRING, 545, empty, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, MFT_STRING, -9, 545, 0, -9, -9, -9, string, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_BITMAP, -1 , -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_MODM( MFT_STRING, 545, empty ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_ID, 80, + MFT_STRING, 0, 545, 0, 0, 0, 0, string, 0, 0, + empty, OK, ER ); TMII_DONE /* start with bitmap: set ownerdraw */ - TMII_INSMI( {, S, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_MODM( MFT_OWNERDRAW, -1, 232, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_DATA, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_DATA, MFT_OWNERDRAW, -9, -9, 0, -9, -9, 232, string, 0, hbm, }, - empty, OK, ER ) + TMII_INSMI( MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, 0, -1, hbm, OK ); + TMII_MODM( MFT_OWNERDRAW, -1, (void *)232 ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP|MIIM_DATA, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 232, string, 0, hbm, + empty, OK, ER ); TMII_DONE /* ask nothing */ - TMII_INSMI( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, 0, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, 0, -9, -9, -9, 0, -9, -9, -9, string, 80, -9, }, - init, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, 0, 0, 0, -1, txt, 6, hbm, OK ); + TMII_GMII ( 0, 80, + 0, 0, 0, 0, 0, 0, 0, string, 80, 0, + init, OK, OK ); TMII_DONE - /* some tests with small cbSize: the hbmpItem is to be ignored */ - TMII_INSMI( {, S - 4, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, NULL, 0, NULL, }, - empty, OK, ER ) + /* some tests with small cbSize: the hbmpItem is to be ignored */ + TMII_INSMI( MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, 0, -1, dummy_hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, NULL, 0, NULL, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S - 4, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_BITMAP|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_BITMAP|MIIM_FTYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, string, 80, NULL, }, - init, OK, ER ) + TMII_INSMI( MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, 0, -1, dummy_hbm, OK ); + TMII_GMII ( MIIM_BITMAP|MIIM_FTYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, string, 80, NULL, + init, OK, ER ); TMII_DONE - TMII_INSMI( {, S - 4, MIIM_STRING|MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_BITMAP, -1, -1, -1, 0, 0, 0, -1, txt, 6, dummy_hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, NULL, + txt, OK, OK ); TMII_DONE - TMII_INSMI( {, S - 4, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR, -1, -1, 0, 0, 0, -1, txt, 6, dummy_hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S - 4, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 6, dummy_hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE - TMII_INSMI( {, S - 4, MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR|MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, txt, 6, hbm, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_SEPARATOR|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 4, NULL, }, - txt, OK, OK ) + TMII_INSMI( MIIM_FTYPE|MIIM_STRING|MIIM_BITMAP, MFT_SEPARATOR|MFT_OWNERDRAW, -1, -1, 0, 0, 0, -1, txt, 6, dummy_hbm, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_SEPARATOR|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 4, NULL, + NULL, OK, OK ); TMII_DONE /* MIIM_TYPE by itself does not get/set the dwItemData for OwnerDrawn menus */ - TMII_INSMI( {, S, MIIM_TYPE|MIIM_DATA, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, 343, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_DATA, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE|MIIM_DATA, MFT_STRING|MFT_OWNERDRAW, -9, -9, 0, -9, -9, 343, 0, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE|MIIM_DATA, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, 343, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_DATA, 80, + MFT_STRING|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 343, 0, 0, 0, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE|MIIM_DATA, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, 343, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, 0, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE|MIIM_DATA, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, 343, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_STRING|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 0, 0, + NULL, OK, ER ); TMII_DONE - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, -1, -1, -1, 343, txt, 0, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE|MIIM_DATA, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE|MIIM_DATA, MFT_STRING|MFT_OWNERDRAW, -9, -9, 0, -9, -9, 0, 0, 0, 0, }, - empty, OK, ER ) + TMII_INSMI( MIIM_TYPE, MFT_STRING|MFT_OWNERDRAW, -1, -1, 0, 0, 0, 343, txt, 0, 0, OK ); + TMII_GMII ( MIIM_TYPE|MIIM_DATA, 80, + MFT_STRING|MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 0, 0, + NULL, OK, ER ); TMII_DONE /* set a string menu to ownerdraw with MIIM_TYPE */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_STRING, -2, -2, -2, -2, -2, -2, txt, -2, -2, }, OK) - TMII_SMII( {, S, MIIM_TYPE, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, string, 4, -9, }, - txt, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_STRING, -2, -2, 0, 0, 0, -2, txt, -2, 0, OK ); + TMII_SMII ( MIIM_TYPE, MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 0, 0 ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE /* test with modifymenu add submenu */ - TMII_INSMI( {, S, MIIM_STRING, MFT_STRING, -1, -1, -1, -1, -1, -1, txt, 0, -1, }, OK) - TMII_MODM( MF_POPUP, submenu, txt, OK) - TMII_GMII ( {, S, MIIM_FTYPE|MIIM_STRING|MIIM_SUBMENU, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_FTYPE|MIIM_STRING|MIIM_SUBMENU, MFT_STRING, -9, -9, submenu, -9, -9, -9, string, 4, -9, }, - txt, OK, OK ) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_TYPE, MFT_STRING, -9, -9, 0, -9, -9, -9, string, 4, 0, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING, MFT_STRING, -1, -1, 0, 0, 0, -1, txt, 0, 0, OK ); + TMII_MODM( MF_POPUP, (UINT_PTR)submenu, txt ); + TMII_GMII ( MIIM_FTYPE|MIIM_STRING|MIIM_SUBMENU, 80, + MFT_STRING, 0, 0, submenu, 0, 0, 0, string, 4, 0, + txt, OK, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_STRING, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE /* MFT_SEPARATOR bit is kept when the text is added */ - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_SMII( {, S, MIIM_STRING, -1, -1, -1, -1, -1, -1, -1, txt, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_STRING|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_STRING|MIIM_FTYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, string, 4, -9, }, - txt, OK, OK ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_SMII( MIIM_STRING, 0, 0, 0, 0, 0, 0, 0, txt, 0, 0 ); + TMII_GMII ( MIIM_STRING|MIIM_FTYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, string, 4, 0, + txt, OK, OK ); TMII_DONE /* MFT_SEPARATOR bit is kept when bitmap is added */ - TMII_INSMI( {, S, MIIM_STRING|MIIM_FTYPE, MFT_STRING, -1, -1, -1, -1, -1, -1, NULL, 0, -1, }, OK) - TMII_SMII( {, S, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, hbm, }, OK) - TMII_GMII ( {, S, MIIM_BITMAP|MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, string, 80, -9, }, - {, S, MIIM_BITMAP|MIIM_FTYPE, MFT_SEPARATOR, -9, -9, 0, -9, -9, -9, string, 80, hbm, }, - init, OK, ER ) + TMII_INSMI( MIIM_STRING|MIIM_FTYPE, MFT_STRING, -1, -1, 0, 0, 0, -1, NULL, 0, 0, OK ); + TMII_SMII( MIIM_BITMAP, 0, 0, 0, 0, 0, 0, 0, 0, 0, hbm ); + TMII_GMII ( MIIM_BITMAP|MIIM_FTYPE, 80, + MFT_SEPARATOR, 0, 0, 0, 0, 0, 0, string, 80, hbm, + init, OK, ER ); TMII_DONE /* Bitmaps inserted with MIIM_TYPE and MFT_BITMAP: Only the low word of the dwTypeData is used. Use a magic bitmap here (Word 95 uses this to create its MDI menu buttons) */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP | MFT_RIGHTJUSTIFY, -1, -1, -1, -1, -1, -1, MAKELONG(HBMMENU_MBAR_CLOSE, 0x1234), -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP | MFT_RIGHTJUSTIFY, -9, -9, 0, -9, -9, -9, HBMMENU_MBAR_CLOSE, 0, HBMMENU_MBAR_CLOSE, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP | MFT_RIGHTJUSTIFY, -1, -1, 0, 0, 0, -1, + (HMENU)MAKELONG(HBMMENU_MBAR_CLOSE, 0x1234), -1, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP | MFT_RIGHTJUSTIFY, 0, 0, 0, 0, 0, 0, HBMMENU_MBAR_CLOSE, 0, HBMMENU_MBAR_CLOSE, + NULL, OK, OK ); TMII_DONE /* Type flags */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, OK ); TMII_DONE /* State flags */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_SMII( {, S, MIIM_STATE, -1, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, -1, -1, -1, -1, -1, -1, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_STATE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_STATE, -9, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, -9, 0, -9, -9, -9, -9, -9, -9, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_SMII( MIIM_STATE, -1, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, 0, 0, 0, 0, 0, 0, 0, 0 ); + TMII_GMII ( MIIM_STATE, 80, + 0, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, 0, 0, 0, 0, 0, 0, 80, 0, + NULL, OK, OK ); TMII_DONE /* The style MFT_RADIOCHECK cannot be set with MIIM_CHECKMARKS only */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_SMII( {, S, MIIM_CHECKMARKS, MFT_RADIOCHECK, -1, -1, -1, hbm, hbm, -1, -1, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_CHECKMARKS | MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_CHECKMARKS | MIIM_TYPE, MFT_BITMAP, -9, -9, 0, hbm, hbm, -9, hbm, 0, hbm, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_SMII( MIIM_CHECKMARKS, MFT_RADIOCHECK, 0, 0, 0, hbm, hbm, 0, 0, 0, 0 ); + TMII_GMII ( MIIM_CHECKMARKS | MIIM_TYPE, 80, + MFT_BITMAP, 0, 0, 0, hbm, hbm, 0, hbm, 0, hbm, + NULL, OK, OK ); TMII_DONE /* MFT_BITMAP is added automatically by GetMenuItemInfo() for MIIM_TYPE */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_SMII( {, S, MIIM_FTYPE, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, 0x1234, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, -9, -9, -9, }, - empty, OK, OK ) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP | MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, OK ) - TMII_GMII ( {, S, MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, -9, -9, -9, }, - empty, OK, OK ) - TMII_SMII( {, S, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 0, NULL, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_SMII( MIIM_FTYPE, MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, (HBITMAP)0x1234, 0, 0 ); + TMII_GMII ( MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 80, 0, + NULL, OK, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP | MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, OK ); + TMII_GMII ( MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 80, 0, + NULL, OK, OK ); + TMII_SMII( MIIM_BITMAP, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 0, NULL, + NULL, OK, OK ); TMII_DONE /* Bitmaps inserted with MIIM_TYPE and MFT_BITMAP: Only the low word of the dwTypeData is used. Use a magic bitmap here (Word 95 uses this to create its MDI menu buttons) */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP | MFT_RIGHTJUSTIFY, -1, -1, -1, -1, -1, -1, MAKELONG(HBMMENU_MBAR_CLOSE, 0x1234), -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP | MFT_RIGHTJUSTIFY, -9, -9, 0, -9, -9, -9, HBMMENU_MBAR_CLOSE, 0, HBMMENU_MBAR_CLOSE, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP | MFT_RIGHTJUSTIFY, -1, -1, 0, 0, 0, -1, + (HMENU)MAKELONG(HBMMENU_MBAR_CLOSE, 0x1234), -1, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP | MFT_RIGHTJUSTIFY, 0, 0, 0, 0, 0, 0, HBMMENU_MBAR_CLOSE, 0, HBMMENU_MBAR_CLOSE, + NULL, OK, OK ); TMII_DONE /* Type flags */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP | MFT_MENUBARBREAK | MFT_RADIOCHECK | MFT_RIGHTJUSTIFY | MFT_RIGHTORDER, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, OK ); TMII_DONE /* State flags */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_SMII( {, S, MIIM_STATE, -1, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, -1, -1, -1, -1, -1, -1, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_STATE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_STATE, -9, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, -9, 0, -9, -9, -9, -9, -9, -9, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_SMII( MIIM_STATE, -1, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, 0, 0, 0, 0, 0, 0, 0, 0 ); + TMII_GMII ( MIIM_STATE, 80, + 0, MFS_CHECKED | MFS_DEFAULT | MFS_GRAYED | MFS_HILITE, 0, 0, 0, 0, 0, 0, 80, 0, + NULL, OK, OK ); TMII_DONE /* The style MFT_RADIOCHECK cannot be set with MIIM_CHECKMARKS only */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_SMII( {, S, MIIM_CHECKMARKS, MFT_RADIOCHECK, -1, -1, -1, hbm, hbm, -1, -1, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_CHECKMARKS | MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_CHECKMARKS | MIIM_TYPE, MFT_BITMAP, -9, -9, 0, hbm, hbm, -9, hbm, 0, hbm, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_SMII( MIIM_CHECKMARKS, MFT_RADIOCHECK, 0, 0, 0, hbm, hbm, 0, 0, 0, 0 ); + TMII_GMII ( MIIM_CHECKMARKS | MIIM_TYPE, 80, + MFT_BITMAP, 0, 0, 0, hbm, hbm, 0, hbm, 0, hbm, + NULL, OK, OK ); TMII_DONE /* MFT_BITMAP is added automatically by GetMenuItemInfo() for MIIM_TYPE */ - TMII_INSMI( {, S, MIIM_TYPE, MFT_BITMAP, -1, -1, -1, -1, -1, -1, hbm, -1, -1, }, OK) - TMII_SMII( {, S, MIIM_FTYPE, MFT_OWNERDRAW, -1, -1, -1, -1, -1, -1, 0x1234, -1, -1, }, OK) - TMII_GMII ( {, S, MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, -9, -9, -9, }, - empty, OK, OK ) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_BITMAP | MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, hbm, 0, hbm, }, - empty, OK, OK ) - TMII_GMII ( {, S, MIIM_FTYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_FTYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, -9, -9, -9, }, - empty, OK, OK ) - TMII_SMII( {, S, MIIM_BITMAP, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL, }, OK) - TMII_GMII ( {, S, MIIM_TYPE, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, }, - {, S, MIIM_TYPE, MFT_OWNERDRAW, -9, -9, 0, -9, -9, -9, NULL, 0, NULL, }, - empty, OK, OK ) + TMII_INSMI( MIIM_TYPE, MFT_BITMAP, -1, -1, 0, 0, 0, -1, hbm, -1, 0, OK ); + TMII_SMII( MIIM_FTYPE, MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, (HBITMAP)0x1234, 0, 0 ); + TMII_GMII ( MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 80, 0, + NULL, OK, OK ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_BITMAP | MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, hbm, 0, hbm, + NULL, OK, OK ); + TMII_GMII ( MIIM_FTYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, 0, 80, 0, + NULL, OK, OK ); + TMII_SMII( MIIM_BITMAP, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL ); + TMII_GMII ( MIIM_TYPE, 80, + MFT_OWNERDRAW, 0, 0, 0, 0, 0, 0, NULL, 0, NULL, + NULL, OK, OK ); TMII_DONE } while( !(ansi = !ansi) ); DeleteObject( hbm); @@ -1607,7 +1637,7 @@ static void test_menu_search_bycommand( void ) rc = GetMenuItemInfo(hmenu, (UINT_PTR)hmenuSub2, FALSE, &info); ok (rc, "Getting the menus info failed\n"); - ok (info.wID == (UINT)hmenuSub2, "IDs differ for popup menu\n"); + ok (info.wID == (UINT_PTR)hmenuSub2, "IDs differ for popup menu\n"); ok (!strcmp(info.dwTypeData, "Submenu2"), "Returned item has wrong label (%s)\n", info.dwTypeData); DestroyMenu( hmenu ); @@ -1825,9 +1855,9 @@ static void test_menu_input(void) { wclass.style = CS_HREDRAW | CS_VREDRAW; wclass.lpfnWndProc = WndProc; wclass.hInstance = hInstance; - wclass.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION ); - wclass.hCursor = LoadCursorA( NULL, (LPSTR)IDC_ARROW); - wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1); + wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); wclass.lpszMenuName = 0; wclass.cbClsExtra = 0; wclass.cbWndExtra = 0; @@ -1872,7 +1902,7 @@ static void test_menu_flags( void ) hMenu = CreateMenu(); hPopupMenu = CreatePopupMenu(); - AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT)hPopupMenu, "Popup"); + AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT_PTR)hPopupMenu, "Popup"); AppendMenu(hPopupMenu, MF_STRING | MF_HILITE | MF_DEFAULT, 101, "Item 1"); InsertMenu(hPopupMenu, 1, MF_BYPOSITION | MF_STRING | MF_HILITE | MF_DEFAULT, 102, "Item 2"); @@ -1906,9 +1936,9 @@ static void test_menu_hilitemenuitem( void ) wclass.style = CS_HREDRAW | CS_VREDRAW; wclass.lpfnWndProc = WndProc; wclass.hInstance = GetModuleHandleA( NULL ); - wclass.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION ); - wclass.hCursor = LoadCursorA( NULL, (LPSTR)IDC_ARROW); - wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1); + wclass.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wclass.hCursor = LoadCursorA( NULL, IDC_ARROW ); + wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); wclass.lpszMenuName = 0; wclass.cbClsExtra = 0; wclass.cbWndExtra = 0; @@ -1920,7 +1950,7 @@ static void test_menu_hilitemenuitem( void ) hMenu = CreateMenu(); hPopupMenu = CreatePopupMenu(); - AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT)hPopupMenu, "Popup"); + AppendMenu(hMenu, MF_POPUP | MF_STRING, (UINT_PTR)hPopupMenu, "Popup"); AppendMenu(hPopupMenu, MF_STRING, 101, "Item 1"); AppendMenu(hPopupMenu, MF_STRING, 102, "Item 2"); @@ -2053,7 +2083,7 @@ static void check_menu_items(HMENU hmenu, UINT checked_cmd, UINT checked_type, #endif if (mii.hSubMenu) { - ok((HMENU)mii.wID == mii.hSubMenu, "id %u: wID should be equal to hSubMenu\n", checked_cmd); + ok(mii.wID == (UINT_PTR)mii.hSubMenu, "id %u: wID should be equal to hSubMenu\n", checked_cmd); check_menu_items(mii.hSubMenu, checked_cmd, checked_type, checked_state); } else @@ -2218,7 +2248,7 @@ static void test_menu_resource_layout(void) "%u: expected wID %04x, got %04x\n", i, menu_data[i].id, mii.wID); ok(mii.cch == strlen(menu_data[i].str), "%u: expected cch %u, got %u\n", i, (UINT)strlen(menu_data[i].str), mii.cch); - ok(!strcmp((LPCSTR)mii.dwTypeData, menu_data[i].str), + ok(!strcmp(mii.dwTypeData, menu_data[i].str), "%u: expected dwTypeData %s, got %s\n", i, menu_data[i].str, (LPCSTR)mii.dwTypeData); } @@ -2290,7 +2320,7 @@ static void compare_menu_data(HMENU hmenu, const struct menu_data *item, INT ite { ok(mii.cch == strlen(item[i].str), "%u: expected cch %u, got %u\n", i, (UINT)strlen(item[i].str), mii.cch); - ok(!strcmp((LPCSTR)mii.dwTypeData, item[i].str), + ok(!strcmp(mii.dwTypeData, item[i].str), "%u: expected dwTypeData %s, got %s\n", i, item[i].str, (LPCSTR)mii.dwTypeData); } } @@ -2398,7 +2428,7 @@ START_TEST(menu) test_menu_bmp_and_string(); if( !pSendInput) - skip("SendInput is not available\n"); + win_skip("SendInput is not available\n"); else test_menu_input(); test_menu_flags(); diff --git a/rostests/winetests/user32/monitor.c b/rostests/winetests/user32/monitor.c index 3d0359679eb..daa303585bd 100644 --- a/rostests/winetests/user32/monitor.c +++ b/rostests/winetests/user32/monitor.c @@ -78,7 +78,7 @@ static void test_enumdisplaydevices(void) if (!pEnumDisplayDevicesA) { - skip("EnumDisplayDevicesA is not available\n"); + win_skip("EnumDisplayDevicesA is not available\n"); return; } @@ -156,7 +156,7 @@ static void test_ChangeDisplaySettingsEx(void) if (!pChangeDisplaySettingsExA) { - skip("ChangeDisplaySettingsExA is not available\n"); + win_skip("ChangeDisplaySettingsExA is not available\n"); return; } @@ -240,8 +240,9 @@ static void test_ChangeDisplaySettingsEx(void) dm.dmFields = vid_modes_test[i].fields; res = pChangeDisplaySettingsExA(NULL, &dm, NULL, CDS_TEST, NULL); ok(vid_modes_test[i].must_succeed ? - (res == DISP_CHANGE_SUCCESSFUL) : - (res == DISP_CHANGE_SUCCESSFUL || res == DISP_CHANGE_BADMODE || res == DISP_CHANGE_BADPARAM), + (res == DISP_CHANGE_SUCCESSFUL || res == DISP_CHANGE_RESTART) : + (res == DISP_CHANGE_SUCCESSFUL || res == DISP_CHANGE_RESTART || + res == DISP_CHANGE_BADMODE || res == DISP_CHANGE_BADPARAM), "Unexpected ChangeDisplaySettingsEx() return code for resolution[%d]: %d\n", i, res); if (res == DISP_CHANGE_SUCCESSFUL) @@ -257,7 +258,7 @@ static void test_ChangeDisplaySettingsEx(void) ok(GetClipCursor(&r), "GetClipCursor() failed\n"); ok(EqualRect(&r, &virt), "Invalid clip rect: (%d %d) x (%d %d)\n", r.left, r.top, r.right, r.bottom); - ok(ClipCursor(NULL), "ClipCursor() failed\n"); + if (!ClipCursor(NULL)) continue; ok(GetClipCursor(&r), "GetClipCursor() failed\n"); ok(EqualRect(&r, &virt), "Invalid clip rect: (%d %d) x (%d %d)\n", r.left, r.top, r.right, r.bottom); @@ -287,7 +288,7 @@ static void test_monitors(void) if (!pMonitorFromPoint || !pMonitorFromWindow) { - skip("MonitorFromPoint or MonitorFromWindow are not available\n"); + win_skip("MonitorFromPoint or MonitorFromWindow are not available\n"); return; } @@ -330,7 +331,7 @@ static void test_work_area(void) if (!pEnumDisplayMonitors || !pGetMonitorInfoA) { - skip("EnumDisplayMonitors or GetMonitorInfoA are not available\n"); + win_skip("EnumDisplayMonitors or GetMonitorInfoA are not available\n"); return; } @@ -368,7 +369,8 @@ static void test_work_area(void) wp.rcNormalPosition.left, wp.rcNormalPosition.top, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom); OffsetRect(&wp.rcNormalPosition, rc_work.left, rc_work.top); - if (!EqualRect(&mi.rcMonitor, &mi.rcWork)) /* FIXME: remove once Wine is fixed */ + if (mi.rcMonitor.left != mi.rcWork.left || + mi.rcMonitor.top != mi.rcWork.top) /* FIXME: remove once Wine is fixed */ todo_wine ok(EqualRect(&rc_normal, &wp.rcNormalPosition), "normal pos is different\n"); else ok(EqualRect(&rc_normal, &wp.rcNormalPosition), "normal pos is different\n"); diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index 16ce1c24e30..4a6778f900f 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define _WIN32_WINNT 0x0501 /* For WM_CHANGEUISTATE,QS_RAWINPUT */ + #include #include #include @@ -76,8 +78,8 @@ typedef struct static BOOL test_DestroyWindow_flag; static HWINEVENTHOOK hEvent_hook; - -static void dump_winpos_flags(UINT flags); +static HHOOK hCBT_hook; +static DWORD cbt_hook_thread_id; static const WCHAR testWindowClassW[] = { 'T','e','s','t','W','i','n','d','o','w','C','l','a','s','s','W',0 }; @@ -110,6 +112,19 @@ struct message { msg_flags_t flags; /* message props */ WPARAM wParam; /* expected value of wParam */ LPARAM lParam; /* expected value of lParam */ + WPARAM wp_mask; /* mask for wParam checks */ + LPARAM lp_mask; /* mask for lParam checks */ +}; + +struct recvd_message { + UINT message; /* the WM_* code */ + msg_flags_t flags; /* message props */ + HWND hwnd; /* window that received the message */ + WPARAM wParam; /* expected value of wParam */ + LPARAM lParam; /* expected value of lParam */ + int line; /* source line where logged */ + const char *descr; /* description for trace output */ + char output[512]; /* trace output */ }; /* Empty message sequence */ @@ -167,6 +182,7 @@ static const struct message WmSWP_ShowOverlappedSeq[] = { { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { WM_PAINT, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, + { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -487,7 +503,7 @@ static const struct message WmShowRestoreMaxOverlappedSeq[] = { { WM_NCPAINT, sent|optional }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|optional }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, { WM_MOVE, sent|defwinproc|optional }, { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, { WM_NCCALCSIZE, sent|wparam|optional, TRUE }, @@ -560,6 +576,10 @@ static const struct message WmShowMinOverlappedSeq[] = { { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent }, { WM_ACTIVATEAPP, sent|wparam, 0 }, + /* Vista sometimes restores the window right away... */ + { WM_SYSCOMMAND, sent|optional|wparam, SC_RESTORE }, + { HCBT_SYSCOMMAND, hook|optional|wparam, SC_RESTORE }, + { HCBT_MINMAX, hook|optional|lparam, 0, SW_RESTORE }, { WM_PAINT, sent|optional }, { WM_NCPAINT, sent|beginpaint|optional }, { WM_ERASEBKGND, sent|beginpaint|optional }, @@ -639,6 +659,8 @@ static const struct message WmCreateMaxPopupSeq[] = { { WM_SYNCPAINT, sent|wparam|optional, 4 }, { WM_NCPAINT, sent|wparam|optional, 1 }, { WM_ERASEBKGND, sent|optional }, + { WM_NCPAINT, sent|wparam|defwinproc|optional, 1 }, + { WM_ERASEBKGND, sent|defwinproc|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTMOVE|SWP_NOCLIENTSIZE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE }, { 0 } }; @@ -672,6 +694,9 @@ static const struct message WmShowMaxPopupResizedSeq[] = { { EVENT_SYSTEM_FOREGROUND, winevent_hook|wparam|lparam, 0, 0 }, { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, + { WM_NCPAINT, sent|wparam|optional, 1 }, + { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_ACTIVATEAPP, sent|wparam, 1 }, { WM_NCACTIVATE, sent|wparam, 1 }, { WM_ACTIVATE, sent|wparam, 1 }, @@ -713,6 +738,8 @@ static const struct message WmShowMaxPopupSeq[] = { { WM_SYNCPAINT, sent|wparam|optional, 4 }, { WM_NCPAINT, sent|wparam|optional, 1 }, { WM_ERASEBKGND, sent|optional }, + { WM_NCPAINT, sent|wparam|defwinproc|optional, 1 }, + { WM_ERASEBKGND, sent|defwinproc|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { 0 } @@ -735,6 +762,7 @@ static const struct message WmCreatePopupSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, { WM_NCPAINT, sent|wparam|optional, 1 }, { WM_ERASEBKGND, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { WM_ACTIVATEAPP, sent|wparam, 1 }, { WM_NCACTIVATE, sent|wparam, 1 }, { WM_ACTIVATE, sent|wparam, 1 }, @@ -797,18 +825,18 @@ static const struct message WmCreateInvisiblePopupSeq[] = { * for a popup window with WS_VISIBLE style set */ static const struct message WmShowVisiblePopupSeq_2[] = { - { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { 0 } }; /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE) * for a popup window with WS_VISIBLE style set */ static const struct message WmShowVisiblePopupSeq_3[] = { - { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE }, { HCBT_ACTIVATE, hook }, { EVENT_SYSTEM_FOREGROUND, winevent_hook|wparam|lparam, 0, 0 }, { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, - { WM_WINDOWPOSCHANGING, sent|wparam|optional, 0 }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, { WM_NCACTIVATE, sent|wparam, 1 }, { WM_ACTIVATE, sent|wparam, 1 }, { HCBT_SETFOCUS, hook }, @@ -819,6 +847,7 @@ static const struct message WmShowVisiblePopupSeq_3[] = { { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, { WM_SETFOCUS, sent|defwinproc }, { WM_GETTEXT, sent|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { 0 } }; /* CreateWindow (for child window, not initially visible) */ @@ -897,7 +926,7 @@ static const struct message WmHideChildSeq2[] = { { WM_SHOWWINDOW, sent|wparam, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { WM_ERASEBKGND, sent|parent }, + { WM_ERASEBKGND, sent|parent|optional }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { 0 } }; @@ -931,11 +960,11 @@ static const struct message WmShowChildSeq_4[] = { /* ShowWindow(SW_MINIMIZE) for child with invisible parent */ static const struct message WmShowChildInvisibleParentSeq_1[] = { { HCBT_MINMAX, hook|lparam, 0, SW_MINIMIZE }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_STATECHANGED }, + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED, 0, SWP_NOACTIVATE }, { WM_NCCALCSIZE, sent|wparam, 1 }, { EVENT_OBJECT_SHOW, winevent_hook|wparam|lparam, 0, 0 }, { WM_CHILDACTIVATE, sent|optional }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOREDRAW|SWP_NOCOPYBITS|SWP_STATECHANGED }, + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOREDRAW|SWP_NOCOPYBITS|SWP_STATECHANGED, 0, SWP_NOACTIVATE }, { WM_MOVE, sent|defwinproc }, { WM_SIZE, sent|defwinproc|wparam, SIZE_MINIMIZED }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, @@ -1190,6 +1219,7 @@ static const struct message WmCreateCustomDialogSeq[] = { { WM_NCACTIVATE, sent|wparam, 1 }, { WM_GETTEXT, sent|optional|defwinproc }, { WM_GETTEXT, sent|optional|defwinproc }, + { WM_GETTEXT, sent|optional|defwinproc }, { EVENT_OBJECT_DEFACTIONCHANGE, winevent_hook|wparam|lparam|optional, OBJID_CLIENT, 0 }, { WM_ACTIVATE, sent|wparam, 1 }, { WM_GETTEXT, sent|optional }, @@ -1414,7 +1444,7 @@ static const struct message WmSetMenuVisibleSizeChangeSeq[] = { { WM_NCCALCSIZE, sent|wparam, 1 }, { 0x0093, sent|defwinproc|optional }, { EVENT_OBJECT_REORDER, winevent_hook|wparam|lparam, 0, 0 }, - { WM_NCPAINT, sent }, /* wparam != 1 */ + { WM_NCPAINT, sent|optional }, /* wparam != 1 */ { 0x0093, sent|defwinproc|optional }, { 0x0093, sent|defwinproc|optional }, { 0x0091, sent|defwinproc|optional }, @@ -1442,7 +1472,7 @@ static const struct message WmSetMenuVisibleSizeChangeSeq[] = { static const struct message WmSetMenuVisibleNoSizeChangeSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { WM_NCCALCSIZE, sent|wparam, 1 }, - { WM_NCPAINT, sent }, /* wparam != 1 */ + { WM_NCPAINT, sent|optional }, /* wparam != 1 */ { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|optional }, { WM_ACTIVATE, sent|optional }, @@ -1456,7 +1486,7 @@ static const struct message WmDrawMenuBarSeq[] = { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { WM_NCCALCSIZE, sent|wparam, 1 }, { 0x0093, sent|defwinproc|optional }, - { WM_NCPAINT, sent }, /* wparam != 1 */ + { WM_NCPAINT, sent|optional }, /* wparam != 1 */ { 0x0093, sent|defwinproc|optional }, { 0x0093, sent|defwinproc|optional }, { 0x0091, sent|defwinproc|optional }, @@ -1555,8 +1585,8 @@ static const struct message WmSetScrollRangeHV_NC_Seq[] = { WM_GETTEXT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|optional }, { WM_CTLCOLORDLG, sent|defwinproc|optional }, /* sent to a parent of the dialog */ - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOCLIENTMOVE }, - { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE|SWP_NOCLIENTMOVE, 0, SWP_NOCLIENTSIZE }, + { WM_SIZE, sent|defwinproc|wparam|optional, SIZE_RESTORED }, { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { EVENT_OBJECT_VALUECHANGE, winevent_hook|lparam|optional, 0/*OBJID_HSCROLL or OBJID_VSCROLL*/, 0 }, { WM_GETTEXT, sent|optional }, @@ -1622,7 +1652,7 @@ static const struct message WmSHOWNATopInvisible[] = { static int after_end_dialog, test_def_id; static int sequence_cnt, sequence_size; -static struct message* sequence; +static struct recvd_message* sequence; static int log_all_parent_messages; static int paint_loop_done; @@ -1661,24 +1691,139 @@ static void init_procs(void) #undef GET_PROC } -static void add_message(const struct message *msg) +static const char *get_winpos_flags(UINT flags) { + static char buffer[300]; + + buffer[0] = 0; +#define DUMP(flag) do { if (flags & flag) { strcat( buffer, "|" #flag ); flags &= ~flag; } } while(0) + DUMP( SWP_SHOWWINDOW ); + DUMP( SWP_HIDEWINDOW ); + DUMP( SWP_NOACTIVATE ); + DUMP( SWP_FRAMECHANGED ); + DUMP( SWP_NOCOPYBITS ); + DUMP( SWP_NOOWNERZORDER ); + DUMP( SWP_NOSENDCHANGING ); + DUMP( SWP_DEFERERASE ); + DUMP( SWP_ASYNCWINDOWPOS ); + DUMP( SWP_NOZORDER ); + DUMP( SWP_NOREDRAW ); + DUMP( SWP_NOSIZE ); + DUMP( SWP_NOMOVE ); + DUMP( SWP_NOCLIENTSIZE ); + DUMP( SWP_NOCLIENTMOVE ); + if (flags) sprintf(buffer + strlen(buffer),"|0x%04x", flags); + return buffer + 1; +#undef DUMP +} + + +#define add_message(msg) add_message_(__LINE__,msg); +static void add_message_(int line, const struct recvd_message *msg) +{ + struct recvd_message *seq; + if (!sequence) { sequence_size = 10; - sequence = HeapAlloc( GetProcessHeap(), 0, sequence_size * sizeof (struct message) ); + sequence = HeapAlloc( GetProcessHeap(), 0, sequence_size * sizeof(*sequence) ); } if (sequence_cnt == sequence_size) { sequence_size *= 2; - sequence = HeapReAlloc( GetProcessHeap(), 0, sequence, sequence_size * sizeof (struct message) ); + sequence = HeapReAlloc( GetProcessHeap(), 0, sequence, sequence_size * sizeof(*sequence) ); } assert(sequence); - sequence[sequence_cnt].message = msg->message; - sequence[sequence_cnt].flags = msg->flags; - sequence[sequence_cnt].wParam = msg->wParam; - sequence[sequence_cnt].lParam = msg->lParam; + seq = &sequence[sequence_cnt]; + seq->hwnd = msg->hwnd; + seq->message = msg->message; + seq->flags = msg->flags; + seq->wParam = msg->wParam; + seq->lParam = msg->lParam; + seq->line = line; + seq->descr = msg->descr; + seq->output[0] = 0; + + if (msg->descr) + { + if (msg->flags & hook) + { + static const char * const CBT_code_name[10] = + { + "HCBT_MOVESIZE", + "HCBT_MINMAX", + "HCBT_QS", + "HCBT_CREATEWND", + "HCBT_DESTROYWND", + "HCBT_ACTIVATE", + "HCBT_CLICKSKIPPED", + "HCBT_KEYSKIPPED", + "HCBT_SYSCOMMAND", + "HCBT_SETFOCUS" + }; + const char *code_name = (msg->message <= HCBT_SETFOCUS) ? CBT_code_name[msg->message] : "Unknown"; + + snprintf( seq->output, sizeof(seq->output), "%s: hook %d (%s) wp %08lx lp %08lx", + msg->descr, msg->message, code_name, msg->wParam, msg->lParam ); + } + else if (msg->flags & winevent_hook) + { + snprintf( seq->output, sizeof(seq->output), "%s: winevent %p %08x %08lx %08lx", + msg->descr, msg->hwnd, msg->message, msg->wParam, msg->lParam ); + } + else + { + switch (msg->message) + { + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + { + WINDOWPOS *winpos = (WINDOWPOS *)msg->lParam; + + snprintf( seq->output, sizeof(seq->output), + "%s: %p WM_WINDOWPOS%s wp %08lx lp %08lx after %p x %d y %d cx %d cy %d flags %s", + msg->descr, msg->hwnd, + (msg->message == WM_WINDOWPOSCHANGING) ? "CHANGING" : "CHANGED", + msg->wParam, msg->lParam, winpos->hwndInsertAfter, + winpos->x, winpos->y, winpos->cx, winpos->cy, + get_winpos_flags(winpos->flags) ); + + /* Log only documented flags, win2k uses 0x1000 and 0x2000 + * in the high word for internal purposes + */ + seq->wParam = winpos->flags & 0xffff; + /* We are not interested in the flags that don't match under XP and Win9x */ + seq->wParam &= ~SWP_NOZORDER; + break; + } + + case WM_DRAWITEM: + { + DRAW_ITEM_STRUCT di; + DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)msg->lParam; + + snprintf( seq->output, sizeof(seq->output), + "%s: %p WM_DRAWITEM: type %x, ctl_id %x, item_id %x, action %x, state %x", + msg->descr, msg->hwnd, dis->CtlType, dis->CtlID, + dis->itemID, dis->itemAction, dis->itemState); + + di.u.item.type = dis->CtlType; + di.u.item.ctl_id = dis->CtlID; + di.u.item.item_id = dis->itemID; + di.u.item.action = dis->itemAction; + di.u.item.state = dis->itemState; + + seq->lParam = di.u.lp; + break; + } + default: + if (msg->message >= 0xc000) return; /* ignore registered messages */ + snprintf( seq->output, sizeof(seq->output), "%s: %p %04x wp %08lx lp %08lx", + msg->descr, msg->hwnd, msg->message, msg->wParam, msg->lParam ); + } + } + } sequence_cnt++; } @@ -1688,7 +1833,7 @@ static void flush_events(void) { MSG msg; int diff = 200; - int min_timeout = 50; + int min_timeout = 100; DWORD time = GetTickCount() + diff; while (diff > 0) @@ -1696,7 +1841,6 @@ static void flush_events(void) if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break; while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg ); diff = time - GetTickCount(); - min_timeout = 20; } } @@ -1707,115 +1851,227 @@ static void flush_sequence(void) sequence_cnt = sequence_size = 0; } +static void dump_sequence(const struct message *expected, const char *context, const char *file, int line) +{ + const struct recvd_message *actual = sequence; + unsigned int count = 0; + + trace_(file, line)("Failed sequence %s:\n", context ); + while (expected->message && actual->message) + { + if (actual->output[0]) + { + if (expected->flags & hook) + { + trace_(file, line)( " %u: expected: hook %04x - actual: %s\n", + count, expected->message, actual->output ); + } + else if (expected->flags & winevent_hook) + { + trace_(file, line)( " %u: expected: winevent %04x - actual: %s\n", + count, expected->message, actual->output ); + } + else + { + trace_(file, line)( " %u: expected: msg %04x - actual: %s\n", + count, expected->message, actual->output ); + } + } + + if (expected->message == actual->message) + { + if ((expected->flags & defwinproc) != (actual->flags & defwinproc) && + (expected->flags & optional)) + { + /* don't match messages if their defwinproc status differs */ + expected++; + } + else + { + expected++; + actual++; + } + } + /* silently drop winevent messages if there is no support for them */ + else if ((expected->flags & optional) || ((expected->flags & winevent_hook) && !hEvent_hook)) + expected++; + else + { + expected++; + actual++; + } + count++; + } + + /* optional trailing messages */ + while (expected->message && ((expected->flags & optional) || + ((expected->flags & winevent_hook) && !hEvent_hook))) + { + trace_(file, line)( " %u: expected: msg %04x - actual: nothing\n", count, expected->message ); + expected++; + count++; + } + + if (expected->message) + { + trace_(file, line)( " %u: expected: msg %04x - actual: nothing\n", count, expected->message ); + return; + } + + while (actual->message && actual->output[0]) + { + trace_(file, line)( " %u: expected: nothing - actual: %s\n", count, actual->output ); + actual++; + count++; + } +} + #define ok_sequence( exp, contx, todo) \ ok_sequence_( (exp), (contx), (todo), __FILE__, __LINE__) -static void ok_sequence_(const struct message *expected, const char *context, int todo, - const char *file, int line) +static void ok_sequence_(const struct message *expected_list, const char *context, int todo, + const char *file, int line) { - static const struct message end_of_sequence = { 0, 0, 0, 0 }; - const struct message *actual; - int failcount = 0; - + static const struct recvd_message end_of_sequence; + const struct message *expected = expected_list; + const struct recvd_message *actual; + int failcount = 0, dump = 0; + unsigned int count = 0; + add_message(&end_of_sequence); actual = sequence; while (expected->message && actual->message) { - trace_( file, line)("expected %04x - actual %04x\n", expected->message, actual->message); - if (expected->message == actual->message) { if (expected->flags & wparam) { - if (expected->wParam != actual->wParam && todo) + if (((expected->wParam ^ actual->wParam) & ~expected->wp_mask) && todo) { todo_wine { failcount ++; + if (strcmp(winetest_platform, "wine")) dump++; ok_( file, line) (FALSE, - "%s: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n", - context, expected->message, expected->wParam, actual->wParam); + "%s: %u: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n", + context, count, expected->message, expected->wParam, actual->wParam); } } else - ok_( file, line) (expected->wParam == actual->wParam, - "%s: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n", - context, expected->message, expected->wParam, actual->wParam); + { + ok_( file, line)( ((expected->wParam ^ actual->wParam) & ~expected->wp_mask) == 0, + "%s: %u: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n", + context, count, expected->message, expected->wParam, actual->wParam); + if ((expected->wParam ^ actual->wParam) & ~expected->wp_mask) dump++; + } + } if (expected->flags & lparam) { - if (expected->lParam != actual->lParam && todo) + if (((expected->lParam ^ actual->lParam) & ~expected->lp_mask) && todo) { todo_wine { failcount ++; + if (strcmp(winetest_platform, "wine")) dump++; ok_( file, line) (FALSE, - "%s: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", - context, expected->message, expected->lParam, actual->lParam); + "%s: %u: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", + context, count, expected->message, expected->lParam, actual->lParam); } } else - ok_( file, line) (expected->lParam == actual->lParam, - "%s: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", - context, expected->message, expected->lParam, actual->lParam); + { + ok_( file, line)(((expected->lParam ^ actual->lParam) & ~expected->lp_mask) == 0, + "%s: %u: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n", + context, count, expected->message, expected->lParam, actual->lParam); + if ((expected->lParam ^ actual->lParam) & ~expected->lp_mask) dump++; + } + } + if ((expected->flags & defwinproc) != (actual->flags & defwinproc) && + (expected->flags & optional)) + { + /* don't match messages if their defwinproc status differs */ + expected++; + count++; + continue; } if ((expected->flags & defwinproc) != (actual->flags & defwinproc) && todo) { todo_wine { failcount ++; + if (strcmp(winetest_platform, "wine")) dump++; ok_( file, line) (FALSE, - "%s: the msg 0x%04x should %shave been sent by DefWindowProc\n", - context, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); + "%s: %u: the msg 0x%04x should %shave been sent by DefWindowProc\n", + context, count, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); } } else + { ok_( file, line) ((expected->flags & defwinproc) == (actual->flags & defwinproc), - "%s: the msg 0x%04x should %shave been sent by DefWindowProc\n", - context, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); + "%s: %u: the msg 0x%04x should %shave been sent by DefWindowProc\n", + context, count, expected->message, (expected->flags & defwinproc) ? "" : "NOT "); + if ((expected->flags & defwinproc) != (actual->flags & defwinproc)) dump++; + } + ok_( file, line) ((expected->flags & beginpaint) == (actual->flags & beginpaint), - "%s: the msg 0x%04x should %shave been sent by BeginPaint\n", - context, expected->message, (expected->flags & beginpaint) ? "" : "NOT "); + "%s: %u: the msg 0x%04x should %shave been sent by BeginPaint\n", + context, count, expected->message, (expected->flags & beginpaint) ? "" : "NOT "); + if ((expected->flags & beginpaint) != (actual->flags & beginpaint)) dump++; + ok_( file, line) ((expected->flags & (sent|posted)) == (actual->flags & (sent|posted)), - "%s: the msg 0x%04x should have been %s\n", - context, expected->message, (expected->flags & posted) ? "posted" : "sent"); + "%s: %u: the msg 0x%04x should have been %s\n", + context, count, expected->message, (expected->flags & posted) ? "posted" : "sent"); + if ((expected->flags & (sent|posted)) != (actual->flags & (sent|posted))) dump++; + ok_( file, line) ((expected->flags & parent) == (actual->flags & parent), - "%s: the msg 0x%04x was expected in %s\n", - context, expected->message, (expected->flags & parent) ? "parent" : "child"); + "%s: %u: the msg 0x%04x was expected in %s\n", + context, count, expected->message, (expected->flags & parent) ? "parent" : "child"); + if ((expected->flags & parent) != (actual->flags & parent)) dump++; + ok_( file, line) ((expected->flags & hook) == (actual->flags & hook), - "%s: the msg 0x%04x should have been sent by a hook\n", - context, expected->message); + "%s: %u: the msg 0x%04x should have been sent by a hook\n", + context, count, expected->message); + if ((expected->flags & hook) != (actual->flags & hook)) dump++; + ok_( file, line) ((expected->flags & winevent_hook) == (actual->flags & winevent_hook), - "%s: the msg 0x%04x should have been sent by a winevent hook\n", - context, expected->message); + "%s: %u: the msg 0x%04x should have been sent by a winevent hook\n", + context, count, expected->message); + if ((expected->flags & winevent_hook) != (actual->flags & winevent_hook)) dump++; + expected++; actual++; } - /* silently drop winevent messages if there is no support for them */ - else if ((expected->flags & optional) || ((expected->flags & winevent_hook) && !hEvent_hook)) + /* silently drop hook messages if there is no support for them */ + else if ((expected->flags & optional) || + ((expected->flags & hook) && !hCBT_hook) || + ((expected->flags & winevent_hook) && !hEvent_hook)) expected++; else if (todo) { failcount++; todo_wine { - ok_( file, line) (FALSE, "%s: the msg 0x%04x was expected, but got msg 0x%04x instead\n", - context, expected->message, actual->message); + if (strcmp(winetest_platform, "wine")) dump++; + ok_( file, line) (FALSE, "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n", + context, count, expected->message, actual->message); } - flush_sequence(); - return; + goto done; } else { - ok_( file, line) (FALSE, "%s: the msg 0x%04x was expected, but got msg 0x%04x instead\n", - context, expected->message, actual->message); + ok_( file, line) (FALSE, "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n", + context, count, expected->message, actual->message); + dump++; expected++; actual++; } + count++; } /* skip all optional trailing messages */ while (expected->message && ((expected->flags & optional) || - ((expected->flags & winevent_hook) && !hEvent_hook))) + ((expected->flags & hook) && !hCBT_hook) || + ((expected->flags & winevent_hook) && !hEvent_hook))) expected++; if (todo) @@ -1823,22 +2079,29 @@ static void ok_sequence_(const struct message *expected, const char *context, in todo_wine { if (expected->message || actual->message) { failcount++; - ok_( file, line) (FALSE, "%s: the msg sequence is not complete: expected %04x - actual %04x\n", - context, expected->message, actual->message); + if (strcmp(winetest_platform, "wine")) dump++; + ok_( file, line) (FALSE, "%s: %u: the msg sequence is not complete: expected %04x - actual %04x\n", + context, count, expected->message, actual->message); } } } else { if (expected->message || actual->message) - ok_( file, line) (FALSE, "%s: the msg sequence is not complete: expected %04x - actual %04x\n", - context, expected->message, actual->message); + { + dump++; + ok_( file, line) (FALSE, "%s: %u: the msg sequence is not complete: expected %04x - actual %04x\n", + context, count, expected->message, actual->message); + } } if( todo && !failcount) /* succeeded yet marked todo */ todo_wine { + if (!strcmp(winetest_platform, "wine")) dump++; ok_( file, line)( TRUE, "%s: marked \"todo_wine\" but succeeds\n", context); } +done: + if (dump) dump_sequence(expected_list, context, file, line); flush_sequence(); } @@ -1869,7 +2132,7 @@ static const struct message WmCreateMDIframeSeq[] = { { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, /* XP */ { WM_ACTIVATEAPP, sent|wparam|optional, 1 }, /* Win9x doesn't send it */ - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_NCACTIVATE, sent }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, /* Win9x */ @@ -2165,23 +2428,23 @@ static const struct message WmCreateMDIchildVisibleMaxSeq1[] = { { WM_MDIREFRESHMENU, sent/*|wparam|lparam, 0, 0*/ }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE }, { WM_CHILDACTIVATE, sent|wparam|lparam, 0, 0 }, - { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc|optional, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, /* Win9x: message sequence terminates here. */ - { WM_NCACTIVATE, sent|wparam|defwinproc, 1 }, - { HCBT_SETFOCUS, hook }, /* in MDI client */ + { WM_NCACTIVATE, sent|wparam|defwinproc|optional, 1 }, + { HCBT_SETFOCUS, hook|optional }, /* in MDI client */ { WM_IME_SETCONTEXT, sent|wparam|optional, 1 }, /* in MDI client */ { WM_IME_NOTIFY, sent|wparam|optional, 2 }, /* in MDI client */ { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, - { WM_SETFOCUS, sent }, /* in MDI client */ - { HCBT_SETFOCUS, hook }, - { WM_KILLFOCUS, sent }, /* in MDI client */ + { WM_SETFOCUS, sent|optional }, /* in MDI client */ + { HCBT_SETFOCUS, hook|optional }, + { WM_KILLFOCUS, sent|optional }, /* in MDI client */ { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, /* in MDI client */ { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, - { WM_SETFOCUS, sent|defwinproc }, - { WM_MDIACTIVATE, sent|defwinproc }, + { WM_SETFOCUS, sent|defwinproc|optional }, + { WM_MDIACTIVATE, sent|defwinproc|optional }, /* in MDI frame */ { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { WM_NCCALCSIZE, sent|wparam, 1 }, @@ -2381,9 +2644,9 @@ static const struct message WmCreateMDIchildInvisibleMaxSeq4[] = { { WM_CREATE, sent }, { EVENT_OBJECT_CREATE, winevent_hook|wparam|lparam, 0, 0 }, { WM_SIZE, sent|wparam, SIZE_RESTORED }, - { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE }, /* MDI frame */ + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE, 0, SWP_NOZORDER }, /* MDI frame */ { WM_NCCALCSIZE, sent|wparam|optional, 1 }, /* MDI frame */ - { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, /* MDI frame */ + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE, 0, SWP_NOZORDER }, /* MDI frame */ { WM_MOVE, sent }, { HCBT_MINMAX, hook|lparam, 0, SW_MAXIMIZE }, { WM_GETMINMAXINFO, sent }, @@ -2888,7 +3151,7 @@ static WNDPROC old_mdi_client_proc; static LRESULT WINAPI mdi_client_hook_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - struct message msg; + struct recvd_message msg; /* do not log painting messages */ if (message != WM_PAINT && @@ -2899,37 +3162,15 @@ static LRESULT WINAPI mdi_client_hook_proc(HWND hwnd, UINT message, WPARAM wPara message != WM_GETTEXT && message != WM_MDIGETACTIVE && message != WM_GETICON && + message != WM_GETOBJECT && message != WM_DEVICECHANGE) { - trace("mdi client: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - switch (message) - { - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } - } - + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "mdi client"; add_message(&msg); } @@ -2940,7 +3181,7 @@ static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; /* do not log painting messages */ if (message != WM_PAINT && @@ -2950,32 +3191,11 @@ static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, message != WM_NCHITTEST && message != WM_GETTEXT && message != WM_GETICON && + message != WM_GETOBJECT && message != WM_DEVICECHANGE) { - trace("mdi child: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - switch (message) { - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } - case WM_MDIACTIVATE: { HWND active, client = GetParent(hwnd); @@ -2990,11 +3210,13 @@ static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, } } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "mdi child"; add_message(&msg); } @@ -3009,7 +3231,7 @@ static LRESULT WINAPI mdi_frame_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; /* do not log painting messages */ if (message != WM_PAINT && @@ -3019,39 +3241,16 @@ static LRESULT WINAPI mdi_frame_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, message != WM_NCHITTEST && message != WM_GETTEXT && message != WM_GETICON && - message != WM_DEVICECHANGE && - message < 0xc000) + message != WM_GETOBJECT && + message != WM_DEVICECHANGE) { - trace("mdi frame: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - switch (message) - { - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } - } - + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "mdi frame"; add_message(&msg); } @@ -3072,7 +3271,7 @@ static BOOL mdi_RegisterWindowClasses(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "MDI_frame_class"; @@ -3656,51 +3855,29 @@ static void test_WM_SETREDRAW(HWND hwnd) static INT_PTR CALLBACK TestModalDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - struct message msg; - - trace("dialog: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; - - /* ignore registered messages */ - if (message >= 0xc000) return 0; + struct recvd_message msg; switch (message) { /* ignore */ + case WM_GETICON: + case WM_GETOBJECT: case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + case WM_NCMOUSELEAVE: case WM_SETCURSOR: case WM_DEVICECHANGE: return 0; case WM_NCHITTEST: return HTCLIENT; - - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "dialog"; add_message(&msg); if (message == WM_INITDIALOG) SetTimer( hwnd, 1, 100, NULL ); @@ -3910,13 +4087,11 @@ static void test_showwindow(void) trace("calling ShowWindow( SW_SHOWNA) for invisible top level window\n"); ok( ShowWindow(hwnd, SW_SHOWNA) == FALSE, "ShowWindow: window was visible\n" ); ok_sequence(WmSHOWNATopInvisible, "ShowWindow(SW_SHOWNA) on invisible top level window", TRUE); - trace("done\n"); /* ShowWindow( SW_SHOWNA) for now visible top level window */ trace("calling ShowWindow( SW_SHOWNA) for now visible top level window\n"); ok( ShowWindow(hwnd, SW_SHOWNA) != FALSE, "ShowWindow: window was invisible\n" ); ok_sequence(WmSHOWNATopVisible, "ShowWindow(SW_SHOWNA) on visible top level window", FALSE); - trace("done\n"); /* back to invisible */ ShowWindow(hchild, SW_HIDE); ShowWindow(hwnd, SW_HIDE); @@ -3925,21 +4100,18 @@ static void test_showwindow(void) trace("calling ShowWindow( SW_SHOWNA) for invisible child with invisible parent\n"); ok( ShowWindow(hchild, SW_SHOWNA) == FALSE, "ShowWindow: window was visible\n" ); ok_sequence(WmSHOWNAChildInvisParInvis, "ShowWindow(SW_SHOWNA) invisible child and parent", FALSE); - trace("done\n"); /* ShowWindow(SW_SHOWNA) with child visible and parent invisible */ ok( ShowWindow(hchild, SW_SHOW) != FALSE, "ShowWindow: window was invisible\n" ); flush_sequence(); trace("calling ShowWindow( SW_SHOWNA) for the visible child and invisible parent\n"); ok( ShowWindow(hchild, SW_SHOWNA) != FALSE, "ShowWindow: window was invisible\n" ); ok_sequence(WmSHOWNAChildVisParInvis, "ShowWindow(SW_SHOWNA) visible child and invisible parent", FALSE); - trace("done\n"); /* ShowWindow(SW_SHOWNA) with child visible and parent visible */ ShowWindow( hwnd, SW_SHOW); flush_sequence(); trace("calling ShowWindow( SW_SHOWNA) for the visible child and parent\n"); ok( ShowWindow(hchild, SW_SHOWNA) != FALSE, "ShowWindow: window was invisible\n" ); ok_sequence(WmSHOWNAChildVisParVis, "ShowWindow(SW_SHOWNA) for the visible child and parent", FALSE); - trace("done\n"); /* ShowWindow(SW_SHOWNA) with child invisible and parent visible */ ShowWindow( hchild, SW_HIDE); @@ -3947,7 +4119,6 @@ static void test_showwindow(void) trace("calling ShowWindow( SW_SHOWNA) for the invisible child and visible parent\n"); ok( ShowWindow(hchild, SW_SHOWNA) == FALSE, "ShowWindow: window was visible\n" ); ok_sequence(WmSHOWNAChildInvisParVis, "ShowWindow(SW_SHOWNA) for the invisible child and visible parent", FALSE); - trace("done\n"); SetCapture(hchild); ok(GetCapture() == hchild, "wrong capture window %p\n", GetCapture()); @@ -3969,7 +4140,6 @@ static void test_showwindow(void) ok (hwnd != 0, "Failed to create popup window\n"); ok(IsZoomed(hwnd), "window should be maximized\n"); ok_sequence(WmCreateInvisibleMaxPopupSeq, "CreateWindow(WS_MAXIMIZED):popup", FALSE); - trace("done\n"); GetWindowRect(hwnd, &rc); ok( rc.right-rc.left == GetSystemMetrics(SM_CXSCREEN) && @@ -3985,7 +4155,6 @@ static void test_showwindow(void) ShowWindow(hwnd, SW_SHOWMAXIMIZED); ok(IsZoomed(hwnd), "window should be maximized\n"); ok_sequence(WmShowMaxPopupResizedSeq, "ShowWindow(SW_SHOWMAXIMIZED):invisible maximized and resized popup", FALSE); - trace("done\n"); GetWindowRect(hwnd, &rc); ok( rc.right-rc.left == GetSystemMetrics(SM_CXSCREEN) && @@ -4005,13 +4174,11 @@ static void test_showwindow(void) ok (hwnd != 0, "Failed to create popup window\n"); ok(IsZoomed(hwnd), "window should be maximized\n"); ok_sequence(WmCreateInvisibleMaxPopupSeq, "CreateWindow(WS_MAXIMIZED):popup", FALSE); - trace("done\n"); trace("calling ShowWindow( SW_SHOWMAXIMIZE ) for invisible maximized popup window\n"); ShowWindow(hwnd, SW_SHOWMAXIMIZED); ok(IsZoomed(hwnd), "window should be maximized\n"); ok_sequence(WmShowMaxPopupSeq, "ShowWindow(SW_SHOWMAXIMIZED):invisible maximized popup", FALSE); - trace("done\n"); DestroyWindow(hwnd); flush_sequence(); @@ -4024,7 +4191,6 @@ static void test_showwindow(void) ok (hwnd != 0, "Failed to create popup window\n"); ok(IsZoomed(hwnd), "window should be maximized\n"); ok_sequence(WmCreateMaxPopupSeq, "CreateWindow(WS_MAXIMIZED):popup", FALSE); - trace("done\n"); DestroyWindow(hwnd); flush_sequence(); @@ -4038,13 +4204,11 @@ static void test_showwindow(void) ok (hwnd != 0, "Failed to create popup window\n"); ok(!IsZoomed(hwnd), "window should NOT be maximized\n"); ok_sequence(WmCreatePopupSeq, "CreateWindow(WS_VISIBLE):popup", FALSE); - trace("done\n"); trace("calling ShowWindow( SW_SHOWMAXIMIZE ) for visible popup window\n"); ShowWindow(hwnd, SW_SHOWMAXIMIZED); ok(IsZoomed(hwnd), "window should be maximized\n"); ok_sequence(WmShowVisMaxPopupSeq, "ShowWindow(SW_SHOWMAXIMIZED):popup", FALSE); - trace("done\n"); DestroyWindow(hwnd); flush_sequence(); } @@ -4166,6 +4330,14 @@ static const struct message WmInitEndSession_5[] = { { 0 } }; +static const struct message WmOptionalPaint[] = { + { WM_PAINT, sent|optional }, + { WM_NCPAINT, sent|beginpaint|optional }, + { WM_GETTEXT, sent|beginpaint|defwinproc|optional }, + { WM_ERASEBKGND, sent|beginpaint|optional }, + { 0 } +}; + static const struct message WmZOrder[] = { { WM_WINDOWPOSCHANGING, sent|wparam, 0, 0 }, { WM_GETMINMAXINFO, sent|defwinproc|wparam, 0, 0 }, @@ -4278,25 +4450,32 @@ static void test_messages(void) ShowWindow(hwnd, SW_SHOWMAXIMIZED); flush_events(); ok_sequence(WmShowMaxOverlappedSeq, "ShowWindow(SW_SHOWMAXIMIZED):overlapped", TRUE); - - ShowWindow(hwnd, SW_RESTORE); - ok_sequence(WmShowRestoreMaxOverlappedSeq, "ShowWindow(SW_RESTORE):overlapped", FALSE); - flush_events(); flush_sequence(); + if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_MAXIMIZE) + { + ShowWindow(hwnd, SW_RESTORE); + flush_events(); + ok_sequence(WmShowRestoreMaxOverlappedSeq, "ShowWindow(SW_RESTORE):overlapped", TRUE); + flush_sequence(); + } + ShowWindow(hwnd, SW_MINIMIZE); flush_events(); ok_sequence(WmShowMinOverlappedSeq, "ShowWindow(SW_SHOWMINIMIZED):overlapped", TRUE); flush_sequence(); - ShowWindow(hwnd, SW_RESTORE); - flush_events(); - ok_sequence(WmShowRestoreMinOverlappedSeq, "ShowWindow(SW_RESTORE):overlapped", TRUE); - flush_sequence(); + if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_MINIMIZE) + { + ShowWindow(hwnd, SW_RESTORE); + flush_events(); + ok_sequence(WmShowRestoreMinOverlappedSeq, "ShowWindow(SW_RESTORE):overlapped", TRUE); + flush_sequence(); + } ShowWindow(hwnd, SW_SHOW); flush_events(); - ok_sequence(WmEmptySeq, "ShowWindow(SW_SHOW):overlapped already visible", FALSE); + ok_sequence(WmOptionalPaint, "ShowWindow(SW_SHOW):overlapped already visible", FALSE); ok(GetActiveWindow() == hwnd, "window should be active\n"); ok(GetFocus() == hwnd, "window should have input focus\n"); @@ -4937,25 +5116,28 @@ static LRESULT CALLBACK button_hook_proc(HWND hwnd, UINT message, WPARAM wParam, { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; - trace("button: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; - - /* ignore registered messages */ - if (message >= 0xc000) return 0; - - msg.message = message; - msg.flags = sent|wparam|lparam; - if (defwndproc_counter) msg.flags |= defwinproc; - msg.wParam = wParam; - msg.lParam = lParam; - add_message(&msg); - - if (message == BM_SETSTATE) + switch (message) + { + case WM_GETICON: + case WM_GETOBJECT: + return 0; /* ignore them */ + case WM_SYNCPAINT: + break; + case BM_SETSTATE: ok(GetCapture() == hwnd, "GetCapture() = %p\n", GetCapture()); + /* fall through */ + default: + msg.hwnd = hwnd; + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + msg.descr = "button"; + add_message(&msg); + } defwndproc_counter++; ret = CallWindowProcA(old_button_proc, hwnd, message, wParam, lParam); @@ -5046,8 +5228,11 @@ static void test_button_messages(void) 0, 0, 50, 14, 0, 0, 0, NULL); ok(hwnd != 0, "Failed to create button window\n"); - SetFocus(0); + SetForegroundWindow(hwnd); flush_events(); + + SetActiveWindow(hwnd); + SetFocus(0); flush_sequence(); SendMessageA(hwnd, WM_LBUTTONDOWN, 0, 0); @@ -5069,9 +5254,9 @@ static void test_button_messages(void) static const struct message WmSetFontStaticSeq[] = { { WM_SETFONT, sent }, - { WM_PAINT, sent|defwinproc }, + { WM_PAINT, sent|defwinproc|optional }, { WM_ERASEBKGND, sent|defwinproc|optional }, - { WM_CTLCOLORSTATIC, sent|defwinproc }, + { WM_CTLCOLORSTATIC, sent|defwinproc|optional }, { 0 } }; @@ -5081,21 +5266,17 @@ static LRESULT CALLBACK static_hook_proc(HWND hwnd, UINT message, WPARAM wParam, { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; - trace("static: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; - - /* ignore registered messages */ - if (message >= 0xc000) return 0; + if (message == WM_GETICON || message == WM_GETOBJECT) return 0; /* ignore them */ + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "static"; add_message(&msg); defwndproc_counter++; @@ -5180,7 +5361,7 @@ static LRESULT CALLBACK combobox_hook_proc(HWND hwnd, UINT message, WPARAM wPara { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; /* do not log painting messages */ if (message != WM_PAINT && @@ -5190,15 +5371,16 @@ static LRESULT CALLBACK combobox_hook_proc(HWND hwnd, UINT message, WPARAM wPara message != WM_NCHITTEST && message != WM_GETTEXT && message != WM_GETICON && + message != WM_GETOBJECT && message != WM_DEVICECHANGE) { - trace("combo: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "combo"; add_message(&msg); } @@ -5284,14 +5466,14 @@ static const struct message WmImeKeydownMsgSeq_1[] = static LRESULT WINAPI wmime_keydown_procA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - struct message msg; - - trace("wmime_keydown_procA: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + struct recvd_message msg; + msg.hwnd = hwnd; msg.message = message; msg.flags = wparam|lparam; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "wmime_keydown"; add_message(&msg); return DefWindowProcA(hwnd, message, wParam, lParam); @@ -5308,7 +5490,7 @@ static void register_wmime_keydown_class(void) if (!RegisterClassA(&cls)) assert(0); } -void test_wmime_keydown_message(void) +static void test_wmime_keydown_message(void) { HWND hwnd; MSG msg; @@ -5441,7 +5623,7 @@ static const struct message WmInvalidateErasePaint2[] = { { WM_PAINT, sent }, { WM_NCPAINT, sent|beginpaint }, { WM_GETTEXT, sent|beginpaint|defwinproc|optional }, - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -5496,7 +5678,7 @@ static const struct message WmParentPaintNc[] = { { WM_PAINT, sent }, { WM_NCPAINT, sent|beginpaint }, { WM_GETTEXT, sent|beginpaint|defwinproc|optional }, - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -5512,11 +5694,11 @@ static const struct message WmParentErasePaint[] = { { WM_PAINT, sent|parent }, { WM_NCPAINT, sent|parent|beginpaint }, { WM_GETTEXT, sent|parent|beginpaint|defwinproc|optional }, - { WM_ERASEBKGND, sent|parent|beginpaint }, + { WM_ERASEBKGND, sent|parent|beginpaint|optional }, { WM_PAINT, sent }, { WM_NCPAINT, sent|beginpaint }, { WM_GETTEXT, sent|beginpaint|defwinproc|optional }, - { WM_ERASEBKGND, sent|beginpaint }, + { WM_ERASEBKGND, sent|beginpaint|optional }, { 0 } }; @@ -5601,13 +5783,15 @@ static void test_paint_messages(void) */ trace("testing ValidateRect(0, NULL)\n"); SetRectEmpty( &rect ); - ok(ValidateRect(0, &rect), "ValidateRect(0, &rc) should not fail\n"); - check_update_rgn( hwnd, hrgn ); - ok_sequence( WmInvalidateErase, "InvalidateErase", FALSE ); - flush_events(); - ok_sequence( WmPaint, "Paint", FALSE ); - RedrawWindow( hwnd, NULL, NULL, RDW_VALIDATE ); - check_update_rgn( hwnd, 0 ); + if (ValidateRect(0, &rect)) /* not supported on Win9x */ + { + check_update_rgn( hwnd, hrgn ); + ok_sequence( WmInvalidateErase, "InvalidateErase", FALSE ); + flush_events(); + ok_sequence( WmPaint, "Paint", FALSE ); + RedrawWindow( hwnd, NULL, NULL, RDW_VALIDATE ); + check_update_rgn( hwnd, 0 ); + } trace("testing InvalidateRgn(0, NULL, FALSE)\n"); SetLastError(0xdeadbeef); @@ -6077,7 +6261,7 @@ struct wnd_event static DWORD WINAPI thread_proc(void *param) { MSG msg; - struct wnd_event *wnd_event = (struct wnd_event *)param; + struct wnd_event *wnd_event = param; wnd_event->hwnd = CreateWindowExA(0, "TestWindowClass", "window caption text", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); @@ -6110,7 +6294,7 @@ static void test_interthread_messages(void) wnd_event.event = CreateEventW(NULL, 0, 0, NULL); if (!wnd_event.event) { - trace("skipping interthread message test under win9x\n"); + win_skip("skipping interthread message test under win9x\n"); return; } @@ -6284,6 +6468,8 @@ static const struct message WmCtrlAltVkN[] = { { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'N', 0x20000001 }, /* XP */ { WM_KEYDOWN, wparam|lparam, 'N', 0x20000001 }, { WM_KEYDOWN, sent|wparam|lparam, 'N', 0x20000001 }, + { WM_CHAR, optional }, + { WM_CHAR, sent|optional }, { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'N', 0xe0000001 }, /* XP */ { WM_KEYUP, wparam|lparam, 'N', 0xe0000001 }, { WM_KEYUP, sent|wparam|lparam, 'N', 0xe0000001 }, @@ -6372,19 +6558,19 @@ static const struct message WmAltPressRelease[] = { { WM_SYSKEYUP, sent|wparam|lparam, VK_MENU, 0xc0000001 }, { 0 } }; -static const struct message WmAltMouseButton[] = { - { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_MENU, 0x20000001 }, /* XP */ - { WM_SYSKEYDOWN, wparam|lparam, VK_MENU, 0x20000001 }, - { WM_SYSKEYDOWN, sent|wparam|lparam, VK_MENU, 0x20000001 }, +static const struct message WmShiftMouseButton[] = { + { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_SHIFT, 1 }, /* XP */ + { WM_KEYDOWN, wparam|lparam, VK_SHIFT, 1 }, + { WM_KEYDOWN, sent|wparam|lparam, VK_SHIFT, 1 }, { WM_MOUSEMOVE, wparam|optional, 0, 0 }, { WM_MOUSEMOVE, sent|wparam|optional, 0, 0 }, - { WM_LBUTTONDOWN, wparam, MK_LBUTTON, 0 }, - { WM_LBUTTONDOWN, sent|wparam, MK_LBUTTON, 0 }, - { WM_LBUTTONUP, wparam, 0, 0 }, - { WM_LBUTTONUP, sent|wparam, 0, 0 }, - { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_MENU, 0xc0000001 }, /* XP */ - { WM_SYSKEYUP, wparam|lparam, VK_MENU, 0xc0000001 }, - { WM_SYSKEYUP, sent|wparam|lparam, VK_MENU, 0xc0000001 }, + { WM_LBUTTONDOWN, wparam, MK_LBUTTON|MK_SHIFT, 0 }, + { WM_LBUTTONDOWN, sent|wparam, MK_LBUTTON|MK_SHIFT, 0 }, + { WM_LBUTTONUP, wparam, MK_SHIFT, 0 }, + { WM_LBUTTONUP, sent|wparam, MK_SHIFT, 0 }, + { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_SHIFT, 0xc0000001 }, /* XP */ + { WM_KEYUP, wparam|lparam, VK_SHIFT, 0xc0000001 }, + { WM_KEYUP, sent|wparam|lparam, VK_SHIFT, 0xc0000001 }, { 0 } }; static const struct message WmF1Seq[] = { @@ -6417,21 +6603,22 @@ static void pump_msg_loop(HWND hwnd, HACCEL hAccel) while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { - struct message log_msg; - - trace("accel: %p, %04x, %08lx, %08lx\n", msg.hwnd, msg.message, msg.wParam, msg.lParam); + struct recvd_message log_msg; /* ignore some unwanted messages */ if (msg.message == WM_MOUSEMOVE || msg.message == WM_GETICON || + msg.message == WM_GETOBJECT || msg.message == WM_TIMER || msg.message == WM_DEVICECHANGE) continue; + log_msg.hwnd = msg.hwnd; log_msg.message = msg.message; log_msg.flags = wparam|lparam; log_msg.wParam = msg.wParam; log_msg.lParam = msg.lParam; + log_msg.descr = "accel"; add_message(&log_msg); if (!hAccel || !TranslateAccelerator(hwnd, hAccel, &msg)) @@ -6445,6 +6632,7 @@ static void pump_msg_loop(HWND hwnd, HACCEL hAccel) static void test_accelerators(void) { RECT rc; + POINT pt; SHORT state; HACCEL hAccel; HWND hwnd = CreateWindowExA(0, "TestWindowClass", NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, @@ -6476,6 +6664,11 @@ static void test_accelerators(void) keybd_event('N', 0, 0, 0); keybd_event('N', 0, KEYEVENTF_KEYUP, 0); pump_msg_loop(hwnd, hAccel); + if (!sequence_cnt) /* we didn't get any message */ + { + skip( "queuing key events not supported\n" ); + goto done; + } ok_sequence(WmVkN, "VK_N press/release", FALSE); trace("testing Shift+VK_N press/release\n"); @@ -6593,6 +6786,7 @@ static void test_accelerators(void) ret = DestroyAcceleratorTable(hAccel); ok( ret, "DestroyAcceleratorTable error %d\n", GetLastError()); + hAccel = 0; trace("testing Alt press/release\n"); flush_sequence(); @@ -6604,23 +6798,6 @@ static void test_accelerators(void) /* this test doesn't pass in Wine for managed windows */ ok_sequence(WmAltPressRelease, "Alt press/release", TRUE); - trace("testing Alt+MouseButton press/release\n"); - /* first, move mouse pointer inside of the window client area */ - GetClientRect(hwnd, &rc); - MapWindowPoints(hwnd, 0, (LPPOINT)&rc, 2); - rc.left += (rc.right - rc.left)/2; - rc.top += (rc.bottom - rc.top)/2; - SetCursorPos(rc.left, rc.top); - - flush_events(); - flush_sequence(); - keybd_event(VK_MENU, 0, 0, 0); - mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); - mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); - keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0); - pump_msg_loop(hwnd, 0); - ok_sequence(WmAltMouseButton, "Alt+MouseButton press/release", FALSE); - trace("testing VK_F1 press/release\n"); keybd_event(VK_F1, 0, 0, 0); keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0); @@ -6633,6 +6810,30 @@ static void test_accelerators(void) pump_msg_loop(hwnd, 0); ok_sequence(WmVkAppsSeq, "VK_APPS press/release", FALSE); + trace("testing Shift+MouseButton press/release\n"); + /* first, move mouse pointer inside of the window client area */ + GetClientRect(hwnd, &rc); + MapWindowPoints(hwnd, 0, (LPPOINT)&rc, 2); + rc.left += (rc.right - rc.left)/2; + rc.top += (rc.bottom - rc.top)/2; + SetCursorPos(rc.left, rc.top); + SetActiveWindow(hwnd); + + flush_events(); + flush_sequence(); + GetCursorPos(&pt); + if (pt.x == rc.left && pt.y == rc.top) + { + keybd_event(VK_SHIFT, 0, 0, 0); + mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); + mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); + keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); + pump_msg_loop(hwnd, 0); + ok_sequence(WmShiftMouseButton, "Shift+MouseButton press/release", FALSE); + } + +done: + if (hAccel) DestroyAcceleratorTable(hAccel); DestroyWindow(hwnd); } @@ -6644,12 +6845,7 @@ static LRESULT MsgCheckProc (BOOL unicode, HWND hwnd, UINT message, static long defwndproc_counter = 0; static long beginpaint_counter = 0; LRESULT ret; - struct message msg; - - trace("%p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; + struct recvd_message msg; /* ignore registered messages */ if (message >= 0xc000) return 0; @@ -6709,40 +6905,27 @@ static LRESULT MsgCheckProc (BOOL unicode, HWND hwnd, UINT message, /* test_accelerators() depends on this */ case WM_NCHITTEST: return HTCLIENT; - + /* ignore */ case WM_MOUSEMOVE: + case WM_MOUSEACTIVATE: + case WM_NCMOUSEMOVE: case WM_SETCURSOR: + case WM_GETICON: + case WM_GETOBJECT: case WM_DEVICECHANGE: + case WM_IME_SELECT: return 0; - - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; if (beginpaint_counter) msg.flags |= beginpaint; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "MsgCheckProc"; add_message(&msg); if (message == WM_GETMINMAXINFO && (GetWindowLongA(hwnd, GWL_STYLE) & WS_CHILD)) @@ -6798,26 +6981,26 @@ static LRESULT WINAPI PopupMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; - - trace("popup: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + struct recvd_message msg; switch (message) { case WM_GETICON: - /* explicitly ignore WM_GETICON message */ - return 0; + case WM_GETOBJECT: + return 0; /* ignore them */ case WM_QUERYENDSESSION: case WM_ENDSESSION: lParam &= ~0x01; /* Vista adds a 0x01 flag */ break; } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "popup"; add_message(&msg); if (message == WM_CREATE) @@ -6838,18 +7021,13 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam static long defwndproc_counter = 0; static long beginpaint_counter = 0; LRESULT ret; - struct message msg; - LPARAM logged_lParam; + struct recvd_message msg; - trace("parent: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; + if (message == WM_GETICON || message == WM_GETOBJECT) return 0; /* ignore them */ /* ignore registered messages */ if (message >= 0xc000) return 0; - logged_lParam=lParam; if (log_all_parent_messages || message == WM_PARENTNOTIFY || message == WM_CANCELMODE || message == WM_SETFOCUS || message == WM_KILLFOCUS || @@ -6864,6 +7042,7 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam return HTCLIENT; case WM_SETCURSOR: case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: return 0; case WM_ERASEBKGND: @@ -6875,53 +7054,16 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam ret, rc.left, rc.top, rc.right, rc.bottom); break; } - - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } - - case WM_DRAWITEM: - { - /* encode DRAWITEMSTRUCT into an LPARAM */ - DRAW_ITEM_STRUCT di; - DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; - - trace("WM_DRAWITEM: type %x, ctl_id %x, item_id %x, action %x, state %x\n", - dis->CtlType, dis->CtlID, dis->itemID, dis->itemAction, dis->itemState); - - di.u.item.type = dis->CtlType; - di.u.item.ctl_id = dis->CtlID; - di.u.item.item_id = dis->itemID; - di.u.item.action = dis->itemAction; - di.u.item.state = dis->itemState; - - logged_lParam = di.u.lp; - break; - } } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|parent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; if (beginpaint_counter) msg.flags |= beginpaint; msg.wParam = wParam; - msg.lParam = logged_lParam; + msg.lParam = lParam; + msg.descr = "parent"; add_message(&msg); } @@ -6946,15 +7088,9 @@ static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARA { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; - trace("dialog: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; - - /* ignore registered messages */ - if (message >= 0xc000) return 0; + if (message == WM_GETICON || message == WM_GETOBJECT) return 0; /* ignore them */ if (test_def_id) { @@ -6966,34 +7102,13 @@ static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARA ok(HIWORD(ret) == DC_HASDEFID, "DM_GETDEFID should return DC_HASDEFID, got %lx\n", ret); } - switch (message) - { - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } - } - + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "dialog"; add_message(&msg); defwndproc_counter++; @@ -7003,53 +7118,11 @@ static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARA return ret; } -static void dump_winpos_flags(UINT flags) -{ - if (!winetest_debug) return; - - if (flags & SWP_SHOWWINDOW) printf("|SWP_SHOWWINDOW"); - if (flags & SWP_HIDEWINDOW) printf("|SWP_HIDEWINDOW"); - if (flags & SWP_NOACTIVATE) printf("|SWP_NOACTIVATE"); - if (flags & SWP_FRAMECHANGED) printf("|SWP_FRAMECHANGED"); - if (flags & SWP_NOCOPYBITS) printf("|SWP_NOCOPYBITS"); - if (flags & SWP_NOOWNERZORDER) printf("|SWP_NOOWNERZORDER"); - if (flags & SWP_NOSENDCHANGING) printf("|SWP_NOSENDCHANGING"); - if (flags & SWP_DEFERERASE) printf("|SWP_DEFERERASE"); - if (flags & SWP_ASYNCWINDOWPOS) printf("|SWP_ASYNCWINDOWPOS"); - if (flags & SWP_NOZORDER) printf("|SWP_NOZORDER"); - if (flags & SWP_NOREDRAW) printf("|SWP_NOREDRAW"); - if (flags & SWP_NOSIZE) printf("|SWP_NOSIZE"); - if (flags & SWP_NOMOVE) printf("|SWP_NOMOVE"); - if (flags & SWP_NOCLIENTSIZE) printf("|SWP_NOCLIENTSIZE"); - if (flags & SWP_NOCLIENTMOVE) printf("|SWP_NOCLIENTMOVE"); - -#define DUMPED_FLAGS \ - (SWP_NOSIZE | \ - SWP_NOMOVE | \ - SWP_NOZORDER | \ - SWP_NOREDRAW | \ - SWP_NOACTIVATE | \ - SWP_FRAMECHANGED | \ - SWP_SHOWWINDOW | \ - SWP_HIDEWINDOW | \ - SWP_NOCOPYBITS | \ - SWP_NOOWNERZORDER | \ - SWP_NOSENDCHANGING | \ - SWP_DEFERERASE | \ - SWP_ASYNCWINDOWPOS | \ - SWP_NOCLIENTSIZE | \ - SWP_NOCLIENTMOVE) - - if(flags & ~DUMPED_FLAGS) printf("|0x%04x", flags & ~DUMPED_FLAGS); - printf("\n"); -#undef DUMPED_FLAGS -} - static LRESULT WINAPI ShowWindowProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; /* log only specific messages we are interested in */ switch (message) @@ -7060,49 +7133,25 @@ static LRESULT WINAPI ShowWindowProcA(HWND hwnd, UINT message, WPARAM wParam, LP case WM_KILLFOCUS: #endif case WM_SHOWWINDOW: - trace("WM_SHOWWINDOW %ld\n", wParam); - break; case WM_SIZE: - trace("WM_SIZE %ld\n", wParam); - break; case WM_MOVE: - trace("WM_MOVE\n"); - break; case WM_GETMINMAXINFO: - trace("WM_GETMINMAXINFO\n"); - break; - case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - trace("flags: "); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); break; - } default: /* ignore */ /*trace("showwindow: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);*/ return DefWindowProcA(hwnd, message, wParam, lParam); } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "show"; add_message(&msg); defwndproc_counter++; @@ -7112,7 +7161,7 @@ static LRESULT WINAPI ShowWindowProcA(HWND hwnd, UINT message, WPARAM wParam, LP return ret; } -LRESULT WINAPI PaintLoopProcA(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI PaintLoopProcA(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { @@ -7152,7 +7201,7 @@ static BOOL RegisterWindowClasses(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "TestWindowClass"; @@ -7229,32 +7278,14 @@ static BOOL is_our_logged_class(HWND hwnd) !lstrcmpiA(buf, "#32770") || !lstrcmpiA(buf, "#32768")) return TRUE; - trace("ignoring window class %s\n", buf); } return FALSE; } -static HHOOK hCBT_hook; -static DWORD cbt_hook_thread_id; - static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) { - static const char * const CBT_code_name[10] = { - "HCBT_MOVESIZE", - "HCBT_MINMAX", - "HCBT_QS", - "HCBT_CREATEWND", - "HCBT_DESTROYWND", - "HCBT_ACTIVATE", - "HCBT_CLICKSKIPPED", - "HCBT_KEYSKIPPED", - "HCBT_SYSCOMMAND", - "HCBT_SETFOCUS" }; - const char *code_name = (nCode >= 0 && nCode <= HCBT_SETFOCUS) ? CBT_code_name[nCode] : "Unknown"; HWND hwnd; - trace("CBT: %d (%s), %08lx, %08lx\n", nCode, code_name, wParam, lParam); - ok(cbt_hook_thread_id == GetCurrentThreadId(), "we didn't ask for events from other threads\n"); if (nCode == HCBT_CLICKSKIPPED) @@ -7265,12 +7296,14 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) if (nCode == HCBT_SYSCOMMAND || nCode == HCBT_KEYSKIPPED) { - struct message msg; + struct recvd_message msg; + msg.hwnd = 0; msg.message = nCode; msg.flags = hook|wparam|lparam; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "CBT"; add_message(&msg); return CallNextHookEx(hCBT_hook, nCode, wParam, lParam); @@ -7295,12 +7328,14 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) if (is_our_logged_class(hwnd)) { - struct message msg; + struct recvd_message msg; + msg.hwnd = hwnd; msg.message = nCode; msg.flags = hook|wparam|lparam; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "CBT"; add_message(&msg); } return CallNextHookEx(hCBT_hook, nCode, wParam, lParam); @@ -7314,9 +7349,6 @@ static void CALLBACK win_event_proc(HWINEVENTHOOK hevent, DWORD thread_id, DWORD event_time) { - trace("WEH:%p,event %08x,hwnd %p,obj %08x,id %08x,thread %08x,time %08x\n", - hevent, event, hwnd, object_id, child_id, thread_id, event_time); - ok(thread_id == GetCurrentThreadId(), "we didn't ask for events from other threads\n"); /* ignore mouse cursor events */ @@ -7324,12 +7356,14 @@ static void CALLBACK win_event_proc(HWINEVENTHOOK hevent, if (!hwnd || is_our_logged_class(hwnd)) { - struct message msg; + struct recvd_message msg; + msg.hwnd = hwnd; msg.message = event; msg.flags = winevent_hook|wparam|lparam; msg.wParam = object_id; msg.lParam = child_id; + msg.descr = "WEH"; add_message(&msg); } } @@ -7673,20 +7707,19 @@ static void CALLBACK win_event_global_hook_proc(HWINEVENTHOOK hevent, { char buf[256]; - trace("WEH_2:%p,event %08x,hwnd %p,obj %08x,id %08x,thread %08x,time %08x\n", - hevent, event, hwnd, object_id, child_id, thread_id, event_time); - if (GetClassNameA(hwnd, buf, sizeof(buf))) { if (!lstrcmpiA(buf, "TestWindowClass") || !lstrcmpiA(buf, "static")) { - struct message msg; + struct recvd_message msg; + msg.hwnd = hwnd; msg.message = event; msg.flags = winevent_hook|wparam|lparam; msg.wParam = object_id; msg.lParam = (thread_id == GetCurrentThreadId()) ? child_id : (child_id + 2); + msg.descr = "WEH_2"; add_message(&msg); } } @@ -7700,16 +7733,16 @@ static LRESULT CALLBACK cbt_global_hook_proc(int nCode, WPARAM wParam, LPARAM lP HWND hwnd; char buf[256]; - trace("CBT_2: %d, %08lx, %08lx\n", nCode, wParam, lParam); - if (nCode == HCBT_SYSCOMMAND) { - struct message msg; + struct recvd_message msg; + msg.hwnd = 0; msg.message = nCode; msg.flags = hook|wparam|lparam; msg.wParam = wParam; msg.lParam = (cbt_global_hook_thread_id == GetCurrentThreadId()) ? 1 : 2; + msg.descr = "CBT_2"; add_message(&msg); return CallNextHookEx(hCBT_global_hook, nCode, wParam, lParam); @@ -7722,11 +7755,12 @@ static LRESULT CALLBACK cbt_global_hook_proc(int nCode, WPARAM wParam, LPARAM lP /* we can't test for real mouse events */ if (mhll->flags & LLMHF_INJECTED) { - struct message msg; + struct recvd_message msg; memset (&msg, 0, sizeof (msg)); msg.message = wParam; msg.flags = hook; + msg.descr = "CBT_2"; add_message(&msg); } return CallNextHookEx(hCBT_global_hook, nCode, wParam, lParam); @@ -7740,12 +7774,14 @@ static LRESULT CALLBACK cbt_global_hook_proc(int nCode, WPARAM wParam, LPARAM lP if (!lstrcmpiA(buf, "TestWindowClass") || !lstrcmpiA(buf, "static")) { - struct message msg; + struct recvd_message msg; + msg.hwnd = hwnd; msg.message = nCode; msg.flags = hook|wparam|lparam; msg.wParam = wParam; msg.lParam = (cbt_global_hook_thread_id == GetCurrentThreadId()) ? 1 : 2; + msg.descr = "CBT_2"; add_message(&msg); } } @@ -7876,7 +7912,7 @@ static void test_winevents(void) hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; hthread = CreateThread(NULL, 0, cbt_global_hook_thread_proc, &hwnd2, 0, &tid); ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError()); @@ -7929,7 +7965,7 @@ static void test_winevents(void) ok_sequence(WmWinEventsSeq, "notify winevents", FALSE); /****** start of event filtering test *************/ - hhook = (HWINEVENTHOOK)pSetWinEventHook( + hhook = pSetWinEventHook( EVENT_OBJECT_SHOW, /* 0x8002 */ EVENT_OBJECT_LOCATIONCHANGE, /* 0x800B */ GetModuleHandleA(0), win_event_global_hook_proc, @@ -7939,7 +7975,7 @@ static void test_winevents(void) hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; hthread = CreateThread(NULL, 0, win_event_global_thread_proc, &hwnd2, 0, &tid); ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError()); @@ -7968,16 +8004,14 @@ static void test_winevents(void) /****** end of event filtering test *************/ /****** start of out of context event test *************/ - hhook = (HWINEVENTHOOK)pSetWinEventHook( - EVENT_MIN, EVENT_MAX, - 0, win_event_global_hook_proc, - GetCurrentProcessId(), 0, + hhook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, + win_event_global_hook_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(hhook != 0, "SetWinEventHook error %d\n", GetLastError()); hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; flush_sequence(); @@ -8018,13 +8052,13 @@ static void test_winevents(void) /* WH_MOUSE_LL is not supported on Win9x platforms */ if (!hCBT_global_hook) { - trace("Skipping WH_MOUSE_LL test on this platform\n"); + win_skip("Skipping WH_MOUSE_LL test on this platform\n"); goto skip_mouse_ll_hook_test; } hevent = CreateEventA(NULL, 0, 0, NULL); assert(hevent); - hwnd2 = (HWND)hevent; + hwnd2 = hevent; hthread = CreateThread(NULL, 0, mouse_ll_global_thread_proc, &hwnd2, 0, &tid); ok(hthread != NULL, "CreateThread failed, error %d\n", GetLastError()); @@ -8091,8 +8125,8 @@ static void test_set_hook(void) /* even process local incontext hooks require hmodule */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_INCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_INCONTEXT); ok(!hwinevent_hook, "WINEVENT_INCONTEXT requires hModule != 0\n"); ok(GetLastError() == ERROR_HOOK_NEEDS_HMOD || /* Win2k */ GetLastError() == 0xdeadbeef, /* Win9x */ @@ -8100,8 +8134,8 @@ static void test_set_hook(void) /* even thread local incontext hooks require hmodule */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_INCONTEXT); ok(!hwinevent_hook, "WINEVENT_INCONTEXT requires hModule != 0\n"); ok(GetLastError() == ERROR_HOOK_NEEDS_HMOD || /* Win2k */ GetLastError() == 0xdeadbeef, /* Win9x */ @@ -8111,27 +8145,27 @@ static void test_set_hook(void) { /* these 3 tests don't pass under Win9x */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(1, 0, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(1, 0, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(!hwinevent_hook, "SetWinEventHook with invalid event range should fail\n"); ok(GetLastError() == ERROR_INVALID_HOOK_FILTER, "unexpected error %d\n", GetLastError()); SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(-1, 1, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(-1, 1, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(!hwinevent_hook, "SetWinEventHook with invalid event range should fail\n"); ok(GetLastError() == ERROR_INVALID_HOOK_FILTER, "unexpected error %d\n", GetLastError()); SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, 0, 0xdeadbeef, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + 0, 0xdeadbeef, WINEVENT_OUTOFCONTEXT); ok(!hwinevent_hook, "SetWinEventHook with invalid tid should fail\n"); ok(GetLastError() == ERROR_INVALID_THREAD_ID, "unexpected error %d\n", GetLastError()); } SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(0, 0, - 0, win_event_proc, GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(0, 0, 0, win_event_proc, + GetCurrentProcessId(), 0, WINEVENT_OUTOFCONTEXT); ok(hwinevent_hook != 0, "SetWinEventHook error %d\n", GetLastError()); ok(GetLastError() == 0xdeadbeef, "unexpected error %d\n", GetLastError()); ret = pUnhookWinEvent(hwinevent_hook); @@ -8141,8 +8175,8 @@ todo_wine { /* This call succeeds under win2k SP4, but fails under Wine. Does win2k test/use passed process id? */ SetLastError(0xdeadbeef); - hwinevent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - 0, win_event_proc, 0xdeadbeef, 0, WINEVENT_OUTOFCONTEXT); + hwinevent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, 0, win_event_proc, + 0xdeadbeef, 0, WINEVENT_OUTOFCONTEXT); ok(hwinevent_hook != 0, "SetWinEventHook error %d\n", GetLastError()); ok(GetLastError() == 0xdeadbeef, "unexpected error %d\n", GetLastError()); ret = pUnhookWinEvent(hwinevent_hook); @@ -8159,6 +8193,7 @@ todo_wine { static const struct message ScrollWindowPaint1[] = { { WM_PAINT, sent }, { WM_ERASEBKGND, sent|beginpaint }, + { WM_GETTEXTLENGTH, sent|optional }, { 0 } }; @@ -8211,10 +8246,9 @@ static void test_scrollwindowex(void) trace("start scroll\n"); ScrollWindowEx( hwnd, 10, 10, &rect, NULL, NULL, NULL, SW_SCROLLCHILDREN|SW_ERASE|SW_INVALIDATE); - todo_wine { /* wine sends WM_POSCHANGING, WM_POSCHANGED messages */ - /* windows sometimes a WM_MOVE */ - ok_sequence(WmEmptySeq, "ScrollWindowEx", 0); - } + /* wine sends WM_POSCHANGING, WM_POSCHANGED messages */ + /* windows sometimes a WM_MOVE */ + ok_sequence(WmEmptySeq, "ScrollWindowEx", TRUE); trace("end scroll\n"); flush_sequence(); flush_events(); @@ -8261,7 +8295,7 @@ static void test_DestroyWindow(void) { BOOL ret; HWND parent, child1, child2, child3, child4, test; - UINT child_id = WND_CHILD_ID + 1; + UINT_PTR child_id = WND_CHILD_ID + 1; parent = CreateWindowExA(0, "TestWindowClass", NULL, WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, 0, 0, 0, NULL); @@ -8676,21 +8710,17 @@ static LRESULT CALLBACK edit_hook_proc(HWND hwnd, UINT message, WPARAM wParam, L { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; - trace("edit: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); - - /* explicitly ignore WM_GETICON message */ - if (message == WM_GETICON) return 0; - - /* ignore registered messages */ - if (message >= 0xc000) return 0; + if (message == WM_GETICON || message == WM_GETOBJECT) return 0; /* ignore them */ + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "edit"; add_message(&msg); defwndproc_counter++; @@ -8815,11 +8845,22 @@ static const struct message WmKeyDownSkippedSeq[] = { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'N', 1 }, /* XP */ { 0 } }; +static const struct message WmKeyDownWasDownSkippedSeq[] = +{ + { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'N', 0x40000001 }, /* XP */ + { 0 } +}; static const struct message WmKeyUpSkippedSeq[] = { { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'N', 0xc0000001 }, /* XP */ { 0 } }; +static const struct message WmUserKeyUpSkippedSeq[] = +{ + { WM_USER, sent }, + { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'N', 0xc0000001 }, /* XP */ + { 0 } +}; #define EV_STOP 0 #define EV_SENDMSG 1 @@ -8900,6 +8941,11 @@ static void test_PeekMessage(void) qs_all_input &= ~QS_RAWINPUT; qs_input &= ~QS_RAWINPUT; } + if (qstatus & QS_POSTMESSAGE) + { + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) /* nothing */ ; + qstatus = GetQueueStatus(qs_all_input); + } ok(qstatus == 0, "wrong qstatus %08x\n", qstatus); trace("signalling to send message\n"); @@ -8931,6 +8977,11 @@ static void test_PeekMessage(void) keybd_event('N', 0, 0, 0); keybd_event('N', 0, KEYEVENTF_KEYUP, 0); qstatus = GetQueueStatus(qs_all_input); + if (!(qstatus & MAKELONG(QS_KEY, QS_KEY))) + { + skip( "queuing key events not supported\n" ); + goto done; + } ok(qstatus == MAKELONG(QS_KEY, QS_KEY), "wrong qstatus %08x\n", qstatus); @@ -9234,6 +9285,7 @@ todo_wine { ok(ret && msg.message == WM_KEYDOWN && msg.wParam == 'N', "got %d and %04x wParam %08lx instead of TRUE and WM_KEYDOWN wParam 'N'\n", ret, msg.message, msg.wParam); + ok_sequence(WmKeyDownSkippedSeq, "WmKeyDownSkippedSeq", FALSE); qstatus = GetQueueStatus(qs_all_input); ok(qstatus == 0, "wrong qstatus %08x\n", qstatus); } @@ -9252,6 +9304,7 @@ todo_wine { ok(ret && msg.message == WM_KEYDOWN && msg.wParam == 'N', "got %d and %04x wParam %08lx instead of TRUE and WM_KEYDOWN wParam 'N'\n", ret, msg.message, msg.wParam); + ok_sequence(WmKeyDownWasDownSkippedSeq, "WmKeyDownWasDownSkippedSeq", FALSE); qstatus = GetQueueStatus(qs_all_input); ok(qstatus == MAKELONG(0, QS_POSTMESSAGE), "wrong qstatus %08x\n", qstatus); } @@ -9287,7 +9340,7 @@ todo_wine { ok(ret && msg.message == WM_KEYUP && msg.wParam == 'N', "got %d and %04x wParam %08lx instead of TRUE and WM_KEYDOWN wParam 'N'\n", ret, msg.message, msg.wParam); - ok_sequence(WmUser, "WmUser", FALSE); + ok_sequence(WmUserKeyUpSkippedSeq, "WmUserKeyUpSkippedSeq", FALSE); qstatus = GetQueueStatus(qs_all_input); ok(qstatus == MAKELONG(0, QS_POSTMESSAGE), "wrong qstatus %08x\n", qstatus); } @@ -9326,10 +9379,11 @@ static void wait_move_event(HWND hwnd, int x, int y) while (GetTickCount() - time < 200 && !go) { ret = PeekMessageA(&msg, hwnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_NOREMOVE); go = ret && msg.pt.x > x && msg.pt.y > y; + if (!ret) MsgWaitForMultipleObjects( 0, NULL, FALSE, GetTickCount() - time, QS_ALLINPUT ); } } -#define STEP 20 +#define STEP 5 static void test_PeekMessage2(void) { HWND hwnd; @@ -9359,11 +9413,16 @@ static void test_PeekMessage2(void) /* Do initial mousemove, wait until we can see it and then do our test peek with PM_NOREMOVE. */ mouse_event(MOUSEEVENTF_MOVE, STEP, STEP, 0, 0); - wait_move_event(hwnd, 80, 80); + wait_move_event(hwnd, 100-STEP, 100-STEP); ret = PeekMessageA(&msg, hwnd, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_NOREMOVE); - ok(ret, "no message available\n"); - if (ret) { + if (!ret) + { + skip( "queuing mouse events not supported\n" ); + goto done; + } + else + { trace("1st move event: %04x %x %d %d\n", msg.message, msg.time, msg.pt.x, msg.pt.y); message = msg.message; time1 = msg.time; @@ -9377,7 +9436,7 @@ static void test_PeekMessage2(void) * Although the previous mousemove message was never removed, the * mousemove we now peek should reflect the recent mouse movements * because the input queue will merge the move events. */ - Sleep(2); + Sleep(100); mouse_event(MOUSEEVENTF_MOVE, STEP, STEP, 0, 0); wait_move_event(hwnd, x1, y1); @@ -9395,7 +9454,7 @@ static void test_PeekMessage2(void) } /* Have another go, to drive the point home */ - Sleep(2); + Sleep(100); mouse_event(MOUSEEVENTF_MOVE, STEP, STEP, 0, 0); wait_move_event(hwnd, x2, y2); @@ -9412,6 +9471,7 @@ static void test_PeekMessage2(void) ok(x3 != x2 && y3 != y2, "coords not changed: (%d %d) (%d %d)\n", x2, y2, x3, y3); } +done: DestroyWindow(hwnd); SetCursorPos(pos.x, pos.y); flush_events(); @@ -9496,12 +9556,14 @@ static void pump_msg_loop_timeout(DWORD timeout, BOOL inject_mouse_move) */ if (msg.message == WM_TIMER || msg.message == WM_SYSTIMER) { - struct message s_msg; + struct recvd_message s_msg; + s_msg.hwnd = msg.hwnd; s_msg.message = msg.message; s_msg.flags = sent|wparam|lparam; s_msg.wParam = msg.wParam; s_msg.lParam = msg.lParam; + s_msg.descr = "msg_loop"; add_message(&s_msg); } DispatchMessage(&msg); @@ -9647,7 +9709,24 @@ static void test_TrackMouseEvent(void) flush_sequence(); track_hover(hwnd, 0); - track_query(TME_HOVER, hwnd, default_hover_time); + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_QUERY; + tme.hwndTrack = (HWND)0xdeadbeef; + tme.dwHoverTime = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = pTrackMouseEvent(&tme); + ok(ret, "TrackMouseEvent(TME_QUERY) error %d\n", GetLastError()); + ok(tme.cbSize == sizeof(tme), "wrong tme.cbSize %u\n", tme.cbSize); + if (!tme.dwFlags) + { + skip( "Cursor not inside window, skipping TrackMouseEvent tests\n" ); + DestroyWindow( hwnd ); + return; + } + ok(tme.dwFlags == TME_HOVER, "wrong tme.dwFlags %08x, expected TME_HOVER\n", tme.dwFlags); + ok(tme.hwndTrack == hwnd, "wrong tme.hwndTrack %p, expected %p\n", tme.hwndTrack, hwnd); + ok(tme.dwHoverTime == default_hover_time, "wrong tme.dwHoverTime %u, expected %u\n", + tme.dwHoverTime, default_hover_time); pump_msg_loop_timeout(default_hover_time, FALSE); ok_sequence(WmMouseHoverSeq, "WmMouseHoverSeq", FALSE); @@ -9663,7 +9742,7 @@ static void test_TrackMouseEvent(void) track_query(TME_HOVER, hwnd, default_hover_time); - pump_msg_loop_timeout(default_hover_time / 2, FALSE); + pump_msg_loop_timeout(default_hover_time, FALSE); ok_sequence(WmMouseHoverSeq, "WmMouseHoverSeq", FALSE); track_query(0, NULL, 0); @@ -9785,9 +9864,9 @@ static const struct message WmShow[] = { }; static const struct message WmShowNoActivate_1[] = { { HCBT_MINMAX, hook|lparam, 0, SW_SHOWNOACTIVATE }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_MOVE, sent|defwinproc }, + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_MOVE, sent|defwinproc|optional }, { WM_SIZE, sent|wparam|defwinproc, SIZE_RESTORED }, { 0 } }; @@ -9812,6 +9891,7 @@ static const struct message WmShowNA_1[] = { static const struct message WmShowNA_2[] = { { WM_SHOWWINDOW, sent|wparam, 1 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, { 0 } }; static const struct message WmRestore_1[] = { @@ -9849,18 +9929,20 @@ static const struct message WmRestore_3[] = { { 0 } }; static const struct message WmRestore_4[] = { - { HCBT_MINMAX, hook|lparam, 0, SW_RESTORE }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_MOVE, sent|defwinproc }, - { WM_SIZE, sent|wparam|defwinproc, SIZE_RESTORED }, + { HCBT_MINMAX, hook|lparam|optional, 0, SW_RESTORE }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_MOVE, sent|defwinproc|optional }, + { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_RESTORED }, { 0 } }; static const struct message WmRestore_5[] = { { HCBT_MINMAX, hook|lparam, 0, SW_SHOWNORMAL }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_MOVE, sent|defwinproc }, + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { HCBT_ACTIVATE, hook|optional }, + { HCBT_SETFOCUS, hook|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_MOVE, sent|defwinproc|optional }, { WM_SIZE, sent|wparam|defwinproc, SIZE_RESTORED }, { 0 } }; @@ -9868,6 +9950,7 @@ static const struct message WmHide_1[] = { { WM_SHOWWINDOW, sent|wparam, 0 }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE }, { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, + { HCBT_ACTIVATE, hook|optional }, { HCBT_SETFOCUS, hook|optional }, /* win2000 sends it */ { 0 } }; @@ -9875,6 +9958,7 @@ static const struct message WmHide_2[] = { { WM_SHOWWINDOW, sent|wparam, 0 }, { WM_WINDOWPOSCHANGING, sent /*|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE*/ }, /* win2000 doesn't add SWP_NOACTIVATE */ { WM_WINDOWPOSCHANGED, sent /*|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE*/ }, /* win2000 doesn't add SWP_NOACTIVATE */ + { HCBT_ACTIVATE, hook|optional }, { 0 } }; static const struct message WmHide_3[] = { @@ -9934,10 +10018,24 @@ static const struct message WmMinMax_1[] = { }; static const struct message WmMinMax_2[] = { { HCBT_MINMAX, hook|lparam, 0, SW_SHOWMAXIMIZED }, + { WM_GETMINMAXINFO, sent|optional }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_FRAMECHANGED|SWP_STATECHANGED }, + { HCBT_ACTIVATE, hook|optional }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, + { HCBT_SETFOCUS, hook|optional }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, + { WM_MOVE, sent|defwinproc|optional }, + { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_MAXIMIZED }, + { HCBT_SETFOCUS, hook|optional }, { 0 } }; static const struct message WmMinMax_3[] = { { HCBT_MINMAX, hook|lparam, 0, SW_MINIMIZE }, + { HCBT_SETFOCUS, hook|optional }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_SHOWWINDOW|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED }, + { WM_MOVE, sent|defwinproc|optional }, + { WM_SIZE, sent|wparam|defwinproc|optional, SIZE_RESTORED }, { 0 } }; static const struct message WmMinMax_4[] = { @@ -9965,9 +10063,9 @@ static const struct message WmShowMaximized_2[] = { { WM_WINDOWPOSCHANGED, sent|optional }, { WM_MOVE, sent|optional }, /* Win9x doesn't send it */ { WM_SIZE, sent|wparam|optional, SIZE_MAXIMIZED }, /* Win9x doesn't send it */ - { WM_WINDOWPOSCHANGING, sent }, + { WM_WINDOWPOSCHANGING, sent|optional }, { HCBT_SETFOCUS, hook|optional }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED }, + { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_FRAMECHANGED|SWP_NOCOPYBITS|SWP_STATECHANGED }, { WM_MOVE, sent|defwinproc }, { WM_SIZE, sent|wparam|defwinproc, SIZE_MAXIMIZED }, { HCBT_SETFOCUS, hook|optional }, @@ -9976,12 +10074,12 @@ static const struct message WmShowMaximized_2[] = { static const struct message WmShowMaximized_3[] = { { HCBT_MINMAX, hook|lparam, 0, SW_SHOWMAXIMIZED }, { WM_GETMINMAXINFO, sent }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, { HCBT_ACTIVATE, hook|optional }, /* win2000 doesn't send it */ { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, /* win2000 doesn't send it */ { HCBT_SETFOCUS, hook|optional }, /* win2000 doesn't send it */ - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED }, - { WM_MOVE, sent|defwinproc }, + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_STATECHANGED, 0, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOSIZE|SWP_NOMOVE }, + { WM_MOVE, sent|defwinproc|optional }, { WM_SIZE, sent|wparam|defwinproc, SIZE_MAXIMIZED }, { 0 } }; @@ -10039,7 +10137,7 @@ static void test_ShowWindow(void) /* 39 */ { SW_SHOWNOACTIVATE, TRUE, WS_VISIBLE, WmEmptySeq, FALSE }, /* 40 */ { SW_MINIMIZE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinimize_2, FALSE }, /* 41 */ { SW_MINIMIZE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinMax_3, FALSE }, -/* 42 */ { SW_SHOWMAXIMIZED, TRUE, WS_VISIBLE|WS_MAXIMIZE, WmShowMaximized_2, TRUE }, +/* 42 */ { SW_SHOWMAXIMIZED, TRUE, WS_VISIBLE|WS_MAXIMIZE, WmShowMaximized_2, FALSE }, /* 43 */ { SW_SHOWMAXIMIZED, TRUE, WS_VISIBLE|WS_MAXIMIZE, WmMinMax_2, FALSE }, /* 44 */ { SW_MINIMIZE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinimize_1, FALSE }, /* 45 */ { SW_MINIMIZE, TRUE, WS_VISIBLE|WS_MINIMIZE, WmMinMax_3, FALSE }, @@ -10106,41 +10204,21 @@ static void test_ShowWindow(void) static INT_PTR WINAPI test_dlg_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - struct message msg; - - trace("dialog: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + struct recvd_message msg; switch (message) { - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - { - WINDOWPOS *winpos = (WINDOWPOS *)lParam; - - trace("%s\n", (message == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x ", - winpos->hwnd, winpos->hwndInsertAfter, - winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - dump_winpos_flags(winpos->flags); - - /* Log only documented flags, win2k uses 0x1000 and 0x2000 - * in the high word for internal purposes - */ - wParam = winpos->flags & 0xffff; - /* We are not interested in the flags that don't match under XP and Win9x */ - wParam &= ~(SWP_NOZORDER); - break; - } - - /* explicitly ignore WM_GETICON message */ case WM_GETICON: - return 0; + case WM_GETOBJECT: + return 0; /* ignore them */ } + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; msg.wParam = wParam; msg.lParam = lParam; + msg.descr = "dialog"; add_message(&msg); /* calling DefDlgProc leads to a recursion under XP */ @@ -10333,23 +10411,26 @@ static void test_nullCallback(void) /* SetActiveWindow( 0 ) hwnd visible */ static const struct message SetActiveWindowSeq0[] = { - { HCBT_ACTIVATE, hook }, + { HCBT_ACTIVATE, hook|optional }, { WM_NCACTIVATE, sent|wparam, 0 }, { WM_GETTEXT, sent|defwinproc|optional }, { WM_ACTIVATE, sent|wparam, 0 }, + { WM_ACTIVATEAPP, sent|wparam|optional, 0 }, + { WM_ACTIVATEAPP, sent|wparam|optional, 0 }, { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOSIZE|SWP_NOMOVE }, - { WM_NCACTIVATE, sent|wparam, 1 }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE }, + { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE }, + { WM_NCACTIVATE, sent|wparam|optional, 1 }, { WM_GETTEXT, sent|defwinproc|optional }, - { WM_ACTIVATE, sent|wparam, 1 }, - { HCBT_SETFOCUS, hook }, + { WM_ACTIVATE, sent|wparam|optional, 1 }, + { HCBT_SETFOCUS, hook|optional }, { WM_KILLFOCUS, sent|defwinproc }, - { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 0 }, - { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 }, + { WM_IME_SETCONTEXT, sent|defwinproc|optional }, + { WM_IME_SETCONTEXT, sent|defwinproc|optional }, + { WM_IME_SETCONTEXT, sent|defwinproc|optional }, { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 1 }, { WM_IME_NOTIFY, sent|wparam|defwinproc|optional, 2 }, - { WM_SETFOCUS, sent|defwinproc }, + { WM_SETFOCUS, sent|defwinproc|optional }, { WM_GETTEXT, sent|optional }, { 0 } }; @@ -10444,9 +10525,8 @@ static void test_SetActiveWindow(void) 100, 100, 200, 200, hwnd, 0, 0, NULL); ok(hwnd != 0, "Failed to create overlapped window\n"); - flush_sequence(); - ok(popup != 0, "Failed to create popup window\n"); + SetForegroundWindow( popup ); flush_sequence(); trace("SetActiveWindow(0)\n"); @@ -10457,11 +10537,7 @@ static void test_SetActiveWindow(void) trace("SetActiveWindow(hwnd), hwnd visible\n"); ret = SetActiveWindow(hwnd); - todo_wine - { - ok( ret == hwnd, "Failed to SetActiveWindow(hwnd), hwnd visible\n"); - } - ok_sequence(SetActiveWindowSeq1, "SetActiveWindow(hwnd), hwnd visible", TRUE); + if (ret == hwnd) ok_sequence(SetActiveWindowSeq1, "SetActiveWindow(hwnd), hwnd visible", TRUE); flush_sequence(); trace("SetActiveWindow(popup), hwnd visible, popup visible\n"); @@ -10476,7 +10552,7 @@ static void test_SetActiveWindow(void) trace("SetActiveWindow(hwnd), hwnd not visible\n"); ret = SetActiveWindow(hwnd); - ok( ret == NULL, "Failed to SetActiveWindow(hwnd), hwnd not visible\n"); + ok( ret == NULL, "SetActiveWindow(hwnd), hwnd not visible, previous is %p\n", ret ); ok_sequence(SetActiveWindowSeq3, "SetActiveWindow(hwnd), hwnd not visible", TRUE); flush_sequence(); @@ -10511,6 +10587,7 @@ static void test_SetForegroundWindow(void) WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, 0, 0, 0, NULL); ok (hwnd != 0, "Failed to create overlapped window\n"); + SetForegroundWindow( hwnd ); flush_sequence(); trace("SetForegroundWindow( 0 )\n"); @@ -10540,7 +10617,7 @@ static void test_dbcs_wm_char(void) if (!pGetCPInfoExA) { - skip("GetCPInfoExA is not available\n"); + win_skip("GetCPInfoExA is not available\n"); return; } @@ -10882,7 +10959,7 @@ static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPAR { static long defwndproc_counter = 0; LRESULT ret; - struct message msg; + struct recvd_message msg; /* do not log painting messages */ if (message != WM_PAINT && @@ -10891,16 +10968,17 @@ static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPAR message != WM_ERASEBKGND && message != WM_NCHITTEST && message != WM_GETTEXT && + message != WM_GETOBJECT && message != WM_GETICON && message != WM_DEVICECHANGE) { - trace("listbox: %p, %04x, %08lx, %08lx\n", hwnd, message, wp, lp); - + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wp; msg.lParam = lp; + msg.descr = "listbox"; add_message(&msg); } @@ -11107,14 +11185,14 @@ static LRESULT WINAPI parent_menu_proc(HWND hwnd, UINT message, WPARAM wp, LPARA message == WM_COMMAND || message == WM_MENUCOMMAND) { - struct message msg; - - trace("parent_menu_proc: %p, %04x, %08lx, %08lx\n", hwnd, message, wp, lp); + struct recvd_message msg; + msg.hwnd = hwnd; msg.message = message; msg.flags = sent|wparam|lparam; msg.wParam = wp; msg.lParam = lp; + msg.descr = "parent_menu_proc"; add_message(&msg); } @@ -11159,7 +11237,7 @@ static void test_menu_messages(void) if (!pGetMenuInfo || !pSetMenuInfo) { - skip("GetMenuInfo and/or SetMenuInfo are not available\n"); + win_skip("GetMenuInfo and/or SetMenuInfo are not available\n"); return; } cls.style = 0; @@ -11168,7 +11246,7 @@ static void test_menu_messages(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "TestMenuClass"; @@ -11215,6 +11293,11 @@ static void test_menu_messages(void) TranslateMessage(&msg); DispatchMessage(&msg); } + if (!sequence_cnt) /* we didn't get any message */ + { + skip( "queuing key events not supported\n" ); + goto done; + } ok_sequence(wm_popup_menu_1, "popup menu command", FALSE); /* Alt+F, Right, Enter */ @@ -11268,6 +11351,7 @@ static void test_menu_messages(void) } ok_sequence(wm_popup_menu_3, "submenu of a popup menu command", FALSE); +done: DestroyWindow(hwnd); DestroyMenu(hmenu); } @@ -11297,6 +11381,22 @@ static void test_paintingloop(void) DestroyWindow(hwnd); } +static void test_defwinproc(void) +{ + HWND hwnd; + MSG msg; + int gotwmquit = FALSE; + hwnd = CreateWindowExA(0, "static", "test_defwndproc", WS_POPUP, 0,0,0,0,0,0,0, NULL); + assert(hwnd); + DefWindowProcA( hwnd, WM_ENDSESSION, 1, 0); + while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) { + if( msg.message == WM_QUIT) gotwmquit = TRUE; + DispatchMessageA( &msg ); + } + ok( gotwmquit == FALSE, "Unexpected WM_QUIT message!\n"); + DestroyWindow( hwnd); +} + START_TEST(msg) { BOOL ret; @@ -11308,25 +11408,22 @@ START_TEST(msg) if (pSetWinEventHook) { - hEvent_hook = (HWINEVENTHOOK)pSetWinEventHook(EVENT_MIN, EVENT_MAX, - GetModuleHandleA(0), - win_event_proc, - 0, - GetCurrentThreadId(), - WINEVENT_INCONTEXT); - assert(hEvent_hook); - - if (pIsWinEventHookInstalled) + hEvent_hook = pSetWinEventHook(EVENT_MIN, EVENT_MAX, + GetModuleHandleA(0), win_event_proc, + 0, GetCurrentThreadId(), + WINEVENT_INCONTEXT); + if (pIsWinEventHookInstalled && hEvent_hook) { UINT event; for (event = EVENT_MIN; event <= EVENT_MAX; event++) ok(pIsWinEventHookInstalled(event), "IsWinEventHookInstalled(%u) failed\n", event); } } + if (!hEvent_hook) win_skip( "no win event hook support\n" ); cbt_hook_thread_id = GetCurrentThreadId(); hCBT_hook = SetWindowsHookExA(WH_CBT, cbt_hook_proc, 0, GetCurrentThreadId()); - assert(hCBT_hook); + if (!hCBT_hook) win_skip( "cannot set global hook, will skip hook tests\n" ); test_winevents(); @@ -11361,7 +11458,7 @@ START_TEST(msg) test_accelerators(); test_timers(); test_timers_no_wnd(); - test_set_hook(); + if (hCBT_hook) test_set_hook(); test_DestroyWindow(); test_DispatchMessage(); test_SendMessageTimeout(); @@ -11370,7 +11467,7 @@ START_TEST(msg) test_SetActiveWindow(); if (!pTrackMouseEvent) - skip("TrackMouseEvent is not available\n"); + win_skip("TrackMouseEvent is not available\n"); else test_TrackMouseEvent(); @@ -11381,13 +11478,14 @@ START_TEST(msg) test_dbcs_wm_char(); test_menu_messages(); test_paintingloop(); + test_defwinproc(); /* keep it the last test, under Windows it tends to break the tests * which rely on active/foreground windows being correct. */ test_SetForegroundWindow(); UnhookWindowsHookEx(hCBT_hook); - if (pUnhookWinEvent) + if (pUnhookWinEvent && hEvent_hook) { ret = pUnhookWinEvent(hEvent_hook); ok( ret, "UnhookWinEvent error %d\n", GetLastError()); @@ -11397,6 +11495,4 @@ START_TEST(msg) GetLastError() == 0xdeadbeef, /* Win9x */ "unexpected error %d\n", GetLastError()); } - else - skip("UnhookWinEvent is not available\n"); } diff --git a/rostests/winetests/user32/resource.c b/rostests/winetests/user32/resource.c index b8e04932098..c64aff0a60e 100755 --- a/rostests/winetests/user32/resource.c +++ b/rostests/winetests/user32/resource.c @@ -188,29 +188,29 @@ static void test_accel1(void) "still should be two entries in table %u/%u\n", r, n); n=0; - ok( ac[n].cmd == 1000, "cmd 0 not preserved\n"); - ok( ac[n].key == 'A', "key 0 not preserved\n"); - ok( ac[n].fVirt == (FVIRTKEY | FNOINVERT), "fVirt 0 not preserved\n"); + ok( ac[n].cmd == 1000, "cmd 0 not preserved got %x\n", ac[n].cmd); + ok( ac[n].key == 'A', "key 0 not preserved got %x\n", ac[n].key); + ok( ac[n].fVirt == (FVIRTKEY | FNOINVERT), "fVirt 0 not preserved got %x\n", ac[n].fVirt); if (++n == r) goto done; - ok( ac[n].cmd == 0xffff, "cmd 1 not preserved\n"); - ok( ac[n].key == 0xffff, "key 1 not preserved\n"); - ok( ac[n].fVirt == 0x007f, "fVirt 1 not changed\n"); + ok( ac[n].cmd == 0xffff, "cmd 1 not preserved got %x\n", ac[n].cmd); + ok( ac[n].key == 0xffff, "key 1 not preserved got %x\n", ac[n].key); + ok( ac[n].fVirt == 0x007f, "fVirt 1 wrong got %x\n", ac[n].fVirt); if (++n == r) goto done; - ok( ac[n].cmd == 0xfff0, "cmd 2 not preserved\n"); - ok( ac[n].key == 0x00ff, "key 2 not preserved\n"); - ok( ac[n].fVirt == 0x0070, "fVirt 2 not changed\n"); + ok( ac[n].cmd == 0xfff0, "cmd 2 not preserved got %x\n", ac[n].cmd); + ok( (ac[n].key & 0xff) == 0xff, "key 2 not preserved got %x\n", ac[n].key); + ok( ac[n].fVirt == 0x0070, "fVirt 2 wrong got %x\n", ac[n].fVirt); if (++n == r) goto done; - ok( ac[n].cmd == 0xfff0, "cmd 3 not preserved\n"); - ok( ac[n].key == 0x00ff, "key 3 not preserved\n"); - ok( ac[n].fVirt == 0x0000, "fVirt 3 not changed\n"); + ok( ac[n].cmd == 0xfff0, "cmd 3 not preserved got %x\n", ac[n].cmd); + ok( (ac[n].key & 0xff) == 0xff, "key 3 not preserved got %x\n", ac[n].key); + ok( ac[n].fVirt == 0x0000, "fVirt 3 wrong got %x\n", ac[n].fVirt); if (++n == r) goto done; - ok( ac[n].cmd == 0xfff0, "cmd 4 not preserved\n"); - ok( ac[n].key == 0xffff, "key 4 not preserved\n"); - ok( ac[n].fVirt == 0x0001, "fVirt 4 not changed\n"); + ok( ac[n].cmd == 0xfff0, "cmd 4 not preserved got %x\n", ac[n].cmd); + ok( ac[n].key == 0xffff, "key 4 not preserved got %x\n", ac[n].key); + ok( ac[n].fVirt == 0x0001, "fVirt 4 wrong got %x\n", ac[n].fVirt); done: r = DestroyAcceleratorTable( hAccel ); ok( r, "destroy accelerator table\n"); diff --git a/rostests/winetests/user32/sysparams.c b/rostests/winetests/user32/sysparams.c index d6135657c45..05f728d0b27 100755 --- a/rostests/winetests/user32/sysparams.c +++ b/rostests/winetests/user32/sysparams.c @@ -22,7 +22,9 @@ #include #include -#define SPI_SETWHEELSCROLLCHARS 109 +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 /* For SPI_GETMOUSEHOVERWIDTH and more */ +#define _WIN32_IE 0x0700 #include "wine/test.h" #include "windef.h" @@ -174,8 +176,13 @@ static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam case WM_SETTINGCHANGE: if (change_counter>0) { /* ignore these messages caused by resizing of toolbars */ - if( wParam == SPI_SETWORKAREA || displaychange_test_active) break; - if( change_last_param == SPI_SETWORKAREA) { + if( wParam == SPI_SETWORKAREA || + wParam == SPI_ICONVERTICALSPACING || + displaychange_test_active) + break; + if( change_last_param == SPI_SETWORKAREA || + change_last_param == SPI_ICONVERTICALSPACING) + { change_last_param = wParam; break; } @@ -457,6 +464,7 @@ static void test_SPI_SETBEEP( void ) /* 2 */ curr_val = TRUE; rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETBEEP")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_SETBEEP, 0 ); test_reg_key( SPI_SETBEEP_REGKEY, @@ -510,8 +518,7 @@ static const char *setmouse_valuenames[3] = { /* * Runs check for one setting of spi_setmouse. */ -static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, - int nchange ) +static BOOL run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, int nchange ) { BOOL rc; INT mi[3]; @@ -540,6 +547,7 @@ static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *pro /* call ascii version on even calls or if unicode is not available */ rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); } + if (!test_error_msg(rc,"SPI_SETMOUSE")) return FALSE; ok(rc!=0,"SystemParametersInfo: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_SETMOUSE, 0 ); @@ -581,6 +589,7 @@ static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *pro ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" ); } } + return TRUE; } static void test_SPI_SETMOUSE( void ) /* 4 */ @@ -610,7 +619,7 @@ static void test_SPI_SETMOUSE( void ) /* 4 */ if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE")) return; - run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange ); + if (!run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange )) return; /* acceleration change */ curr_val[2] = 2; @@ -647,7 +656,7 @@ static void test_SPI_SETMOUSE( void ) /* 4 */ ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError()); } -static void test_setborder(UINT curr_val, int usesetborder, int dpi) +static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi) { BOOL rc; UINT border, regval; @@ -658,13 +667,15 @@ static void test_setborder(UINT curr_val, int usesetborder, int dpi) rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); if( usesetborder) { - rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETBORDER")) return FALSE; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_SETBORDER, 1 ); } else { /* set non client metrics */ ncm.iBorderWidth = curr_val; rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE| SPIF_SENDCHANGE); + if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return FALSE; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_SETNONCLIENTMETRICS, 1 ); } @@ -690,6 +701,7 @@ static void test_setborder(UINT curr_val, int usesetborder, int dpi) eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" ); eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" ); eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" ); + return TRUE; } static void test_SPI_SETBORDER( void ) /* 6 */ @@ -731,11 +743,11 @@ static void test_SPI_SETBORDER( void ) /* 6 */ * those platforms */ if( !iswin9x) { /* win2k3 fails if you set the same border twice, or if size is 0 */ - test_setborder(2, 1, dpi); + if (!test_setborder(2, 1, dpi)) return; test_setborder(1, 1, dpi); test_setborder(3, 1, dpi); } - test_setborder(1, 0, dpi); + if (!test_setborder(1, 0, dpi)) return; test_setborder(0, 0, dpi); test_setborder(3, 0, dpi); @@ -766,6 +778,7 @@ static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */ rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETKEYBOARDSPEED")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETKEYBOARDSPEED, 0 ); sprintf( buf, "%d", vals[i] ); @@ -781,7 +794,7 @@ static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */ } /* test_SPI_ICONHORIZONTALSPACING helper */ -static void dotest_spi_iconhorizontalspacing( INT curr_val) +static BOOL dotest_spi_iconhorizontalspacing( INT curr_val) { BOOL rc; INT spacing, regval; @@ -789,6 +802,7 @@ static void dotest_spi_iconhorizontalspacing( INT curr_val) rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return FALSE; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_ICONHORIZONTALSPACING, 0 ); if( curr_val < 32) curr_val = 32; @@ -811,6 +825,7 @@ static void dotest_spi_iconhorizontalspacing( INT curr_val) rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE ); ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" ); + return TRUE; } static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */ @@ -825,7 +840,7 @@ static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */ if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return; /* do not increase the value as it would upset the user's icon layout */ - dotest_spi_iconhorizontalspacing( old_spacing - 1); + if (!dotest_spi_iconhorizontalspacing( old_spacing - 1)) return; dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */ /* restore */ rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE ); @@ -852,6 +867,7 @@ static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */ rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETSCREENSAVETIMEOUT")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 ); sprintf( buf, "%d", vals[i] ); @@ -887,6 +903,7 @@ static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */ rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETSCREENSAVEACTIVE")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETSCREENSAVEACTIVE, 0 ); test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY, @@ -927,6 +944,7 @@ static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */ rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETKEYBOARDDELAY")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETKEYBOARDDELAY, 0 ); sprintf( buf, "%d", vals[i] ); @@ -944,7 +962,7 @@ static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */ /* test_SPI_ICONVERTICALSPACING helper */ -static void dotest_spi_iconverticalspacing( INT curr_val) +static BOOL dotest_spi_iconverticalspacing( INT curr_val) { BOOL rc; INT spacing, regval; @@ -952,6 +970,7 @@ static void dotest_spi_iconverticalspacing( INT curr_val) rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return FALSE; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_ICONVERTICALSPACING, 0 ); if( curr_val < 32) curr_val = 32; @@ -974,6 +993,7 @@ static void dotest_spi_iconverticalspacing( INT curr_val) rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE ); ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" ); + return TRUE; } static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */ @@ -988,7 +1008,7 @@ static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */ if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return; /* do not increase the value as it would upset the user's icon layout */ - dotest_spi_iconverticalspacing( old_spacing - 1); + if (!dotest_spi_iconverticalspacing( old_spacing - 1)) return; /* same tests with a value less than the minimum 32 */ dotest_spi_iconverticalspacing( 10); /* restore */ @@ -1026,6 +1046,7 @@ static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */ rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETICONTITLEWRAP")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETICONTITLEWRAP, 1 ); regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, @@ -1069,6 +1090,7 @@ static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */ rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETMENUDROPALIGNMENT")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETMENUDROPALIGNMENT, 0 ); test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1, @@ -1227,9 +1249,8 @@ static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */ SetLastError(0xdeadbeef); rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); - if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEBUTTONSWAP")) - break; - + if (!test_error_msg(rc,"SPI_SETMOUSEBUTTONSWAP")) return; + test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 ); test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY, SPI_SETMOUSEBUTTONSWAP_VALNAME, @@ -1284,6 +1305,7 @@ static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */ rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETDRAGFULLWINDOWS")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETDRAGFULLWINDOWS, 0 ); test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY, @@ -1351,6 +1373,7 @@ static int get_tmheight( LOGFONTA *plf, int flag) } static void test_GetSystemMetrics( void); +static UINT smcxsmsize = 999999999; static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ { @@ -1372,6 +1395,7 @@ static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS")) return; Ncmstart = Ncmorig; + smcxsmsize = Ncmstart.iSmCaptionWidth; /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if the caption font height is higher than the CaptionHeight field, the latter is adjusted accordingly. To be able to restore these setting @@ -1411,6 +1435,7 @@ static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE| SPIF_SENDCHANGE); + if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_SETNONCLIENTMETRICS, 1 ); /* get them back */ @@ -1507,6 +1532,7 @@ static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */ lpMm_cur.iArrange = 5; rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_cur, SPIF_UPDATEINIFILE ); + if (!test_error_msg(rc,"SPI_SETMINIMIZEDMETRICS")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); /* read them back */ rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE ); @@ -1647,6 +1673,7 @@ static void test_SPI_SETICONMETRICS( void ) /* 46 */ strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif"); rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE ); + if (!test_error_msg(rc,"SPI_SETICONMETRICS")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE ); @@ -1734,6 +1761,7 @@ static void test_SPI_SETWORKAREA( void ) /* 47 */ curr_val.bottom = old_area.bottom-1; rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETWORKAREA")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message( SPI_SETWORKAREA, 0 ); rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 ); @@ -1775,6 +1803,7 @@ static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */ rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETSHOWSOUNDS")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETSHOWSOUNDS, 1 ); test_reg_key( SPI_SETSHOWSOUNDS_REGKEY, @@ -1811,6 +1840,7 @@ static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */ rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETKEYBOARDPREF")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETKEYBOARDPREF, 1 ); test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY, SPI_SETKEYBOARDPREF_REGKEY_LEGACY, @@ -1845,6 +1875,7 @@ static void test_SPI_SETSCREENREADER( void ) /* 71 */ rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETSCREENREADER")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETSCREENREADER, 1 ); test_reg_key_ex2( SPI_SETSCREENREADER_REGKEY, SPI_SETSCREENREADER_REGKEY_LEGACY, @@ -1880,6 +1911,7 @@ static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */ rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETFONTSMOOTHING")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETFONTSMOOTHING, 0 ); test_reg_key( SPI_SETFONTSMOOTHING_REGKEY, @@ -1914,6 +1946,7 @@ static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */ rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETLOWPOWERACTIVE")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETLOWPOWERACTIVE, 1 ); test_reg_key( SPI_SETLOWPOWERACTIVE_REGKEY, @@ -1951,6 +1984,7 @@ static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */ rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETPOWEROFFACTIVE")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETPOWEROFFACTIVE, 1 ); test_reg_key( SPI_SETPOWEROFFACTIVE_REGKEY, @@ -1988,6 +2022,7 @@ static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */ rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETSNAPTODEFBUTTON")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETSNAPTODEFBUTTON, 0 ); test_reg_key( SPI_SETSNAPTODEFBUTTON_REGKEY, @@ -2026,6 +2061,7 @@ static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */ rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETMOUSEHOVERWIDTH")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 ); sprintf( buf, "%d", vals[i] ); @@ -2065,6 +2101,7 @@ static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */ rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETMOUSEHOVERHEIGHT")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 ); sprintf( buf, "%d", vals[i] ); @@ -2108,6 +2145,7 @@ static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */ rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETMOUSEHOVERTIME")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETMOUSEHOVERTIME, 0 ); sprintf( buf, "%d", vals[i] ); @@ -2146,6 +2184,7 @@ static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */ rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETWHEELSCROLLLINES")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETWHEELSCROLLLINES, 0 ); sprintf( buf, "%d", vals[i] ); @@ -2184,6 +2223,7 @@ static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */ rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ); + if (!test_error_msg(rc,"SPI_SETMENUSHOWDELAY")) return; ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError()); test_change_message( SPI_SETMENUSHOWDELAY, 0 ); sprintf( buf, "%d", vals[i] ); @@ -2255,6 +2295,7 @@ static void test_SPI_SETWALLPAPER( void ) /* 115 */ strcpy(newval, ""); rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + if (!test_error_msg(rc,"SPI_SETDESKWALLPAPER")) return; ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); test_change_message(SPI_SETDESKWALLPAPER, 0); @@ -2274,7 +2315,7 @@ static void test_WM_DISPLAYCHANGE(void) if (!pChangeDisplaySettingsExA) { - skip("ChangeDisplaySettingsExA is not available\n"); + win_skip("ChangeDisplaySettingsExA is not available\n"); return; } @@ -2303,13 +2344,16 @@ static void test_WM_DISPLAYCHANGE(void) /* Wait quite long for the message, screen setting changes can take some time */ if(change_ret == DISP_CHANGE_SUCCESSFUL) { wait_ret = WaitForSingleObject(displaychange_sem, 10000); + /* we may not get a notification if nothing changed */ + if (wait_ret == WAIT_TIMEOUT && !last_set_bpp && start_bpp == test_bpps[i]) + continue; ok(wait_ret == WAIT_OBJECT_0, "Waiting for the WM_DISPLAYCHANGE message timed out\n"); } displaychange_ok = FALSE; if(change_ret != DISP_CHANGE_SUCCESSFUL) { skip("Setting depth %d failed(ret = %d)\n", test_bpps[i], change_ret); - ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despide mode change failure\n", last_bpp); + ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despite mode change failure\n", last_bpp); continue; } @@ -2435,7 +2479,6 @@ static void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT } static int gsm_error_ctr; -static UINT smcxsmsize = 999999999; #define ok_gsm( i, e)\ {\ @@ -2695,9 +2738,9 @@ START_TEST(sysparams) wc.lpfnWndProc = SysParamsTestWndProc; wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; wc.hInstance = hInstance; - wc.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION ); - wc.hCursor = LoadCursorA( 0, (LPSTR)IDC_ARROW ); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1 ); + wc.hIcon = LoadIconA( 0, IDI_APPLICATION ); + wc.hCursor = LoadCursorA( 0, IDC_ARROW ); + wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); wc.lpszMenuName = 0; wc.cbClsExtra = 0; wc.cbWndExtra = 0; diff --git a/rostests/winetests/user32/text.c b/rostests/winetests/user32/text.c index fc554ae3632..47f52743562 100755 --- a/rostests/winetests/user32/text.c +++ b/rostests/winetests/user32/text.c @@ -316,6 +316,23 @@ static void test_DrawTextCalcRect(void) ok(textheight==0,"Got textheight from DrawTextExA\n"); ok(dtp.uiLengthDrawn==1337, "invalid dtp.uiLengthDrawn = %i\n",dtp.uiLengthDrawn); + /* Margin calculations */ + dtp.cbSize = sizeof(dtp); + dtp.iLeftMargin = 0; + dtp.iRightMargin = 0; + SetRect( &rect, 0, 0, 0, 0); + DrawTextExA(hdc, text, -1, &rect, DT_CALCRECT, &dtp); + textlen = rect.right; /* Width without margin */ + dtp.iLeftMargin = 8; + SetRect( &rect, 0, 0, 0, 0); + DrawTextExA(hdc, text, -1, &rect, DT_CALCRECT, &dtp); + ok(rect.right==dtp.iLeftMargin+textlen ,"Incorrect left margin calculated rc(%d,%d)\n", rect.left, rect.right); + dtp.iLeftMargin = 0; + dtp.iRightMargin = 8; + SetRect( &rect, 0, 0, 0, 0); + DrawTextExA(hdc, text, -1, &rect, DT_CALCRECT, &dtp); + ok(rect.right==dtp.iRightMargin+textlen ,"Incorrect right margin calculated rc(%d,%d)\n", rect.left, rect.right); + /* Wide char versions */ SetRect( &rect, 10,10, 100, 100); SetLastError( 0); diff --git a/rostests/winetests/user32/win.c b/rostests/winetests/user32/win.c index 96a594bbbdf..33f140335fb 100644 --- a/rostests/winetests/user32/win.c +++ b/rostests/winetests/user32/win.c @@ -21,6 +21,7 @@ */ /* To get ICON_SMALL2 with the MSVC headers */ +#define _WIN32_WINNT 0x0501 #include #include @@ -77,7 +78,7 @@ static void flush_events( BOOL remove_messages ) { MSG msg; int diff = 200; - int min_timeout = 50; + int min_timeout = 100; DWORD time = GetTickCount() + diff; while (diff > 0) @@ -86,7 +87,7 @@ static void flush_events( BOOL remove_messages ) if (remove_messages) while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg ); diff = time - GetTickCount(); - min_timeout = 10; + min_timeout = 50; } } @@ -566,7 +567,7 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR { MINMAXINFO* minmax = (MINMAXINFO *)lparam; - trace("hwnd %p, WM_GETMINMAXINFO, %08lx, %08lx\n", hwnd, wparam, lparam); + trace("WM_GETMINMAXINFO: hwnd %p, %08lx, %08lx\n", hwnd, wparam, lparam); dump_minmax_info( minmax ); SetWindowLongPtrA(hwnd, GWLP_USERDATA, 0x20031021); break; @@ -575,8 +576,7 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR { BOOL is_win9x = GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == 0; WINDOWPOS *winpos = (WINDOWPOS *)lparam; - trace("main: WM_WINDOWPOSCHANGING\n"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + trace("main: WM_WINDOWPOSCHANGING %p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", winpos->hwnd, winpos->hwndInsertAfter, winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); if (!(winpos->flags & SWP_NOMOVE)) @@ -596,8 +596,7 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR { RECT rc1, rc2; WINDOWPOS *winpos = (WINDOWPOS *)lparam; - trace("main: WM_WINDOWPOSCHANGED\n"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + trace("main: WM_WINDOWPOSCHANGED %p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", winpos->hwnd, winpos->hwndInsertAfter, winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); ok(winpos->x >= -32768 && winpos->x <= 32767, "bad winpos->x %d\n", winpos->x); @@ -607,22 +606,21 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR ok(winpos->cy >= 0 && winpos->cy <= 32767, "bad winpos->cy %d\n", winpos->cy); GetWindowRect(hwnd, &rc1); - trace("window: (%d,%d)-(%d,%d)\n", rc1.left, rc1.top, rc1.right, rc1.bottom); SetRect(&rc2, winpos->x, winpos->y, winpos->x + winpos->cx, winpos->y + winpos->cy); /* note: winpos coordinates are relative to parent */ MapWindowPoints(GetParent(hwnd), 0, (LPPOINT)&rc2, 2); - trace("pos: (%d,%d)-(%d,%d)\n", rc2.left, rc2.top, rc2.right, rc2.bottom); if (0) { /* Uncomment this once the test succeeds in all cases */ - ok(EqualRect(&rc1, &rc2), "rects do not match\n"); - } + ok(EqualRect(&rc1, &rc2), "rects do not match (%d,%d-%d,%d) / (%d,%d-%d,%d)\n", + rc1.left, rc1.top, rc1.right, rc1.bottom, rc2.left, rc2.top, rc2.right, rc2.bottom ); GetClientRect(hwnd, &rc2); DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, (LPARAM)&rc1); MapWindowPoints(0, hwnd, (LPPOINT)&rc1, 2); ok(EqualRect(&rc1, &rc2), "rects do not match (%d,%d-%d,%d) / (%d,%d-%d,%d)\n", rc1.left, rc1.top, rc1.right, rc1.bottom, rc2.left, rc2.top, rc2.right, rc2.bottom ); + } break; } case WM_NCCREATE: @@ -695,7 +693,7 @@ static BOOL RegisterWindowClasses(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "MainWindowClass"; @@ -708,7 +706,7 @@ static BOOL RegisterWindowClasses(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "ToolWindowClass"; @@ -718,32 +716,34 @@ static BOOL RegisterWindowClasses(void) return TRUE; } -static void verify_window_info(HWND hwnd, const WINDOWINFO *info) +static void verify_window_info(const char *hook, HWND hwnd, const WINDOWINFO *info) { RECT rcWindow, rcClient; DWORD status; - ok(IsWindow(hwnd), "bad window handle\n"); + ok(IsWindow(hwnd), "bad window handle %p in hook %s\n", hwnd, hook); GetWindowRect(hwnd, &rcWindow); - ok(EqualRect(&rcWindow, &info->rcWindow), "wrong rcWindow\n"); + ok(EqualRect(&rcWindow, &info->rcWindow), "wrong rcWindow for %p in hook %s\n", hwnd, hook); GetClientRect(hwnd, &rcClient); /* translate to screen coordinates */ MapWindowPoints(hwnd, 0, (LPPOINT)&rcClient, 2); - ok(EqualRect(&rcClient, &info->rcClient), "wrong rcClient\n"); + ok(EqualRect(&rcClient, &info->rcClient), "wrong rcClient for %p in hook %s\n", hwnd, hook); ok(info->dwStyle == (DWORD)GetWindowLongA(hwnd, GWL_STYLE), - "wrong dwStyle: %08x != %08x\n", info->dwStyle, GetWindowLongA(hwnd, GWL_STYLE)); + "wrong dwStyle: %08x != %08x for %p in hook %s\n", + info->dwStyle, GetWindowLongA(hwnd, GWL_STYLE), hwnd, hook); /* Windows reports some undocumented exstyles in WINDOWINFO, but * doesn't return them in GetWindowLong(hwnd, GWL_EXSTYLE). */ ok((info->dwExStyle & ~0xe0000800) == (DWORD)GetWindowLongA(hwnd, GWL_EXSTYLE), - "wrong dwExStyle: %08x != %08x\n", info->dwExStyle, GetWindowLongA(hwnd, GWL_EXSTYLE)); + "wrong dwExStyle: %08x != %08x for %p in hook %s\n", + info->dwExStyle, GetWindowLongA(hwnd, GWL_EXSTYLE), hwnd, hook); status = (GetActiveWindow() == hwnd) ? WS_ACTIVECAPTION : 0; if (GetForegroundWindow()) - ok(info->dwWindowStatus == status, "wrong dwWindowStatus: %04x != %04x active %p fg %p\n", - info->dwWindowStatus, status, GetActiveWindow(), GetForegroundWindow()); + ok(info->dwWindowStatus == status, "wrong dwWindowStatus: %04x != %04x active %p fg %p in hook %s\n", + info->dwWindowStatus, status, GetActiveWindow(), GetForegroundWindow(), hook); /* win2k and XP return broken border info in GetWindowInfo most of * the time, so there is no point in testing it. @@ -756,10 +756,11 @@ static void verify_window_info(HWND hwnd, const WINDOWINFO *info) ok(info->cyWindowBorders == border, "wrong cyWindowBorders %d != %d\n", info->cyWindowBorders, border); #endif - ok(info->atomWindowType == GetClassLongA(hwnd, GCW_ATOM), "wrong atomWindowType\n"); + ok(info->atomWindowType == GetClassLongA(hwnd, GCW_ATOM), "wrong atomWindowType for %p in hook %s\n", + hwnd, hook); ok(info->wCreatorVersion == 0x0400 /* NT4, Win2000, XP, Win2003 */ || info->wCreatorVersion == 0x0500 /* Vista */, - "wrong wCreatorVersion %04x\n", info->wCreatorVersion); + "wrong wCreatorVersion %04x for %p in hook %s\n", info->wCreatorVersion, hwnd, hook); } static void FixedAdjustWindowRectEx(RECT* rc, LONG style, BOOL menu, LONG exstyle) @@ -790,9 +791,7 @@ static void test_nonclient_area(HWND hwnd) menu = !(style & WS_CHILD) && GetMenu(hwnd) != 0; GetWindowRect(hwnd, &rc_window); - trace("window: (%d,%d)-(%d,%d)\n", rc_window.left, rc_window.top, rc_window.right, rc_window.bottom); GetClientRect(hwnd, &rc_client); - trace("client: (%d,%d)-(%d,%d)\n", rc_client.left, rc_client.top, rc_client.right, rc_client.bottom); /* avoid some cases when things go wrong */ if (IsRectEmpty(&rc_window) || IsRectEmpty(&rc_client) || @@ -802,15 +801,19 @@ static void test_nonclient_area(HWND hwnd) MapWindowPoints(hwnd, 0, (LPPOINT)&rc, 2); FixedAdjustWindowRectEx(&rc, style, menu, exstyle); - trace("calc window: (%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - ok(EqualRect(&rc, &rc_window), "window rect does not match: style:exstyle=0x%08x:0x%08x, menu=%d\n", style, exstyle, menu); + ok(EqualRect(&rc, &rc_window), + "window rect does not match: style:exstyle=0x%08x:0x%08x, menu=%d, win=(%d,%d)-(%d,%d), calc=(%d,%d)-(%d,%d)\n", + style, exstyle, menu, rc_window.left, rc_window.top, rc_window.right, rc_window.bottom, + rc.left, rc.top, rc.right, rc.bottom); CopyRect(&rc, &rc_window); DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, (LPARAM)&rc); MapWindowPoints(0, hwnd, (LPPOINT)&rc, 2); - trace("calc client: (%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - ok(EqualRect(&rc, &rc_client), "client rect does not match: style:exstyle=0x%08x:0x%08x, menu=%d\n", style, exstyle, menu); + ok(EqualRect(&rc, &rc_client), + "client rect does not match: style:exstyle=0x%08x:0x%08x, menu=%d client=(%d,%d)-(%d,%d), calc=(%d,%d)-(%d,%d)\n", + style, exstyle, menu, rc_client.left, rc_client.top, rc_client.right, rc_client.bottom, + rc.left, rc.top, rc.right, rc.bottom); /* NULL rectangle shouldn't crash */ ret = DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, 0); @@ -825,14 +828,14 @@ static void test_nonclient_area(HWND hwnd) CopyRect(&rc_window, &rc_client); MapWindowPoints(hwnd, 0, (LPPOINT)&rc_window, 2); FixedAdjustWindowRectEx(&rc_window, style, menu, exstyle); - trace("calc window: (%d,%d)-(%d,%d)\n", - rc_window.left, rc_window.top, rc_window.right, rc_window.bottom); CopyRect(&rc, &rc_window); DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, (LPARAM)&rc); MapWindowPoints(0, hwnd, (LPPOINT)&rc, 2); - trace("calc client: (%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - ok(EqualRect(&rc, &rc_client), "synthetic rect does not match: style:exstyle=0x%08x:0x%08x, menu=%d\n", style, exstyle, menu); + ok(EqualRect(&rc, &rc_client), + "synthetic rect does not match: style:exstyle=0x%08x:0x%08x, menu=%d, client=(%d,%d)-(%d,%d), calc=(%d,%d)-(%d,%d)\n", + style, exstyle, menu, rc_client.left, rc_client.top, rc_client.right, rc_client.bottom, + rc.left, rc.top, rc.right, rc.bottom); } static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) @@ -849,13 +852,88 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) "HCBT_SYSCOMMAND", "HCBT_SETFOCUS" }; const char *code_name = (nCode >= 0 && nCode <= HCBT_SETFOCUS) ? CBT_code_name[nCode] : "Unknown"; + HWND hwnd = (HWND)wParam; - trace("CBT: %d (%s), %08lx, %08lx\n", nCode, code_name, wParam, lParam); - - /* on HCBT_DESTROYWND window state is undefined */ - if (nCode != HCBT_DESTROYWND && IsWindow((HWND)wParam)) + switch (nCode) { - if (pGetWindowInfo) + case HCBT_CREATEWND: + { + static const RECT rc_null; + RECT rc; + LONG style; + CBT_CREATEWNDA *createwnd = (CBT_CREATEWNDA *)lParam; + trace("HCBT_CREATEWND: hwnd %p, parent %p, style %08x\n", + hwnd, createwnd->lpcs->hwndParent, createwnd->lpcs->style); + ok(createwnd->hwndInsertAfter == HWND_TOP, "hwndInsertAfter should be always HWND_TOP\n"); + + if (pGetWindowInfo) + { + WINDOWINFO info; + info.cbSize = sizeof(WINDOWINFO); + ok(pGetWindowInfo(hwnd, &info), "GetWindowInfo should not fail\n"); + verify_window_info(code_name, hwnd, &info); + } + + /* WS_VISIBLE should be turned off yet */ + style = createwnd->lpcs->style & ~WS_VISIBLE; + ok(style == GetWindowLongA(hwnd, GWL_STYLE), + "style of hwnd and style in the CREATESTRUCT do not match: %08x != %08x\n", + GetWindowLongA(hwnd, GWL_STYLE), style); + + if (0) + { + /* Uncomment this once the test succeeds in all cases */ + if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) + { + ok(GetParent(hwnd) == hwndMessage, + "wrong result from GetParent %p: message window %p\n", + GetParent(hwnd), hwndMessage); + } + else + ok(!GetParent(hwnd), "GetParent should return 0 at this point\n"); + + ok(!GetWindow(hwnd, GW_OWNER), "GW_OWNER should be set to 0 at this point\n"); + } + if (0) + { + /* while NT assigns GW_HWNDFIRST/LAST some values at this point, + * Win9x still has them set to 0. + */ + ok(GetWindow(hwnd, GW_HWNDFIRST) != 0, "GW_HWNDFIRST should not be set to 0 at this point\n"); + ok(GetWindow(hwnd, GW_HWNDLAST) != 0, "GW_HWNDLAST should not be set to 0 at this point\n"); + } + ok(!GetWindow(hwnd, GW_HWNDPREV), "GW_HWNDPREV should be set to 0 at this point\n"); + ok(!GetWindow(hwnd, GW_HWNDNEXT), "GW_HWNDNEXT should be set to 0 at this point\n"); + + if (0) + { + /* Uncomment this once the test succeeds in all cases */ + if (pGetAncestor) + { + ok(pGetAncestor(hwnd, GA_PARENT) == hwndMessage, "GA_PARENT should be set to hwndMessage at this point\n"); + ok(pGetAncestor(hwnd, GA_ROOT) == hwnd, + "GA_ROOT is set to %p, expected %p\n", pGetAncestor(hwnd, GA_ROOT), hwnd); + + if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) + ok(pGetAncestor(hwnd, GA_ROOTOWNER) == hwndMessage, + "GA_ROOTOWNER should be set to hwndMessage at this point\n"); + else + ok(pGetAncestor(hwnd, GA_ROOTOWNER) == hwnd, + "GA_ROOTOWNER is set to %p, expected %p\n", pGetAncestor(hwnd, GA_ROOTOWNER), hwnd); + } + + ok(GetWindowRect(hwnd, &rc), "GetWindowRect failed\n"); + ok(EqualRect(&rc, &rc_null), "window rect should be set to 0 HCBT_CREATEWND\n"); + ok(GetClientRect(hwnd, &rc), "GetClientRect failed\n"); + ok(EqualRect(&rc, &rc_null), "client rect should be set to 0 on HCBT_CREATEWND\n"); + } + break; + } + case HCBT_MOVESIZE: + case HCBT_MINMAX: + case HCBT_ACTIVATE: + case HCBT_SETFOCUS: + if (pGetWindowInfo && IsWindow(hwnd)) { WINDOWINFO info; @@ -864,78 +942,16 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) * WinXP do not check it at all. */ info.cbSize = sizeof(WINDOWINFO); - ok(pGetWindowInfo((HWND)wParam, &info), "GetWindowInfo should not fail\n"); - verify_window_info((HWND)wParam, &info); - } - } - - switch (nCode) - { - case HCBT_CREATEWND: - { - static const RECT rc_null; - RECT rc; - LONG style; - CBT_CREATEWNDA *createwnd = (CBT_CREATEWNDA *)lParam; - trace("HCBT_CREATEWND: hwnd %p, parent %p, style %08x\n", - (HWND)wParam, createwnd->lpcs->hwndParent, createwnd->lpcs->style); - ok(createwnd->hwndInsertAfter == HWND_TOP, "hwndInsertAfter should be always HWND_TOP\n"); - - /* WS_VISIBLE should be turned off yet */ - style = createwnd->lpcs->style & ~WS_VISIBLE; - ok(style == GetWindowLongA((HWND)wParam, GWL_STYLE), - "style of hwnd and style in the CREATESTRUCT do not match: %08x != %08x\n", - GetWindowLongA((HWND)wParam, GWL_STYLE), style); - - if (0) - { - /* Uncomment this once the test succeeds in all cases */ - if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) - { - ok(GetParent((HWND)wParam) == hwndMessage, - "wrong result from GetParent %p: message window %p\n", - GetParent((HWND)wParam), hwndMessage); - } - else - ok(!GetParent((HWND)wParam), "GetParent should return 0 at this point\n"); - - ok(!GetWindow((HWND)wParam, GW_OWNER), "GW_OWNER should be set to 0 at this point\n"); - } - if (0) - { - /* while NT assigns GW_HWNDFIRST/LAST some values at this point, - * Win9x still has them set to 0. - */ - ok(GetWindow((HWND)wParam, GW_HWNDFIRST) != 0, "GW_HWNDFIRST should not be set to 0 at this point\n"); - ok(GetWindow((HWND)wParam, GW_HWNDLAST) != 0, "GW_HWNDLAST should not be set to 0 at this point\n"); - } - ok(!GetWindow((HWND)wParam, GW_HWNDPREV), "GW_HWNDPREV should be set to 0 at this point\n"); - ok(!GetWindow((HWND)wParam, GW_HWNDNEXT), "GW_HWNDNEXT should be set to 0 at this point\n"); - - if (0) - { - /* Uncomment this once the test succeeds in all cases */ - if (pGetAncestor) - { - ok(pGetAncestor((HWND)wParam, GA_PARENT) == hwndMessage, "GA_PARENT should be set to hwndMessage at this point\n"); - ok(pGetAncestor((HWND)wParam, GA_ROOT) == (HWND)wParam, - "GA_ROOT is set to %p, expected %p\n", pGetAncestor((HWND)wParam, GA_ROOT), (HWND)wParam); - - if ((style & (WS_CHILD|WS_POPUP)) == WS_CHILD) - ok(pGetAncestor((HWND)wParam, GA_ROOTOWNER) == hwndMessage, - "GA_ROOTOWNER should be set to hwndMessage at this point\n"); - else - ok(pGetAncestor((HWND)wParam, GA_ROOTOWNER) == (HWND)wParam, - "GA_ROOTOWNER is set to %p, expected %p\n", pGetAncestor((HWND)wParam, GA_ROOTOWNER), (HWND)wParam); - } - - ok(GetWindowRect((HWND)wParam, &rc), "GetWindowRect failed\n"); - ok(EqualRect(&rc, &rc_null), "window rect should be set to 0 HCBT_CREATEWND\n"); - ok(GetClientRect((HWND)wParam, &rc), "GetClientRect failed\n"); - ok(EqualRect(&rc, &rc_null), "client rect should be set to 0 on HCBT_CREATEWND\n"); - } - break; + ok(pGetWindowInfo(hwnd, &info), "GetWindowInfo should not fail\n"); + verify_window_info(code_name, hwnd, &info); } + break; + /* on HCBT_DESTROYWND window state is undefined */ + case HCBT_DESTROYWND: + trace( "HCBT_DESTROYWND: hwnd %p\n", hwnd ); + break; + default: + break; } return CallNextHookEx(hhook, nCode, wParam, lParam); @@ -970,6 +986,14 @@ static void test_shell_window(void) DWORD pid; HANDLE hProcess; + GetWindowThreadProcessId(shellWindow, &pid); + hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); + if (!hProcess) + { + skip( "cannot get access to shell process\n" ); + return; + } + SetLastError(0xdeadbeef); ret = DestroyWindow(shellWindow); error = GetLastError(); @@ -980,8 +1004,6 @@ static void test_shell_window(void) "got %u after DestroyWindow(shellWindow)\n", error); /* close old shell instance */ - GetWindowThreadProcessId(shellWindow, &pid); - hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); ret = TerminateProcess(hProcess, 0); ok(ret, "termination of previous shell process failed: GetLastError()=%d\n", GetLastError()); WaitForSingleObject(hProcess, INFINITE); /* wait for termination */ @@ -1071,10 +1093,11 @@ static void test_shell_window(void) static char mdi_lParam_test_message[] = "just a test string"; -static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) +static void test_MDI_create(HWND parent, HWND mdi_client, INT_PTR first_id) { MDICREATESTRUCTA mdi_cs; HWND mdi_child; + INT_PTR id; static const WCHAR classW[] = {'M','D','I','_','c','h','i','l','d','_','C','l','a','s','s','_','1',0}; static const WCHAR titleW[] = {'M','D','I',' ','c','h','i','l','d',0}; BOOL isWin9x = FALSE; @@ -1090,14 +1113,16 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) mdi_cs.lParam = (LPARAM)mdi_lParam_test_message; mdi_child = (HWND)SendMessageA(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); mdi_cs.style = 0x7fffffff; /* without WS_POPUP */ mdi_child = (HWND)SendMessageA(mdi_client, WM_MDICREATE, 0, (LPARAM)&mdi_cs); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); @@ -1110,7 +1135,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) else { ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); } @@ -1131,7 +1157,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) } else { - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); } @@ -1143,7 +1170,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) mdi_client, GetModuleHandle(0), (LPARAM)mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); @@ -1154,7 +1182,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) mdi_client, GetModuleHandle(0), (LPARAM)mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); @@ -1171,7 +1200,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) else { ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); } @@ -1193,7 +1223,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) } else { - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); } @@ -1203,9 +1234,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); @@ -1214,9 +1246,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); @@ -1225,7 +1258,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); if (GetWindowLongA(mdi_client, GWL_STYLE) & MDIS_ALLCHILDSTYLES) { ok(!mdi_child, "MDI child with WS_POPUP and with MDIS_ALLCHILDSTYLES should fail\n"); @@ -1233,7 +1266,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) else { ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); } @@ -1245,7 +1279,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); if (!mdi_child) { if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) @@ -1255,7 +1289,8 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) } else { - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == first_id, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == first_id, "wrong child id %ld\n", id); SendMessageA(mdi_client, WM_MDIDESTROY, (WPARAM)mdi_child, 0); ok(!IsWindow(mdi_child), "WM_MDIDESTROY failed\n"); } @@ -1268,7 +1303,7 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, parent, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(!mdi_child, "WS_EX_MDICHILD with a not MDIClient parent should fail\n"); } @@ -1277,9 +1312,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == 0, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == 0, "wrong child id %ld\n", id); DestroyWindow(mdi_child); mdi_child = CreateWindowExA(0, "MDI_child_Class_2", "MDI child", @@ -1287,9 +1323,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == 0, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == 0, "wrong child id %ld\n", id); DestroyWindow(mdi_child); /* maximized child */ @@ -1298,9 +1335,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == 0, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == 0, "wrong child id %ld\n", id); DestroyWindow(mdi_child); trace("Creating maximized child with a caption\n"); @@ -1309,9 +1347,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == 0, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == 0, "wrong child id %ld\n", id); DestroyWindow(mdi_child); trace("Creating maximized child with a caption and a thick frame\n"); @@ -1320,9 +1359,10 @@ static void test_MDI_create(HWND parent, HWND mdi_client, INT first_id) CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, mdi_client, 0, GetModuleHandle(0), - (LPVOID)mdi_lParam_test_message); + mdi_lParam_test_message); ok(mdi_child != 0, "MDI child creation failed\n"); - ok(GetWindowLongPtrA(mdi_child, GWLP_ID) == 0, "wrong child id %d\n", GetWindowLongPtrA(mdi_child, GWLP_ID)); + id = GetWindowLongPtrA(mdi_child, GWLP_ID); + ok(id == 0, "wrong child id %ld\n", id); DestroyWindow(mdi_child); } @@ -1360,7 +1400,7 @@ static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, L case WM_CREATE: { CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; - MDICREATESTRUCTA *mdi_cs = (MDICREATESTRUCTA *)cs->lpCreateParams; + MDICREATESTRUCTA *mdi_cs = cs->lpCreateParams; ok(cs->dwExStyle & WS_EX_MDICHILD, "WS_EX_MDICHILD should be set\n"); ok(mdi_cs->lParam == (LPARAM)mdi_lParam_test_message, "wrong mdi_cs->lParam\n"); @@ -1475,8 +1515,8 @@ static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, L { CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; - trace("%s\n", (msg == WM_NCCREATE) ? "WM_NCCREATE" : "WM_CREATE"); - trace("x %d, y %d, cx %d, cy %d\n", cs->x, cs->y, cs->cx, cs->cy); + trace("%s: x %d, y %d, cx %d, cy %d\n", (msg == WM_NCCREATE) ? "WM_NCCREATE" : "WM_CREATE", + cs->x, cs->y, cs->cx, cs->cy); ok(!(cs->dwExStyle & WS_EX_MDICHILD), "WS_EX_MDICHILD should not be set\n"); ok(cs->lpCreateParams == mdi_lParam_test_message, "wrong cs->lpCreateParams\n"); @@ -1505,19 +1545,16 @@ static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, L MINMAXINFO *minmax = (MINMAXINFO *)lparam; LONG style, exstyle; - trace("WM_GETMINMAXINFO\n"); - style = GetWindowLongA(hwnd, GWL_STYLE); exstyle = GetWindowLongA(hwnd, GWL_EXSTYLE); GetClientRect(parent, &rc); - trace("parent %p client size = (%d x %d)\n", parent, rc.right, rc.bottom); + trace("WM_GETMINMAXINFO: parent %p client size = (%d x %d)\n", parent, rc.right, rc.bottom); GetClientRect(parent, &rc); if ((style & WS_CAPTION) == WS_CAPTION) style &= ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */ AdjustWindowRectEx(&rc, style, 0, exstyle); - trace("calculated max child window size = (%d x %d)\n", rc.right-rc.left, rc.bottom-rc.top); dump_minmax_info( minmax ); ok(minmax->ptMaxSize.x == rc.right - rc.left, "default width of maximized child %d != %d\n", @@ -1533,18 +1570,19 @@ static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, L RECT rc1, rc2; GetWindowRect(hwnd, &rc1); - trace("window: (%d,%d)-(%d,%d)\n", rc1.left, rc1.top, rc1.right, rc1.bottom); SetRect(&rc2, winpos->x, winpos->y, winpos->x + winpos->cx, winpos->y + winpos->cy); /* note: winpos coordinates are relative to parent */ MapWindowPoints(GetParent(hwnd), 0, (LPPOINT)&rc2, 2); - trace("pos: (%d,%d)-(%d,%d)\n", rc2.left, rc2.top, rc2.right, rc2.bottom); - ok(EqualRect(&rc1, &rc2), "rects do not match\n"); - + ok(EqualRect(&rc1, &rc2), "rects do not match, window=(%d,%d)-(%d,%d) pos=(%d,%d)-(%d,%d)\n", + rc1.left, rc1.top, rc1.right, rc1.bottom, + rc2.left, rc2.top, rc2.right, rc2.bottom); GetWindowRect(hwnd, &rc1); GetClientRect(hwnd, &rc2); DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, (LPARAM)&rc1); MapWindowPoints(0, hwnd, (LPPOINT)&rc1, 2); - ok(EqualRect(&rc1, &rc2), "rects do not match\n"); + ok(EqualRect(&rc1, &rc2), "rects do not match, window=(%d,%d)-(%d,%d) client=(%d,%d)-(%d,%d)\n", + rc1.left, rc1.top, rc1.right, rc1.bottom, + rc2.left, rc2.top, rc2.right, rc2.bottom); } /* fall through */ case WM_WINDOWPOSCHANGING: @@ -1552,20 +1590,18 @@ static LRESULT WINAPI mdi_child_wnd_proc_2(HWND hwnd, UINT msg, WPARAM wparam, L WINDOWPOS *winpos = (WINDOWPOS *)lparam; WINDOWPOS my_winpos = *winpos; - trace("%s\n", (msg == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED"); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + trace("%s: %p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + (msg == WM_WINDOWPOSCHANGING) ? "WM_WINDOWPOSCHANGING" : "WM_WINDOWPOSCHANGED", winpos->hwnd, winpos->hwndInsertAfter, winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); DefWindowProcA(hwnd, msg, wparam, lparam); - trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", + ok(!memcmp(&my_winpos, winpos, sizeof(WINDOWPOS)), + "DefWindowProc should not change WINDOWPOS: %p after %p, x %d, y %d, cx %d, cy %d flags %08x\n", winpos->hwnd, winpos->hwndInsertAfter, winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); - ok(!memcmp(&my_winpos, winpos, sizeof(WINDOWPOS)), - "DefWindowProc should not change WINDOWPOS values\n"); - return 1; } } @@ -1595,7 +1631,7 @@ static LRESULT WINAPI mdi_main_wnd_procA(HWND hwnd, UINT msg, WPARAM wparam, LPA /* tests depend on a not zero MDIClient size */ 0, 0, rc.right, rc.bottom, hwnd, 0, GetModuleHandle(0), - (LPVOID)&client_cs); + &client_cs); assert(mdi_client); test_MDI_create(hwnd, mdi_client, client_cs.idFirstChild); DestroyWindow(mdi_client); @@ -1607,7 +1643,7 @@ static LRESULT WINAPI mdi_main_wnd_procA(HWND hwnd, UINT msg, WPARAM wparam, LPA /* tests depend on a not zero MDIClient size */ 0, 0, rc.right, rc.bottom, hwnd, 0, GetModuleHandle(0), - (LPVOID)&client_cs); + &client_cs); assert(mdi_client); test_MDI_create(hwnd, mdi_client, client_cs.idFirstChild); DestroyWindow(mdi_client); @@ -1673,7 +1709,7 @@ static BOOL mdi_RegisterWindowClasses(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "MDI_parent_Class"; @@ -1718,9 +1754,9 @@ static void test_icons(void) { WNDCLASSEXA cls; HWND hwnd; - HICON icon = LoadIconA(0, (LPSTR)IDI_APPLICATION); - HICON icon2 = LoadIconA(0, (LPSTR)IDI_QUESTION); - HICON small_icon = LoadImageA(0, (LPSTR)IDI_APPLICATION, IMAGE_ICON, + HICON icon = LoadIconA(0, IDI_APPLICATION); + HICON icon2 = LoadIconA(0, IDI_QUESTION); + HICON small_icon = LoadImageA(0, IDI_APPLICATION, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED ); HICON res; @@ -1730,9 +1766,9 @@ static void test_icons(void) cls.cbClsExtra = 0; cls.cbWndExtra = 0; cls.hInstance = 0; - cls.hIcon = LoadIconA(0, (LPSTR)IDI_HAND); + cls.hIcon = LoadIconA(0, IDI_HAND); cls.hIconSm = small_icon; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "IconWindowClass"; @@ -1953,7 +1989,7 @@ static void test_SetMenu(HWND parent) static void test_window_tree(HWND parent, const DWORD *style, const int *order, int total) { HWND child[5], hwnd; - int i; + INT_PTR i; assert(total <= 5); @@ -1974,7 +2010,7 @@ static void test_window_tree(HWND parent, const DWORD *style, const int *order, else child[i] = CreateWindowExA(0, "static", "", style[i], 0,0,10,10, parent, (HMENU)i, 0, NULL); - trace("child[%d] = %p\n", i, child[i]); + trace("child[%ld] = %p\n", i, child[i]); ok(child[i] != 0, "CreateWindowEx failed to create child window\n"); } @@ -1985,8 +2021,8 @@ static void test_window_tree(HWND parent, const DWORD *style, const int *order, for (i = 0; i < total; i++) { - trace("hwnd[%d] = %p\n", i, hwnd); - ok(child[order[i]] == hwnd, "Z order of child #%d is wrong\n", i); + trace("hwnd[%ld] = %p\n", i, hwnd); + ok(child[order[i]] == hwnd, "Z order of child #%ld is wrong\n", i); hwnd = GetWindow(hwnd, GW_HWNDNEXT); } @@ -2040,8 +2076,10 @@ static void check_z_order_debug(HWND hwnd, HWND next, HWND prev, HWND owner, test = GetWindow(hwnd, GW_HWNDNEXT); /* skip foreign windows */ - while (test && (GetWindowThreadProcessId(test, NULL) != our_pid || - (void *)(ULONG_PTR)(GetWindowLongPtr(test, GWLP_HINSTANCE)) != GetModuleHandle(0))) + while (test && test != next && + (GetWindowThreadProcessId(test, NULL) != our_pid || + UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)) != GetModuleHandle(0) || + GetWindow(test, GW_OWNER) == next)) { /*trace("skipping next %p (%p)\n", test, UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)));*/ test = GetWindow(test, GW_HWNDNEXT); @@ -2050,8 +2088,10 @@ static void check_z_order_debug(HWND hwnd, HWND next, HWND prev, HWND owner, test = GetWindow(hwnd, GW_HWNDPREV); /* skip foreign windows */ - while (test && (GetWindowThreadProcessId(test, NULL) != our_pid || - (void *)(ULONG_PTR)(GetWindowLongPtr(test, GWLP_HINSTANCE)) != GetModuleHandle(0))) + while (test && test != prev && + (GetWindowThreadProcessId(test, NULL) != our_pid || + UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)) != GetModuleHandle(0) || + GetWindow(test, GW_OWNER) == hwnd)) { /*trace("skipping prev %p (%p)\n", test, UlongToHandle(GetWindowLongPtr(test, GWLP_HINSTANCE)));*/ test = GetWindow(test, GW_HWNDPREV); @@ -2358,7 +2398,11 @@ static void test_SetForegroundWindow(HWND hwnd) check_wnd_state(0, 0, 0, 0); ret = SetForegroundWindow(hwnd); - ok(ret, "SetForegroundWindow returned FALSE instead of TRUE\n"); + if (!ret) + { + skip( "SetForegroundWindow not working\n" ); + return; + } check_wnd_state(hwnd, hwnd, hwnd, 0); SetLastError(0xdeadbeef); @@ -2594,9 +2638,16 @@ static void test_keyboard_input(HWND hwnd) flush_events( TRUE ); PostMessageA(hwnd, WM_KEYDOWN, 0, 0); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + do + { + ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); + ok( ret, "no message available\n"); + } + while (ret && msg.message >= 0xc000); ok(msg.hwnd == hwnd && msg.message == WM_KEYDOWN, "hwnd %p message %04x\n", msg.hwnd, msg.message); - ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); + do + ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); + while (ret && (msg.message == WM_TIMER || msg.message >= 0xc000)); ok( !ret, "message %04x available\n", msg.message); ok(GetFocus() == hwnd, "wrong focus window %p\n", GetFocus()); @@ -2610,7 +2661,12 @@ static void test_keyboard_input(HWND hwnd) ok(GetFocus() == hwnd, "wrong focus window %p\n", GetFocus()); keybd_event(VK_SPACE, 0, 0, 0); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); + if (!ret) + { + skip( "keybd_event didn't work, skipping keyboard test\n" ); + return; + } ok(msg.hwnd == hwnd && msg.message == WM_KEYDOWN, "hwnd %p message %04x\n", msg.hwnd, msg.message); ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); ok( !ret, "message %04x available\n", msg.message); @@ -2643,6 +2699,24 @@ static void test_keyboard_input(HWND hwnd) ok( !ret, "message %04x available\n", msg.message); } +static BOOL wait_for_message( MSG *msg ) +{ + BOOL ret; + + for (;;) + { + ret = PeekMessageA(msg, 0, 0, 0, PM_REMOVE); + if (ret) + { + if (msg->message == WM_PAINT) DispatchMessage(msg); + else if (msg->message < 0xc000) break; /* skip registered messages */ + } + else if (MsgWaitForMultipleObjects( 0, NULL, FALSE, 100, QS_ALLINPUT ) == WAIT_TIMEOUT) break; + } + if (!ret) msg->message = 0; + return ret; +} + static void test_mouse_input(HWND hwnd) { RECT rc; @@ -2655,6 +2729,7 @@ static void test_mouse_input(HWND hwnd) ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); + SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); GetWindowRect(hwnd, &rc); trace("main window %p: (%d,%d)-(%d,%d)\n", hwnd, rc.left, rc.top, rc.right, rc.bottom); @@ -2665,6 +2740,7 @@ static void test_mouse_input(HWND hwnd) assert(popup != 0); ShowWindow(popup, SW_SHOW); UpdateWindow(popup); + SetWindowPos( popup, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); GetWindowRect(popup, &rc); trace("popup window %p: (%d,%d)-(%d,%d)\n", popup, rc.left, rc.top, rc.right, rc.bottom); @@ -2675,7 +2751,11 @@ static void test_mouse_input(HWND hwnd) SetCursorPos(x, y); GetCursorPos(&pt); - ok(x == pt.x && y == pt.y, "wrong cursor pos (%d,%d), expected (%d,%d)\n", pt.x, pt.y, x, y); + if (x != pt.x || y != pt.y) + { + skip( "failed to set mouse position, skipping mouse input tests\n" ); + goto done; + } flush_events( TRUE ); @@ -2701,10 +2781,11 @@ static void test_mouse_input(HWND hwnd) msg.message = 0; mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, 0); + flush_events( FALSE ); /* FIXME: SetCursorPos in Wine generates additional WM_MOUSEMOVE message */ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { - if (msg.message >= 0xc000) continue; /* skip registered messages */ + if (msg.message == WM_TIMER || msg.message >= 0xc000) continue; /* skip registered messages */ ok(msg.hwnd == popup && msg.message == WM_MOUSEMOVE, "hwnd %p message %04x\n", msg.hwnd, msg.message); } @@ -2713,25 +2794,24 @@ static void test_mouse_input(HWND hwnd) mouse_event(MOUSEEVENTF_MOVE, -1, -1, 0, 0); ShowWindow(popup, SW_HIDE); - do - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); - while (msg.message >= 0xc000); /* skip registered messages */ - ok(msg.hwnd == hwnd && msg.message == WM_MOUSEMOVE, "hwnd %p message %04x\n", msg.hwnd, msg.message); + ret = wait_for_message( &msg ); + if (ret) + ok(msg.hwnd == hwnd && msg.message == WM_MOUSEMOVE, "hwnd %p message %04x\n", msg.hwnd, msg.message); flush_events( TRUE ); mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, 0); ShowWindow(hwnd, SW_HIDE); - do - ret = PeekMessageA(&msg, 0, 0, 0, PM_REMOVE); - while (ret && msg.message >= 0xc000); /* skip registered messages */ + ret = wait_for_message( &msg ); ok( !ret, "message %04x available\n", msg.message); flush_events( TRUE ); /* test mouse clicks */ ShowWindow(hwnd, SW_SHOW); + SetWindowPos( hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); flush_events( TRUE ); ShowWindow(popup, SW_SHOW); + SetWindowPos( popup, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE ); flush_events( TRUE ); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); @@ -2739,31 +2819,33 @@ static void test_mouse_input(HWND hwnd) mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); - ok(PeekMessageA(&msg, 0, 0, 0, 0), "no message available\n"); - ok(msg.hwnd == popup && msg.message == WM_LBUTTONDOWN, "hwnd %p/%p message %04x\n", - msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = wait_for_message( &msg ); + if (!ret) + { + skip( "simulating mouse click doesn't work, skipping mouse button tests\n" ); + goto done; + } + if (msg.message == WM_MOUSEMOVE) /* win2k has an extra WM_MOUSEMOVE here */ + { + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); + } + ok(msg.hwnd == popup && msg.message == WM_LBUTTONDOWN, "hwnd %p/%p message %04x\n", msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, 0), "no message available\n"); - ok(msg.hwnd == popup && msg.message == WM_LBUTTONUP, "hwnd %p/%p message %04x\n", - msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); ok(msg.hwnd == popup && msg.message == WM_LBUTTONUP, "hwnd %p/%p message %04x\n", msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, 0), "no message available\n"); - ok(msg.hwnd == popup && msg.message == WM_LBUTTONDBLCLK, "hwnd %p/%p message %04x\n", - msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); ok(msg.hwnd == popup && msg.message == WM_LBUTTONDBLCLK, "hwnd %p/%p message %04x\n", msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, 0), "no message available\n"); - ok(msg.hwnd == popup && msg.message == WM_LBUTTONUP, "hwnd %p/%p message %04x\n", - msg.hwnd, popup, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); ok(msg.hwnd == popup && msg.message == WM_LBUTTONUP, "hwnd %p/%p message %04x\n", msg.hwnd, popup, msg.message); @@ -2778,10 +2860,12 @@ static void test_mouse_input(HWND hwnd) mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); ok(msg.hwnd == hwnd && msg.message == WM_LBUTTONDOWN, "hwnd %p/%p message %04x\n", msg.hwnd, hwnd, msg.message); - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); ok(msg.hwnd == hwnd && msg.message == WM_LBUTTONUP, "hwnd %p/%p message %04x\n", msg.hwnd, hwnd, msg.message); @@ -2789,9 +2873,8 @@ static void test_mouse_input(HWND hwnd) SendMessageA(hwnd, WM_COMMAND, (WPARAM)popup, 0); test_lbuttondown_flag = FALSE; - do - ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); - while (msg.message >= 0xc000); /* skip registered messages */ + ret = wait_for_message( &msg ); + ok(ret, "no message available\n"); ok(msg.hwnd == popup && msg.message == WM_LBUTTONDOWN, "hwnd %p/%p message %04x\n", msg.hwnd, popup, msg.message); ok(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE), "no message available\n"); @@ -2829,6 +2912,7 @@ static void test_mouse_input(HWND hwnd) TEST_MOUSEACTIVATE(HTCLOSE,MA_ACTIVATE); TEST_MOUSEACTIVATE(HTHELP,MA_ACTIVATE); +done: /* Clear any messages left behind by WM_MOUSEACTIVATE tests */ flush_events( TRUE ); @@ -2874,13 +2958,13 @@ static void test_validatergn(HWND hwnd) static void nccalchelper(HWND hwnd, INT x, INT y, RECT *prc) { + RECT rc; MoveWindow( hwnd, 0, 0, x, y, 0); GetWindowRect( hwnd, prc); - trace("window rect is %d,%d - %d,%d\n", - prc->left,prc->top,prc->right,prc->bottom); + rc = *prc; DefWindowProcA(hwnd, WM_NCCALCSIZE, 0, (LPARAM)prc); - trace("nccalc rect is %d,%d - %d,%d\n", - prc->left,prc->top,prc->right,prc->bottom); + trace("window rect is %d,%d - %d,%d, nccalc rect is %d,%d - %d,%d\n", + rc.left,rc.top,rc.right,rc.bottom, prc->left,prc->top,prc->right,prc->bottom); } static void test_nccalcscroll(HWND parent) @@ -3019,7 +3103,7 @@ static LRESULT WINAPI StyleCheckProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM case WM_NCCREATE: case WM_CREATE: lpcs = (LPCREATESTRUCT)lparam; - lpss = (LPSTYLESTRUCT)lpcs->lpCreateParams; + lpss = lpcs->lpCreateParams; if (lpss) { if ((lpcs->dwExStyle & WS_EX_DLGMODALFRAME) || @@ -3356,8 +3440,6 @@ static void test_scrolldc( HWND parent) SetRectRgn( tmprgn, 25, 35, 35, 75); CombineRgn(exprgn, exprgn, tmprgn, RGN_OR); ok(EqualRgn(exprgn, hrgn), "wrong update region\n"); - colr = GetPixel( hdc, 80, 80); - ok ( colr == 0, "pixel should be black, color is %08x\n", colr); trace("update rect: %d,%d - %d,%d\n", rcu.left, rcu.top, rcu.right, rcu.bottom); if (winetest_debug > 0) dump_region(hrgn); @@ -3393,10 +3475,12 @@ static void test_params(void) 0, 0, 100, 100, NULL, (HMENU)1, NULL, 0); - ok(!hwnd, "CreateWindow with invalid menu handle should fail\n"); - ok(GetLastError() == ERROR_INVALID_MENU_HANDLE || /* NT */ - GetLastError() == 0xdeadbeef, /* Win9x */ - "wrong last error value %d\n", GetLastError()); + ok(!hwnd || broken(hwnd != NULL), /* w2k3 sp2 */ + "CreateWindow with invalid menu handle should fail\n"); + if (!hwnd) + ok(GetLastError() == ERROR_INVALID_MENU_HANDLE || /* NT */ + GetLastError() == 0xdeadbeef, /* Win9x */ + "wrong last error value %d\n", GetLastError()); } static void test_AWRwindow(LPCSTR class, LONG style, LONG exStyle, BOOL menu) @@ -3548,7 +3632,7 @@ static void test_redrawnow(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "RedrawWindowClass"; @@ -3565,7 +3649,8 @@ static void test_redrawnow(void) ShowWindow(hwndMain, SW_SHOW); ok( WMPAINT_count == 0, "Multiple unexpected WM_PAINT calls %d\n", WMPAINT_count); RedrawWindow(hwndMain, NULL,NULL,RDW_UPDATENOW | RDW_ALLCHILDREN); - ok( WMPAINT_count == 1, "Multiple unexpected WM_PAINT calls %d\n", WMPAINT_count); + ok( WMPAINT_count == 1 || broken(WMPAINT_count == 0), /* sometimes on win9x */ + "Multiple unexpected WM_PAINT calls %d\n", WMPAINT_count); redrawComplete = TRUE; ok( WMPAINT_count < 10, "RedrawWindow (RDW_UPDATENOW) never completed (%d)\n", WMPAINT_count); @@ -3595,18 +3680,19 @@ static LRESULT WINAPI parentdc_window_procA(HWND hwnd, UINT msg, WPARAM wparam, switch (msg) { case WM_PAINT: - trace("doing WM_PAINT on %p\n", hwnd); GetClientRect(hwnd, &rc); CopyRect(&t->client, &rc); - trace("client rect (%d, %d)-(%d, %d)\n", rc.left, rc.top, rc.right, rc.bottom); GetWindowRect(hwnd, &rc); - trace("window rect (%d, %d)-(%d, %d)\n", rc.left, rc.top, rc.right, rc.bottom); + trace("WM_PAINT: hwnd %p, client rect (%d,%d)-(%d,%d), window rect (%d,%d)-(%d,%d)\n", hwnd, + t->client.left, t->client.top, t->client.right, t->client.bottom, + rc.left, rc.top, rc.right, rc.bottom); BeginPaint(hwnd, &ps); CopyRect(&t->paint, &ps.rcPaint); GetClipBox(ps.hdc, &rc); CopyRect(&t->clip, &rc); - trace("clip rect (%d, %d)-(%d, %d)\n", rc.left, rc.top, rc.right, rc.bottom); - trace("paint rect (%d, %d)-(%d, %d)\n", ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom); + trace("clip rect (%d,%d)-(%d,%d), paint rect (%d,%d)-(%d,%d)\n", + rc.left, rc.top, rc.right, rc.bottom, + ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom); EndPaint(hwnd, &ps); return 0; } @@ -3717,7 +3803,7 @@ static void test_csparentdc(void) clsMain.cbWndExtra = 0; clsMain.hInstance = GetModuleHandleA(0); clsMain.hIcon = 0; - clsMain.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + clsMain.hCursor = LoadCursorA(0, IDC_ARROW); clsMain.hbrBackground = GetStockObject(WHITE_BRUSH); clsMain.lpszMenuName = NULL; clsMain.lpszClassName = "ParentDcMainWindowClass"; @@ -3733,7 +3819,7 @@ static void test_csparentdc(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "ParentDcWindowClass"; @@ -3757,6 +3843,7 @@ static void test_csparentdc(void) ShowWindow(hwndMain, SW_SHOW); ShowWindow(hwnd1, SW_SHOW); ShowWindow(hwnd2, SW_SHOW); + SetWindowPos(hwndMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); flush_events( TRUE ); zero_parentdc_test(&test_answer); @@ -4024,10 +4111,10 @@ static void test_CreateWindow(void) ok(GetMenu(window) == (HMENU)menu, "GetMenu error %d\n", GetLastError()) #define expect_style(window, style)\ - ok(GetWindowLong(window, GWL_STYLE) == (style), "expected style %x != %x\n", (LONG)(style), GetWindowLong(window, GWL_STYLE)) + ok((ULONG)GetWindowLong(window, GWL_STYLE) == (style), "expected style %x != %x\n", (LONG)(style), GetWindowLong(window, GWL_STYLE)) #define expect_ex_style(window, ex_style)\ - ok(GetWindowLong(window, GWL_EXSTYLE) == (ex_style), "expected ex_style %x != %x\n", (LONG)(ex_style), GetWindowLong(window, GWL_EXSTYLE)) + ok((ULONG)GetWindowLong(window, GWL_EXSTYLE) == (ex_style), "expected ex_style %x != %x\n", (LONG)(ex_style), GetWindowLong(window, GWL_EXSTYLE)) #define expect_gle_broken_9x(gle)\ ok(GetLastError() == gle ||\ @@ -4230,7 +4317,7 @@ static void test_CreateWindow(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandle(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "MinMax_WndClass"; @@ -4641,7 +4728,7 @@ static void test_GetUpdateRect(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = classNameA; @@ -4761,7 +4848,7 @@ static void test_GetWindowModuleFileName(void) if (!pGetWindowModuleFileNameA) { - skip("GetWindowModuleFileNameA is not available\n"); + win_skip("GetWindowModuleFileNameA is not available\n"); return; } @@ -4779,11 +4866,14 @@ static void test_GetWindowModuleFileName(void) buf2[0] = 0; SetLastError(0xdeadbeef); ret2 = pGetWindowModuleFileNameA(hwnd, buf2, sizeof(buf2)); - ok(ret2, "GetWindowModuleFileNameA error %u\n", GetLastError()); - - ok(ret1 == ret2 || broken(ret2 == ret1 + 1), /* win98 */ "%u != %u\n", ret1, ret2); - ok(!strcmp(buf1, buf2), "%s != %s\n", buf1, buf2); + ok(ret2 || broken(!ret2), /* nt4 sp 3 */ + "GetWindowModuleFileNameA error %u\n", GetLastError()); + if (ret2) + { + ok(ret1 == ret2 || broken(ret2 == ret1 + 1), /* win98 */ "%u != %u\n", ret1, ret2); + ok(!strcmp(buf1, buf2), "%s != %s\n", buf1, buf2); + } hinst = GetModuleHandle(0); SetLastError(0xdeadbeef); @@ -4803,7 +4893,7 @@ static void test_GetWindowModuleFileName(void) SetLastError(0xdeadbeef); ret2 = pGetWindowModuleFileNameA(hwnd, buf2, ret1 - 2); - ok(ret2 == ret1 - 2 || broken(ret2 == ret1 - 3), /* win98 */ + ok(ret2 == ret1 - 2 || broken(ret2 == ret1 - 3) /* win98 */ || broken(!ret2), /* nt4 sp3 */ "expected %u, got %u\n", ret1 - 2, ret2); ok(GetLastError() == 0xdeadbeef /* XP */ || GetLastError() == ERROR_INSUFFICIENT_BUFFER, /* win2k3, vista */ @@ -4827,7 +4917,7 @@ static void test_GetWindowModuleFileName(void) "expected ERROR_INVALID_WINDOW_HANDLE, got %u\n", GetLastError()); hwnd = FindWindow("Shell_TrayWnd", NULL); - ok(IsWindow(hwnd), "got invalid tray window %p\n", hwnd); + ok(IsWindow(hwnd) || broken(!hwnd), "got invalid tray window %p\n", hwnd); SetLastError(0xdeadbeef); ret1 = pGetWindowModuleFileNameA(hwnd, buf1, sizeof(buf1)); ok(!ret1 || broken(ret1), /* win98 */ "expected 0, got %u\n", ret1); @@ -4873,8 +4963,8 @@ static void test_hwnd_message(void) ok(parent != desktop, "GetAncestor(GA_PARENT) should not return desktop for message windows\n"); root = pGetAncestor(hwnd, GA_ROOT); ok(root == hwnd, "GetAncestor(GA_ROOT) should return hwnd for message windows\n"); - ok( !pGetAncestor(parent, GA_PARENT), "parent shouldn't have parent %p\n", - pGetAncestor(parent, GA_PARENT) ); + ok( !pGetAncestor(parent, GA_PARENT) || broken(pGetAncestor(parent, GA_PARENT) != 0), /* win2k */ + "parent shouldn't have parent %p\n", pGetAncestor(parent, GA_PARENT) ); trace("parent %p root %p desktop %p\n", parent, root, desktop); if (!GetClassNameA( parent, buffer, sizeof(buffer) )) buffer[0] = 0; ok( !lstrcmpi( buffer, "Message" ), "wrong parent class '%s'\n", buffer ); @@ -4939,7 +5029,7 @@ static void test_layered_window(void) ok( ret, "SetLayeredWindowAttributes should succeed on layered window\n" ); ret = pGetLayeredWindowAttributes( hwnd, &key, &alpha, &flags ); ok( ret, "GetLayeredWindowAttributes should succeed on layered window\n" ); - ok( key == 0x123456, "wrong color key %x\n", key ); + ok( key == 0x123456 || key == 0, "wrong color key %x\n", key ); ok( alpha == 44, "wrong alpha %u\n", alpha ); ok( flags == LWA_ALPHA, "wrong flags %x\n", flags ); @@ -4968,24 +5058,24 @@ static void test_layered_window(void) ok( alpha == 22 || alpha == 33, "wrong alpha %u\n", alpha ); ok( flags == LWA_COLORKEY, "wrong flags %x\n", flags ); - /* color key always changed */ + /* color key may or may not be changed without LWA_COLORKEY */ ret = pSetLayeredWindowAttributes( hwnd, 0x999999, 44, 0 ); ok( ret, "SetLayeredWindowAttributes should succeed on layered window\n" ); alpha = 0; ret = pGetLayeredWindowAttributes( hwnd, &key, &alpha, &flags ); ok( ret, "GetLayeredWindowAttributes should succeed on layered window\n" ); - ok( key == 0x999999, "wrong color key %x\n", key ); + ok( key == 0x888888 || key == 0x999999, "wrong color key %x\n", key ); ok( alpha == 22 || alpha == 44, "wrong alpha %u\n", alpha ); ok( flags == 0, "wrong flags %x\n", flags ); - /* default alpha is 0 */ + /* default alpha and color key is 0 */ SetWindowLong( hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED ); SetWindowLong( hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED ); ret = pSetLayeredWindowAttributes( hwnd, 0x222222, 55, 0 ); ok( ret, "SetLayeredWindowAttributes should succeed on layered window\n" ); ret = pGetLayeredWindowAttributes( hwnd, &key, &alpha, &flags ); ok( ret, "GetLayeredWindowAttributes should succeed on layered window\n" ); - ok( key == 0x222222, "wrong color key %x\n", key ); + ok( key == 0 || key == 0x222222, "wrong color key %x\n", key ); ok( alpha == 0 || alpha == 55, "wrong alpha %u\n", alpha ); ok( flags == 0, "wrong flags %x\n", flags ); @@ -5064,7 +5154,7 @@ static void test_fullscreen(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandle(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "fullscreen_class"; @@ -5141,16 +5231,11 @@ static void test_fullscreen(void) /* Windows makes a maximized window slightly larger (to hide the borders?) */ fixup = min(abs(rc.left), abs(rc.top)); InflateRect(&rc, -fixup, -fixup); - /* FIXME: this doesn't work correctly in Wine for child windows yet */ - if (style & WS_CHILD) - todo_wine ok(rc.left >= mi.rcWork.left && rc.top <= mi.rcWork.top && rc.right <= mi.rcWork.right && rc.bottom <= mi.rcWork.bottom, - "%#x/%#x: window rect %d,%d-%d,%d\n", ex_style, style, rc.left, rc.top, rc.right, rc.bottom); - else - ok(rc.left >= mi.rcWork.left && rc.top <= mi.rcWork.top && - rc.right <= mi.rcWork.right && rc.bottom <= mi.rcWork.bottom, - "%#x/%#x: window rect %d,%d-%d,%d\n", ex_style, style, rc.left, rc.top, rc.right, rc.bottom); + "%#x/%#x: window rect %d,%d-%d,%d must be in %d,%d-%d,%d\n", + ex_style, style, rc.left, rc.top, rc.right, rc.bottom, + mi.rcWork.left, mi.rcWork.top, mi.rcWork.right, mi.rcWork.bottom); DestroyWindow(hwnd); style = t_style[i] | WS_MAXIMIZE | WS_MAXIMIZEBOX; @@ -5179,18 +5264,15 @@ static void test_fullscreen(void) } static BOOL test_thick_child_got_minmax; - -static int getExpectedThickChildInc(void) -{ - const int outer = 2; - int resizeBorder = GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME); - return (outer + resizeBorder); -} +static const char * test_thick_child_name; +static LONG test_thick_child_style; +static LONG test_thick_child_exStyle; static LRESULT WINAPI test_thick_child_size_winproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { MINMAXINFO* minmax; - int expectedMinTrack; + int expectedMinTrackX; + int expectedMinTrackY; int actualMinTrackX; int actualMinTrackY; int expectedMaxTrackX; @@ -5205,6 +5287,7 @@ static LRESULT WINAPI test_thick_child_size_winproc(HWND hwnd, UINT msg, WPARAM int expectedPosY; int actualPosX; int actualPosY; + LONG adjustedStyle; RECT rect; switch (msg) { @@ -5216,40 +5299,59 @@ static LRESULT WINAPI test_thick_child_size_winproc(HWND hwnd, UINT msg, WPARAM test_thick_child_got_minmax = TRUE; - expectedMinTrack = 2* getExpectedThickChildInc(); + + adjustedStyle = test_thick_child_style; + if ((adjustedStyle & WS_CAPTION) == WS_CAPTION) + adjustedStyle &= ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */ + GetClientRect(GetParent(hwnd), &rect); + AdjustWindowRectEx(&rect, adjustedStyle, FALSE, test_thick_child_exStyle); + + if (test_thick_child_style & (WS_DLGFRAME | WS_BORDER)) + { + expectedMinTrackX = GetSystemMetrics(SM_CXMINTRACK); + expectedMinTrackY = GetSystemMetrics(SM_CYMINTRACK); + } + else + { + expectedMinTrackX = -2 * rect.left; + expectedMinTrackY = -2 * rect.top; + } actualMinTrackX = minmax->ptMinTrackSize.x; actualMinTrackY = minmax->ptMinTrackSize.y; - todo_wine - ok(actualMinTrackX == expectedMinTrack && actualMinTrackY == expectedMinTrack, - "expected minTrack %dx%d, actual minTrack %dx%d\n", - expectedMinTrack, expectedMinTrack, actualMinTrackX, actualMinTrackY); + + ok(actualMinTrackX == expectedMinTrackX && actualMinTrackY == expectedMinTrackY, + "expected minTrack %dx%d, actual minTrack %dx%d for %s\n", + expectedMinTrackX, expectedMinTrackY, actualMinTrackX, actualMinTrackY, + test_thick_child_name); actualMaxTrackX = minmax->ptMaxTrackSize.x; actualMaxTrackY = minmax->ptMaxTrackSize.y; expectedMaxTrackX = GetSystemMetrics(SM_CXMAXTRACK); expectedMaxTrackY = GetSystemMetrics(SM_CYMAXTRACK); ok(actualMaxTrackX == expectedMaxTrackX && actualMaxTrackY == expectedMaxTrackY, - "expected maxTrack %dx%d, actual maxTrack %dx%d\n", - expectedMaxTrackX, expectedMaxTrackY, actualMaxTrackX, actualMaxTrackY); + "expected maxTrack %dx%d, actual maxTrack %dx%d for %s\n", + expectedMaxTrackX, expectedMaxTrackY, actualMaxTrackX, actualMaxTrackY, + test_thick_child_name); - GetClientRect(GetParent(hwnd), &rect); - AdjustWindowRectEx(&rect, WS_CHILD | WS_VISIBLE | WS_THICKFRAME, FALSE, 0); expectedMaxSizeX = rect.right - rect.left; expectedMaxSizeY = rect.bottom - rect.top; actualMaxSizeX = minmax->ptMaxSize.x; actualMaxSizeY = minmax->ptMaxSize.y; - ok(actualMaxSizeX == expectedMaxSizeX && actualMaxSizeY == expectedMaxSizeY, - "expected maxTrack %dx%d, actual maxTrack %dx%d\n", - expectedMaxSizeX, expectedMaxSizeY, actualMaxSizeX, actualMaxSizeY); - expectedPosX = - getExpectedThickChildInc(); - expectedPosY = expectedPosX; + ok(actualMaxSizeX == expectedMaxSizeX && actualMaxSizeY == expectedMaxSizeY, + "expected maxSize %dx%d, actual maxSize %dx%d for %s\n", + expectedMaxSizeX, expectedMaxSizeY, actualMaxSizeX, actualMaxSizeY, + test_thick_child_name); + + + expectedPosX = rect.left; + expectedPosY = rect.top; actualPosX = minmax->ptMaxPosition.x; actualPosY = minmax->ptMaxPosition.y; - todo_wine - ok(actualPosX == expectedPosX && actualPosY == expectedPosY, - "expected maxPosition (%d/%d), actual maxPosition (%d/%d)\n", - expectedPosX, expectedPosY, actualPosX, actualPosY); + ok(actualPosX == expectedPosX && actualPosY == expectedPosY, + "expected maxPosition (%d/%d), actual maxPosition (%d/%d) for %s\n", + expectedPosX, expectedPosY, actualPosX, actualPosY, test_thick_child_name); + break; } } @@ -5257,19 +5359,76 @@ static LRESULT WINAPI test_thick_child_size_winproc(HWND hwnd, UINT msg, WPARAM return DefWindowProcA(hwnd, msg, wparam, lparam); } +#define NUMBER_OF_THICK_CHILD_TESTS 16 static void test_thick_child_size(HWND parentWindow) { BOOL success; RECT childRect; + RECT adjustedParentRect; HWND childWindow; LONG childWidth; LONG childHeight; + LONG expectedWidth; + LONG expectedHeight; WNDCLASSA cls; LPCTSTR className = "THICK_CHILD_CLASS"; - LONG style = WS_CHILD | WS_VISIBLE | WS_THICKFRAME; - LONG exStyle = 0; - int expectedSize = 2*getExpectedThickChildInc(); + int i; + LONG adjustedStyle; + static const LONG styles[NUMBER_OF_THICK_CHILD_TESTS] = { + WS_CHILD | WS_VISIBLE | WS_THICKFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER, + WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER, + }; + static const LONG exStyles[NUMBER_OF_THICK_CHILD_TESTS] = { + 0, + 0, + 0, + 0, + WS_EX_DLGMODALFRAME, + WS_EX_DLGMODALFRAME, + WS_EX_DLGMODALFRAME, + WS_EX_DLGMODALFRAME, + WS_EX_STATICEDGE, + WS_EX_STATICEDGE, + WS_EX_STATICEDGE, + WS_EX_STATICEDGE, + WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME, + WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME, + WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME, + WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME, + }; + static const char *styleName[NUMBER_OF_THICK_CHILD_TESTS] = { + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME, exstyle= WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME exstyle= WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER exstyle= WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER exstyle= WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME exstyle= WS_EX_STATICEDGE", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME exstyle= WS_EX_STATICEDGE", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER exstyle= WS_EX_STATICEDGE", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER exstyle= WS_EX_STATICEDGE", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME, exstyle= WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME exstyle= WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_DLGFRAME | WS_BORDER exstyle= WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME", + "style=WS_CHILD | WS_VISIBLE | WS_THICKFRAME | WS_BORDER exstyle= WS_EX_STATICEDGE | WS_EX_DLGMODALFRAME", + }; cls.style = 0; cls.lpfnWndProc = test_thick_child_size_winproc; @@ -5277,39 +5436,98 @@ static void test_thick_child_size(HWND parentWindow) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = className; SetLastError(0xdeadbeef); ok(RegisterClassA(&cls),"RegisterClassA failed, error: %u\n", GetLastError()); - test_thick_child_got_minmax = FALSE; + for(i = 0; i < NUMBER_OF_THICK_CHILD_TESTS; i++) + { + test_thick_child_name = styleName[i]; + test_thick_child_style = styles[i]; + test_thick_child_exStyle = exStyles[i]; + test_thick_child_got_minmax = FALSE; - SetLastError(0xdeadbeef); - childWindow = CreateWindowEx( exStyle, className, "", style, 0, 0, 0, 0, parentWindow, 0, GetModuleHandleA(0), NULL ); - ok(childWindow != NULL, "Failed to create child window, error: %u\n", GetLastError()); + SetLastError(0xdeadbeef); + childWindow = CreateWindowEx( exStyles[i], className, "", styles[i], 0, 0, 0, 0, parentWindow, 0, GetModuleHandleA(0), NULL ); + ok(childWindow != NULL, "Failed to create child window, error: %u\n", GetLastError()); - ok(test_thick_child_got_minmax, "Got no WM_GETMINMAXINFO\n"); + ok(test_thick_child_got_minmax, "Got no WM_GETMINMAXINFO\n"); - SetLastError(0xdeadbeef); - success = GetWindowRect(childWindow, &childRect); - ok(success,"GetWindowRect call failed, error: %u\n", GetLastError()); - childWidth = childRect.right - childRect.left; - childHeight = childRect.bottom - childRect.top; + SetLastError(0xdeadbeef); + success = GetWindowRect(childWindow, &childRect); + ok(success,"GetWindowRect call failed, error: %u\n", GetLastError()); + childWidth = childRect.right - childRect.left; + childHeight = childRect.bottom - childRect.top; - todo_wine - ok( (childWidth == expectedSize) && (childHeight == expectedSize), - "size of window with style WS_CHILD | WS_VISIBLE | WS_THICKFRAME is wrong: expected size %dx%d != actual size %dx%d\n", - expectedSize, expectedSize, childWidth, childHeight); + adjustedStyle = styles[i]; + if ((adjustedStyle & WS_CAPTION) == WS_CAPTION) + adjustedStyle &= ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */ + GetClientRect(GetParent(childWindow), &adjustedParentRect); + AdjustWindowRectEx(&adjustedParentRect, adjustedStyle, FALSE, test_thick_child_exStyle); - SetLastError(0xdeadbeef); - success = DestroyWindow(childWindow); - ok(success,"DestroyWindow call failed, error: %u\n", GetLastError()); + if (test_thick_child_style & (WS_DLGFRAME | WS_BORDER)) + { + expectedWidth = GetSystemMetrics(SM_CXMINTRACK); + expectedHeight = GetSystemMetrics(SM_CYMINTRACK); + } + else + { + expectedWidth = -2 * adjustedParentRect.left; + expectedHeight = -2 * adjustedParentRect.top; + } + + ok((childWidth == expectedWidth) && (childHeight == expectedHeight), + "size of window (%s) is wrong: expected size %dx%d != actual size %dx%d\n", + test_thick_child_name, expectedWidth, expectedHeight, childWidth, childHeight); + + SetLastError(0xdeadbeef); + success = DestroyWindow(childWindow); + ok(success,"DestroyWindow call failed, error: %u\n", GetLastError()); + } ok(UnregisterClass(className, GetModuleHandleA(0)),"UnregisterClass call failed\n"); } +static void test_handles( HWND full_hwnd ) +{ + HWND hwnd = full_hwnd; + BOOL ret; + RECT rect; + + SetLastError( 0xdeadbeef ); + ret = GetWindowRect( hwnd, &rect ); + ok( ret, "GetWindowRect failed for %p err %u\n", hwnd, GetLastError() ); + +#ifdef _WIN64 + if ((ULONG_PTR)full_hwnd >> 32) + hwnd = (HWND)((ULONG_PTR)full_hwnd & ~0u); + else + hwnd = (HWND)((ULONG_PTR)full_hwnd | ((ULONG_PTR)~0u << 32)); + SetLastError( 0xdeadbeef ); + ret = GetWindowRect( hwnd, &rect ); + ok( ret, "GetWindowRect failed for %p err %u\n", hwnd, GetLastError() ); + + hwnd = (HWND)(((ULONG_PTR)full_hwnd & ~0u) | ((ULONG_PTR)0x1234 << 32)); + SetLastError( 0xdeadbeef ); + ret = GetWindowRect( hwnd, &rect ); + ok( ret, "GetWindowRect failed for %p err %u\n", hwnd, GetLastError() ); + + hwnd = (HWND)(((ULONG_PTR)full_hwnd & 0xffff) | ((ULONG_PTR)0x9876 << 16)); + SetLastError( 0xdeadbeef ); + ret = GetWindowRect( hwnd, &rect ); + ok( !ret, "GetWindowRect succeeded for %p\n", hwnd ); + ok( GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "wrong error %u\n", GetLastError() ); + + hwnd = (HWND)(((ULONG_PTR)full_hwnd & 0xffff) | ((ULONG_PTR)0x12345678 << 16)); + SetLastError( 0xdeadbeef ); + ret = GetWindowRect( hwnd, &rect ); + ok( !ret, "GetWindowRect succeeded for %p\n", hwnd ); + ok( GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "wrong error %u\n", GetLastError() ); +#endif +} START_TEST(win) { @@ -5325,7 +5543,7 @@ START_TEST(win) if (!RegisterWindowClasses()) assert(0); hhook = SetWindowsHookExA(WH_CBT, cbt_hook_proc, 0, GetCurrentThreadId()); - assert(hhook); + if (!hhook) win_skip( "Cannot set CBT hook, skipping some tests\n" ); hwndMain = CreateWindowExA(/*WS_EX_TOOLWINDOW*/ 0, "MainWindowClass", "Main window", WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | @@ -5389,7 +5607,11 @@ START_TEST(win) test_SetForegroundWindow(hwndMain); test_shell_window(); + test_handles( hwndMain ); /* add the tests above this line */ - UnhookWindowsHookEx(hhook); + if (hhook) UnhookWindowsHookEx(hhook); + + DestroyWindow(hwndMain2); + DestroyWindow(hwndMain); } diff --git a/rostests/winetests/user32/winstation.c b/rostests/winetests/user32/winstation.c index efc122a32dc..596e9ffd8d6 100755 --- a/rostests/winetests/user32/winstation.c +++ b/rostests/winetests/user32/winstation.c @@ -53,7 +53,7 @@ static void register_class(void) cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(0); cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + cls.hCursor = LoadCursorA(0, IDC_ARROW); cls.hbrBackground = GetStockObject(WHITE_BRUSH); cls.lpszMenuName = NULL; cls.lpszClassName = "WinStationClass"; diff --git a/rostests/winetests/user32/wsprintf.c b/rostests/winetests/user32/wsprintf.c index c0ca1c6703a..bca16bd9f86 100755 --- a/rostests/winetests/user32/wsprintf.c +++ b/rostests/winetests/user32/wsprintf.c @@ -45,7 +45,7 @@ static void wsprintfWTest(void) rc=wsprintfW(buf, fmt, -1); if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) { - skip("wsprintfW is not implemented\n"); + win_skip("wsprintfW is not implemented\n"); return; } ok(rc == 10, "wsPrintfW length failure: rc=%d error=%d\n",rc,GetLastError()); @@ -59,12 +59,12 @@ static void wsprintfWTest(void) static void CharUpperTest(void) { - int i,out,failed; + INT_PTR i,out,failed; failed = 0; for (i=0;i<256;i++) { - out = (int) CharUpper((LPTSTR)i); + out = (INT_PTR)CharUpper((LPTSTR)i); /* printf("%0x ",out); */ if ((out >> 16) != 0) { @@ -72,17 +72,17 @@ static void CharUpperTest(void) break; } } - ok(!failed,"CharUpper failed - 16bit input (0x%0x) returned 32bit result (0x%0x)\n",i,out); + ok(!failed,"CharUpper failed - 16bit input (0x%0lx) returned 32bit result (0x%0lx)\n",i,out); } static void CharLowerTest(void) { - int i,out,failed; + INT_PTR i,out,failed; failed = 0; for (i=0;i<256;i++) { - out = (int) CharLower((LPTSTR)i); + out = (INT_PTR)CharLower((LPTSTR)i); /* printf("%0x ",out); */ if ((out >> 16) != 0) { @@ -90,7 +90,7 @@ static void CharLowerTest(void) break; } } - ok(!failed,"CharLower failed - 16bit input (0x%0x) returned 32bit result (0x%0x)\n",i,out); + ok(!failed,"CharLower failed - 16bit input (0x%0lx) returned 32bit result (0x%0lx)\n",i,out); } diff --git a/rostests/winetests/usp10/usp10.c b/rostests/winetests/usp10/usp10.c index c63c6c8a70c..1dba6829ac7 100644 --- a/rostests/winetests/usp10/usp10.c +++ b/rostests/winetests/usp10/usp10.c @@ -1382,6 +1382,87 @@ static void test_ScriptGetProperties(void) ok(hr == S_OK, "ScriptGetProperties failed: 0x%08x\n", hr); } +static void test_ScriptBreak(void) +{ + static const WCHAR test[] = {' ','\r','\n',0}; + SCRIPT_ITEM items[4]; + SCRIPT_LOGATTR la; + HRESULT hr; + + hr = ScriptItemize(test, 3, 4, NULL, NULL, items, NULL); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + + memset(&la, 0, sizeof(la)); + hr = ScriptBreak(test, 1, &items[0].a, &la); + ok(!hr, "ScriptBreak should return S_OK not %08x\n", hr); + + ok(!la.fSoftBreak, "fSoftBreak set\n"); + ok(la.fWhiteSpace, "fWhiteSpace not set\n"); + ok(la.fCharStop, "fCharStop not set\n"); + ok(!la.fWordStop, "fWordStop set\n"); + ok(!la.fInvalid, "fInvalid set\n"); + ok(!la.fReserved, "fReserved set\n"); + + memset(&la, 0, sizeof(la)); + hr = ScriptBreak(test + 1, 1, &items[1].a, &la); + ok(!hr, "ScriptBreak should return S_OK not %08x\n", hr); + + ok(!la.fSoftBreak, "fSoftBreak set\n"); + ok(!la.fWhiteSpace, "fWhiteSpace set\n"); + ok(la.fCharStop, "fCharStop not set\n"); + ok(!la.fWordStop, "fWordStop set\n"); + ok(!la.fInvalid, "fInvalid set\n"); + ok(!la.fReserved, "fReserved set\n"); + + memset(&la, 0, sizeof(la)); + hr = ScriptBreak(test + 2, 1, &items[2].a, &la); + ok(!hr, "ScriptBreak should return S_OK not %08x\n", hr); + + ok(!la.fSoftBreak, "fSoftBreak set\n"); + ok(!la.fWhiteSpace, "fWhiteSpace set\n"); + ok(la.fCharStop, "fCharStop not set\n"); + ok(!la.fWordStop, "fWordStop set\n"); + ok(!la.fInvalid, "fInvalid set\n"); + ok(!la.fReserved, "fReserved set\n"); +} + +static void test_newlines(void) +{ + static const WCHAR test1[] = {'t','e','x','t','\r','t','e','x','t',0}; + static const WCHAR test2[] = {'t','e','x','t','\n','t','e','x','t',0}; + static const WCHAR test3[] = {'t','e','x','t','\r','\n','t','e','x','t',0}; + static const WCHAR test4[] = {'t','e','x','t','\n','\r','t','e','x','t',0}; + static const WCHAR test5[] = {'1','2','3','4','\n','\r','1','2','3','4',0}; + SCRIPT_ITEM items[5]; + HRESULT hr; + int count; + + count = 0; + hr = ScriptItemize(test1, lstrlenW(test1), 5, NULL, NULL, items, &count); + ok(hr == S_OK, "ScriptItemize failed: 0x%08x\n", hr); + ok(count == 3, "got %d expected 3\n", count); + + count = 0; + hr = ScriptItemize(test2, lstrlenW(test2), 5, NULL, NULL, items, &count); + ok(hr == S_OK, "ScriptItemize failed: 0x%08x\n", hr); + ok(count == 3, "got %d expected 3\n", count); + + count = 0; + hr = ScriptItemize(test3, lstrlenW(test3), 5, NULL, NULL, items, &count); + ok(hr == S_OK, "ScriptItemize failed: 0x%08x\n", hr); + ok(count == 4, "got %d expected 4\n", count); + + count = 0; + hr = ScriptItemize(test4, lstrlenW(test4), 5, NULL, NULL, items, &count); + ok(hr == S_OK, "ScriptItemize failed: 0x%08x\n", hr); + ok(count == 4, "got %d expected 4\n", count); + + count = 0; + hr = ScriptItemize(test5, lstrlenW(test5), 5, NULL, NULL, items, &count); + ok(hr == S_OK, "ScriptItemize failed: 0x%08x\n", hr); + ok(count == 4, "got %d expected 4\n", count); +} + START_TEST(usp10) { HWND hwnd; @@ -1426,6 +1507,8 @@ START_TEST(usp10) test_ScriptLayout(); test_digit_substitution(); test_ScriptGetProperties(); + test_ScriptBreak(); + test_newlines(); ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); diff --git a/rostests/winetests/uxtheme/system.c b/rostests/winetests/uxtheme/system.c index ef9c08a2522..ad277a08192 100644 --- a/rostests/winetests/uxtheme/system.c +++ b/rostests/winetests/uxtheme/system.c @@ -85,10 +85,6 @@ static void test_IsThemed(void) SetLastError(0xdeadbeef); bThemeActive = pIsThemeActive(); trace("Theming is %s\n", (bThemeActive) ? "active" : "inactive"); - todo_wine - ok( GetLastError() == ERROR_SUCCESS, - "Expected ERROR_SUCCESS, got 0x%08x\n", - GetLastError()); /* This test is not themed */ SetLastError(0xdeadbeef); @@ -101,10 +97,9 @@ static void test_IsThemed(void) /* Although Wine currently returns FALSE, the logic behind it is wrong. It is not a todo_wine though in the testing sense */ ok( bAppThemed == FALSE, "Expected FALSE as this test executable is not (yet) themed.\n"); - todo_wine - ok( GetLastError() == ERROR_SUCCESS, - "Expected ERROR_SUCCESS, got 0x%08x\n", - GetLastError()); + ok( GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got 0x%08x\n", + GetLastError()); SetLastError(0xdeadbeef); bTPDefined = pIsThemePartDefined(NULL, 0 , 0); @@ -260,7 +255,7 @@ static void test_OpenThemeData(void) ok( GetLastError() == E_PROP_ID_UNSUPPORTED, "Expected GLE() to be E_PROP_ID_UNSUPPORTED, got 0x%08x\n", GetLastError()); - trace("No active theme, skipping rest of OpenThemeData tests\n"); + skip("No active theme, skipping rest of OpenThemeData tests\n"); return; } @@ -382,7 +377,7 @@ static void test_GetCurrentThemeName(void) hRes = pGetCurrentThemeName(currentTheme, 2, NULL, 0, NULL, 0); if (bThemeActive) todo_wine - ok( LOWORD(hRes) == ERROR_INSUFFICIENT_BUFFER, "Expected 0x8007007A, got 0x%08x\n", hRes); + ok(hRes == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got 0x%08x\n", hRes); else ok( hRes == E_PROP_ID_UNSUPPORTED, "Expected E_PROP_ID_UNSUPPORTED, got 0x%08x\n", hRes); ok( GetLastError() == 0xdeadbeef, @@ -396,7 +391,7 @@ static void test_GetCurrentThemeName(void) currentSize, sizeof(currentSize) / sizeof(WCHAR)); if (bThemeActive) todo_wine - ok( LOWORD(hRes) == ERROR_INSUFFICIENT_BUFFER, "Expected 0x8007007A, got 0x%08x\n", hRes); + ok(hRes == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got 0x%08x\n", hRes); else ok( hRes == E_PROP_ID_UNSUPPORTED, "Expected E_PROP_ID_UNSUPPORTED, got 0x%08x\n", hRes); ok( GetLastError() == 0xdeadbeef, diff --git a/rostests/winetests/version/info.c b/rostests/winetests/version/info.c index a4f969ecb90..edf607c9120 100644 --- a/rostests/winetests/version/info.c +++ b/rostests/winetests/version/info.c @@ -383,7 +383,7 @@ static void test_32bit_win(void) if (is_unicode_enabled) { - VS_VERSION_INFO_STRUCT32 *vvis = (VS_VERSION_INFO_STRUCT32 *)pVersionInfoW; + VS_VERSION_INFO_STRUCT32 *vvis = pVersionInfoW; ok ( retvalW == ((vvis->wLength * 2) + 4) || retvalW == (vvis->wLength * 1.5), "Structure is not of the correct size\n"); } diff --git a/rostests/winetests/winhttp/notification.c b/rostests/winetests/winhttp/notification.c index da605b024ad..de8508adc90 100644 --- a/rostests/winetests/winhttp/notification.c +++ b/rostests/winetests/winhttp/notification.c @@ -34,6 +34,9 @@ enum api winhttp_open_request, winhttp_send_request, winhttp_receive_response, + winhttp_query_data, + winhttp_read_data, + winhttp_write_data, winhttp_close_handle }; @@ -42,6 +45,7 @@ struct notification enum api function; /* api responsible for notification */ unsigned int status; /* status received */ int todo; + int ignore; }; struct info @@ -50,10 +54,13 @@ struct info const struct notification *test; unsigned int count; unsigned int index; + HANDLE wait; + unsigned int line; }; static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID buffer, DWORD buflen ) { + BOOL status_ok, function_ok; struct info *info = (struct info *)context; unsigned int i = info->index; @@ -64,17 +71,24 @@ static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DW } ok(i < info->count, "unexpected notification 0x%08x\n", status); if (i >= info->count) return; - if (!info->test[i].todo) + + status_ok = (info->test[i].status == status); + function_ok = (info->test[i].function == info->function); + if (!info->test[i].ignore && !info->test[i].todo) { - ok(info->test[i].status == status, "expected status 0x%08x got 0x%08x\n", info->test[i].status, status); - ok(info->test[i].function == info->function, "expected function %u got %u\n", info->test[i].function, info->function); + ok(status_ok, "%u: expected status 0x%08x got 0x%08x\n", info->line, info->test[i].status, status); + ok(function_ok, "%u: expected function %u got %u\n", info->line, info->test[i].function, info->function); } - else todo_wine + else if (!info->test[i].ignore) { - ok(info->test[i].status == status, "expected status 0x%08x got 0x%08x\n", info->test[i].status, status); - ok(info->test[i].function == info->function, "expected function %u got %u\n", info->test[i].function, info->function); + todo_wine ok(status_ok, "%u: expected status 0x%08x got 0x%08x\n", info->line, info->test[i].status, status); + if (status_ok) + { + todo_wine ok(function_ok, "%u: expected function %u got %u\n", info->line, info->test[i].function, info->function); + } } - info->index++; + if (status_ok) info->index++; + if (status & WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS) SetEvent( info->wait ); } static const struct notification cache_test[] = @@ -96,6 +110,12 @@ static const struct notification cache_test[] = { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 } }; +static void setup_test( struct info *info, enum api function, unsigned int line ) +{ + info->function = function; + info->line = line; +} + static void test_connection_cache( void ) { static const WCHAR codeweavers[] = {'w','w','w','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; @@ -108,28 +128,29 @@ static void test_connection_cache( void ) info.test = cache_test; info.count = sizeof(cache_test) / sizeof(cache_test[0]); info.index = 0; + info.wait = NULL; ses = WinHttpOpen( user_agent, 0, NULL, NULL, 0 ); ok(ses != NULL, "failed to open session %u\n", GetLastError()); - WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); ok(ret, "failed to set context value %u\n", GetLastError()); - info.function = winhttp_connect; + setup_test( &info, winhttp_connect, __LINE__ ); con = WinHttpConnect( ses, codeweavers, 0, 0 ); ok(con != NULL, "failed to open a connection %u\n", GetLastError()); - info.function = winhttp_open_request; + setup_test( &info, winhttp_open_request, __LINE__ ); req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); ok(req != NULL, "failed to open a request %u\n", GetLastError()); - info.function = winhttp_send_request; + setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); ok(ret, "failed to send request %u\n", GetLastError()); - info.function = winhttp_receive_response; + setup_test( &info, winhttp_receive_response, __LINE__ ); ret = WinHttpReceiveResponse( req, NULL ); ok(ret, "failed to receive response %u\n", GetLastError()); @@ -138,7 +159,7 @@ static void test_connection_cache( void ) ok(ret, "failed unexpectedly %u\n", GetLastError()); ok(status == 200, "request failed unexpectedly %u\n", status); - info.function = winhttp_close_handle; + setup_test( &info, winhttp_close_handle, __LINE__ ); WinHttpCloseHandle( req ); WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); @@ -150,27 +171,27 @@ static void test_connection_cache( void ) ses = WinHttpOpen( user_agent, 0, NULL, NULL, 0 ); ok(ses != NULL, "failed to open session %u\n", GetLastError()); - WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); ok(ret, "failed to set context value %u\n", GetLastError()); - info.function = winhttp_connect; + setup_test( &info, winhttp_connect, __LINE__ ); con = WinHttpConnect( ses, codeweavers, 0, 0 ); ok(con != NULL, "failed to open a connection %u\n", GetLastError()); - info.function = winhttp_open_request; + setup_test( &info, winhttp_open_request, __LINE__ ); req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); ok(req != NULL, "failed to open a request %u\n", GetLastError()); ret = WinHttpSetOption( req, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); ok(ret, "failed to set context value %u\n", GetLastError()); - info.function = winhttp_send_request; + setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); ok(ret, "failed to send request %u\n", GetLastError()); - info.function = winhttp_receive_response; + setup_test( &info, winhttp_receive_response, __LINE__ ); ret = WinHttpReceiveResponse( req, NULL ); ok(ret, "failed to receive response %u\n", GetLastError()); @@ -179,7 +200,7 @@ static void test_connection_cache( void ) ok(ret, "failed unexpectedly %u\n", GetLastError()); ok(status == 200, "request failed unexpectedly %u\n", status); - info.function = winhttp_close_handle; + setup_test( &info, winhttp_close_handle, __LINE__ ); WinHttpCloseHandle( req ); WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); @@ -225,27 +246,28 @@ static void test_redirect( void ) info.test = redirect_test; info.count = sizeof(redirect_test) / sizeof(redirect_test[0]); info.index = 0; + info.wait = NULL; ses = WinHttpOpen( user_agent, 0, NULL, NULL, 0 ); ok(ses != NULL, "failed to open session %u\n", GetLastError()); - WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); ok(ret, "failed to set context value %u\n", GetLastError()); - info.function = winhttp_connect; + setup_test( &info, winhttp_connect, __LINE__ ); con = WinHttpConnect( ses, codeweavers, 0, 0 ); ok(con != NULL, "failed to open a connection %u\n", GetLastError()); - info.function = winhttp_open_request; + setup_test( &info, winhttp_open_request, __LINE__ ); req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); ok(req != NULL, "failed to open a request %u\n", GetLastError()); - info.function = winhttp_send_request; + setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - info.function = winhttp_receive_response; + setup_test( &info, winhttp_receive_response, __LINE__ ); ret = WinHttpReceiveResponse( req, NULL ); ok(ret, "failed to receive response %u\n", GetLastError()); @@ -254,14 +276,117 @@ static void test_redirect( void ) ok(ret, "failed unexpectedly %u\n", GetLastError()); ok(status == 200, "request failed unexpectedly %u\n", status); - info.function = winhttp_close_handle; + setup_test( &info, winhttp_close_handle, __LINE__ ); WinHttpCloseHandle( req ); WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); } +static const struct notification async_test[] = +{ + { winhttp_connect, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, 0 }, + { winhttp_open_request, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_REDIRECT, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE, 0 }, + { winhttp_query_data, WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE, 0 }, + { winhttp_read_data, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0, 1 }, + { winhttp_read_data, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0, 1 }, + { winhttp_read_data, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, 0, 1 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 } +}; + +static void test_async( void ) +{ + static const WCHAR codeweavers[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; + + HANDLE ses, con, req; + DWORD size, status; + BOOL ret; + struct info info, *context = &info; + char buffer[1024]; + + info.test = async_test; + info.count = sizeof(async_test) / sizeof(async_test[0]); + info.index = 0; + info.wait = CreateEvent( NULL, FALSE, FALSE, NULL ); + + ses = WinHttpOpen( user_agent, 0, NULL, NULL, WINHTTP_FLAG_ASYNC ); + ok(ses != NULL, "failed to open session %u\n", GetLastError()); + + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + + ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); + ok(ret, "failed to set context value %u\n", GetLastError()); + + setup_test( &info, winhttp_connect, __LINE__ ); + con = WinHttpConnect( ses, codeweavers, 0, 0 ); + ok(con != NULL, "failed to open a connection %u\n", GetLastError()); + + setup_test( &info, winhttp_open_request, __LINE__ ); + req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + setup_test( &info, winhttp_send_request, __LINE__ ); + ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + ok(ret, "failed to send request %u\n", GetLastError()); + + WaitForSingleObject( info.wait, INFINITE ); + + setup_test( &info, winhttp_receive_response, __LINE__ ); + ret = WinHttpReceiveResponse( req, NULL ); + ok(ret, "failed to receive response %u\n", GetLastError()); + + WaitForSingleObject( info.wait, INFINITE ); + + size = sizeof(status); + ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL ); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + + setup_test( &info, winhttp_query_data, __LINE__ ); + ret = WinHttpQueryDataAvailable( req, NULL ); + ok(ret, "failed to query data available %u\n", GetLastError()); + + WaitForSingleObject( info.wait, INFINITE ); + + setup_test( &info, winhttp_read_data, __LINE__ ); + ret = WinHttpReadData( req, buffer, sizeof(buffer), NULL ); + ok(ret, "failed to query data available %u\n", GetLastError()); + + WaitForSingleObject( info.wait, INFINITE ); + + setup_test( &info, winhttp_close_handle, __LINE__ ); + WinHttpCloseHandle( req ); + WinHttpCloseHandle( con ); + WinHttpCloseHandle( ses ); + CloseHandle( info.wait ); +} + START_TEST (notification) { test_connection_cache(); test_redirect(); + Sleep(2000); /* make sure previous connection is evicted from cache */ + test_async(); } diff --git a/rostests/winetests/winhttp/testlist.c b/rostests/winetests/winhttp/testlist.c index 0830226693f..36f226a2bfb 100644 --- a/rostests/winetests/winhttp/testlist.c +++ b/rostests/winetests/winhttp/testlist.c @@ -7,9 +7,13 @@ #include "wine/test.h" extern void func_winhttp(void); +extern void func_notification(void); +extern void func_url(void); const struct test winetest_testlist[] = { { "winhttp", func_winhttp }, + { "notification", func_notification }, + { "url", func_url }, { 0, 0 } }; diff --git a/rostests/winetests/winhttp/url.c b/rostests/winetests/winhttp/url.c new file mode 100644 index 00000000000..da149b07f60 --- /dev/null +++ b/rostests/winetests/winhttp/url.c @@ -0,0 +1,581 @@ +/* + * Copyright 2008 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winhttp.h" + +#include "wine/test.h" + +#define ICU_ESCAPE 0x80000000 + +static WCHAR empty[] = {0}; +static WCHAR ftp[] = {'f','t','p',0}; +static WCHAR http[] = {'h','t','t','p',0}; +static WCHAR winehq[] = {'w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; +static WCHAR username[] = {'u','s','e','r','n','a','m','e',0}; +static WCHAR password[] = {'p','a','s','s','w','o','r','d',0}; +static WCHAR about[] = {'/','s','i','t','e','/','a','b','o','u','t',0}; +static WCHAR query[] = {'?','q','u','e','r','y',0}; +static WCHAR escape[] = {' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/',':',';','<','=','>','?','@','[','\\',']','^','_','`','{','|','}','~',0}; + +static const WCHAR url1[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url2[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url3[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':',0}; +static const WCHAR url4[] = + {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url5[] = {'h','t','t','p',':','/','/',0}; +static const WCHAR url6[] = + {'f','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','8','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url7[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','4','2','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url8[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t', + '%','2','0','!','%','2','2','%','2','3','$','%','2','5','&','\'','(',')','*','+',',','-','.','/',':',';','%','3','C','=','%','3','E','?','@','%', + '5','B','%','5','C','%','5','D','%','5','E','_','%','6','0','%','7','B','%','7','C','%','7','D','%','7','E',0}; +static const WCHAR url9[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url10[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','8','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; +static const WCHAR url11[] = + {'h','t','t','p','s',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','4','4','3','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; + + + +static const WCHAR url_k1[] = + {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', + '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t',0}; +static const WCHAR url_k2[] = + {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; +static const WCHAR url_k3[] = + {'h','t','t','p','s',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','p','o','s','t','?',0}; +static const WCHAR url_k4[] = + {'H','T','T','P',':','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; +static const WCHAR url_k5[] = + {'h','t','t','p',':','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; +static const WCHAR url_k6[] = + {'w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; +static const WCHAR url_k7[] = + {'w','w','w',0}; +static const WCHAR url_k8[] = + {'h','t','t','p',0}; +static const WCHAR url_k9[] = + {'h','t','t','p',':','/','/','w','i','n','e','h','q','?',0}; +static const WCHAR url_k10[] = + {'h','t','t','p',':','/','/','w','i','n','e','h','q','/','p','o','s','t',';','a',0}; + +static const char *debugstr_w(LPCWSTR str) +{ + static char buf[1024]; + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + +static void fill_url_components( URL_COMPONENTS *uc ) +{ + uc->dwStructSize = sizeof(URL_COMPONENTS); + uc->lpszScheme = http; + uc->dwSchemeLength = lstrlenW( uc->lpszScheme ); + uc->nScheme = INTERNET_SCHEME_HTTP; + uc->lpszHostName = winehq; + uc->dwHostNameLength = lstrlenW( uc->lpszHostName ); + uc->nPort = 80; + uc->lpszUserName = username; + uc->dwUserNameLength = lstrlenW( uc->lpszUserName ); + uc->lpszPassword = password; + uc->dwPasswordLength = lstrlenW( uc->lpszPassword ); + uc->lpszUrlPath = about; + uc->dwUrlPathLength = lstrlenW( uc->lpszUrlPath ); + uc->lpszExtraInfo = query; + uc->dwExtraInfoLength = lstrlenW( uc->lpszExtraInfo ); +} + +static void WinHttpCreateUrl_test( void ) +{ + URL_COMPONENTS uc; + WCHAR *url; + DWORD len; + BOOL ret; + + /* NULL components */ + len = ~0u; + SetLastError( 0xdeadbeef ); + ret = WinHttpCreateUrl( NULL, 0, NULL, &len ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", GetLastError() ); + ok( len == ~0u, "expected len ~0u got %u\n", len ); + + /* zero'ed components */ + memset( &uc, 0, sizeof(URL_COMPONENTS) ); + SetLastError( 0xdeadbeef ); + ret = WinHttpCreateUrl( &uc, 0, NULL, &len ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", GetLastError() ); + ok( len == ~0u, "expected len ~0u got %u\n", len ); + + /* valid components, NULL url, NULL length */ + fill_url_components( &uc ); + SetLastError( 0xdeadbeef ); + ret = WinHttpCreateUrl( &uc, 0, NULL, NULL ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", GetLastError() ); + ok( len == ~0u, "expected len ~0u got %u\n", len ); + + /* valid components, NULL url */ + SetLastError( 0xdeadbeef ); + ret = WinHttpCreateUrl( &uc, 0, NULL, &len ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER got %u\n", GetLastError() ); + ok( len == 57, "expected len 57 got %u\n", len ); + + /* correct size, NULL url */ + fill_url_components( &uc ); + SetLastError( 0xdeadbeef ); + ret = WinHttpCreateUrl( &uc, 0, NULL, &len ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER got %u\n", GetLastError() ); + ok( len == 57, "expected len 57 got %u\n", len ); + + /* valid components, allocated url, short length */ + SetLastError( 0xdeadbeef ); + url = HeapAlloc( GetProcessHeap(), 0, 256 * sizeof(WCHAR) ); + url[0] = 0; + len = 2; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER got %u\n", GetLastError() ); + ok( len == 57, "expected len 57 got %u\n", len ); + + /* allocated url, NULL scheme */ + uc.lpszScheme = NULL; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 56, "expected len 56 got %u\n", len ); + ok( !lstrcmpW( url, url1 ), "url doesn't match\n" ); + + /* allocated url, 0 scheme */ + fill_url_components( &uc ); + uc.nScheme = 0; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 56, "expected len 56 got %u\n", len ); + + /* valid components, allocated url */ + fill_url_components( &uc ); + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 56, "expected len 56 got %d\n", len ); + ok( !lstrcmpW( url, url1 ), "url doesn't match\n" ); + + /* valid username, NULL password */ + fill_url_components( &uc ); + uc.lpszPassword = NULL; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + + /* valid username, empty password */ + fill_url_components( &uc ); + uc.lpszPassword = empty; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 56, "expected len 56 got %u\n", len ); + ok( !lstrcmpW( url, url3 ), "url doesn't match\n" ); + + /* valid password, NULL username */ + fill_url_components( &uc ); + SetLastError( 0xdeadbeef ); + uc.lpszUserName = NULL; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( !ret, "expected failure\n" ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", GetLastError() ); + + /* valid password, empty username */ + fill_url_components( &uc ); + uc.lpszUserName = empty; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n"); + + /* NULL username, NULL password */ + fill_url_components( &uc ); + uc.lpszUserName = NULL; + uc.lpszPassword = NULL; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 38, "expected len 38 got %u\n", len ); + ok( !lstrcmpW( url, url4 ), "url doesn't match\n" ); + + /* empty username, empty password */ + fill_url_components( &uc ); + uc.lpszUserName = empty; + uc.lpszPassword = empty; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 56, "expected len 56 got %u\n", len ); + ok( !lstrcmpW( url, url5 ), "url doesn't match\n" ); + + /* nScheme has lower precedence than lpszScheme */ + fill_url_components( &uc ); + uc.lpszScheme = ftp; + uc.dwSchemeLength = lstrlenW( uc.lpszScheme ); + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == lstrlenW( url6 ), "expected len %d got %u\n", lstrlenW( url6 ) + 1, len ); + ok( !lstrcmpW( url, url6 ), "url doesn't match\n" ); + + /* non-standard port */ + uc.lpszScheme = http; + uc.dwSchemeLength = lstrlenW( uc.lpszScheme ); + uc.nPort = 42; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 59, "expected len 59 got %u\n", len ); + ok( !lstrcmpW( url, url7 ), "url doesn't match\n" ); + + /* escape extra info */ + fill_url_components( &uc ); + uc.lpszExtraInfo = escape; + uc.dwExtraInfoLength = lstrlenW( uc.lpszExtraInfo ); + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, ICU_ESCAPE, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 113, "expected len 113 got %u\n", len ); + ok( !lstrcmpW( url, url8 ), "url doesn't match\n" ); + + /* NULL lpszScheme, 0 nScheme and nPort */ + fill_url_components( &uc ); + uc.lpszScheme = NULL; + uc.dwSchemeLength = 0; + uc.nScheme = 0; + uc.nPort = 0; + url[0] = 0; + len = 256; + ret = WinHttpCreateUrl( &uc, 0, url, &len ); + ok( ret, "expected success\n" ); + ok( len == 58, "expected len 58 got %u\n", len ); + ok( !lstrcmpW( url, url9 ), "url doesn't match\n" ); + + HeapFree( GetProcessHeap(), 0, url ); +} + +static void reset_url_components( URL_COMPONENTS *uc ) +{ + memset( uc, 0, sizeof(URL_COMPONENTS) ); + uc->dwStructSize = sizeof(URL_COMPONENTS); + uc->dwSchemeLength = ~0u; + uc->dwHostNameLength = ~0u; + uc->nPort = 0; + uc->dwUserNameLength = ~0u; + uc->dwPasswordLength = ~0u; + uc->dwUrlPathLength = ~0u; + uc->dwExtraInfoLength = ~0u; +} + +static void WinHttpCrackUrl_test( void ) +{ + URL_COMPONENTSW uc; + WCHAR scheme[20], user[20], pass[20], host[20], path[40], extra[20]; + DWORD error; + BOOL ret; + + /* buffers of sufficient length */ + scheme[0] = 0; + user[0] = 0; + pass[0] = 0; + host[0] = 0; + path[0] = 0; + extra[0] = 0; + + uc.dwStructSize = sizeof(URL_COMPONENTS); + uc.nScheme = 0; + uc.lpszScheme = scheme; + uc.dwSchemeLength = 20; + uc.lpszUserName = user; + uc.dwUserNameLength = 20; + uc.lpszPassword = pass; + uc.dwPasswordLength = 20; + uc.lpszHostName = host; + uc.dwHostNameLength = 20; + uc.nPort = 0; + uc.lpszUrlPath = path; + uc.dwUrlPathLength = 40; + uc.lpszExtraInfo = extra; + uc.dwExtraInfoLength = 20; + + ret = WinHttpCrackUrl( url1, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" ); + ok( !memcmp( uc.lpszScheme, http, sizeof(http) ), "unexpected scheme\n" ); + ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" ); + ok( !memcmp( uc.lpszUserName, username, sizeof(username) ), "unexpected username\n" ); + ok( uc.dwUserNameLength == 8, "unexpected username length\n" ); + ok( !memcmp( uc.lpszPassword, password, sizeof(password) ), "unexpected password\n" ); + ok( uc.dwPasswordLength == 8, "unexpected password length\n" ); + ok( !memcmp( uc.lpszHostName, winehq, sizeof(winehq) ), "unexpected hostname\n" ); + ok( uc.dwHostNameLength == 14, "unexpected hostname length\n" ); + ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort ); + ok( !memcmp( uc.lpszUrlPath, about, sizeof(about) ), "unexpected path\n" ); + ok( uc.dwUrlPathLength == 11, "unexpected path length\n" ); + ok( !memcmp( uc.lpszExtraInfo, query, sizeof(query) ), "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 6, "unexpected extra info length\n" ); + + /* buffer of insufficient length */ + scheme[0] = 0; + uc.dwSchemeLength = 1; + + SetLastError( 0xdeadbeef ); + ret = WinHttpCrackUrl( url1, 0, 0, &uc ); + error = GetLastError(); + ok( !ret, "WinHttpCrackUrl failed\n" ); + ok( error == ERROR_INSUFFICIENT_BUFFER, "WinHttpCrackUrl failed\n" ); + ok( uc.dwSchemeLength == 5, "unexpected scheme length: %u\n", uc.dwSchemeLength ); + + /* no buffers */ + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k1, 0, 0,&uc); + + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" ); + ok( uc.lpszScheme == url_k1,"unexpected scheme\n" ); + ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" ); + ok( uc.lpszUserName == url_k1 + 7, "unexpected username\n" ); + ok( uc.dwUserNameLength == 8, "unexpected username length\n" ); + ok( uc.lpszPassword == url_k1 + 16, "unexpected password\n" ); + ok( uc.dwPasswordLength == 8, "unexpected password length\n" ); + ok( uc.lpszHostName == url_k1 + 25, "unexpected hostname\n" ); + ok( uc.dwHostNameLength == 14, "unexpected hostname length\n" ); + ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort ); + ok( uc.lpszUrlPath == url_k1 + 39, "unexpected path\n" ); + ok( uc.dwUrlPathLength == 11, "unexpected path length\n" ); + ok( uc.lpszExtraInfo == url_k1 + 50, "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 0, "unexpected extra info length\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k2, 0, 0,&uc); + + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" ); + ok( uc.lpszScheme == url_k2, "unexpected scheme\n" ); + ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" ); + ok( uc.lpszUserName == NULL ,"unexpected username\n" ); + ok( uc.dwUserNameLength == 0, "unexpected username length\n" ); + ok( uc.lpszPassword == NULL, "unexpected password\n" ); + ok( uc.dwPasswordLength == 0, "unexpected password length\n" ); + ok( uc.lpszHostName == url_k2 + 7, "unexpected hostname\n" ); + ok( uc.dwHostNameLength == 14, "unexpected hostname length\n" ); + ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort ); + ok( uc.lpszUrlPath == url_k2 + 21, "unexpected path\n" ); + ok( uc.dwUrlPathLength == 0, "unexpected path length\n" ); + ok( uc.lpszExtraInfo == url_k2 + 21, "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 0, "unexpected extra info length\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k3, 0, 0, &uc ); + + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nScheme == INTERNET_SCHEME_HTTPS, "unexpected scheme\n" ); + ok( uc.lpszScheme == url_k3, "unexpected scheme\n" ); + ok( uc.dwSchemeLength == 5, "unexpected scheme length\n" ); + ok( uc.lpszUserName == NULL, "unexpected username\n" ); + ok( uc.dwUserNameLength == 0, "unexpected username length\n" ); + ok( uc.lpszPassword == NULL, "unexpected password\n" ); + ok( uc.dwPasswordLength == 0, "unexpected password length\n" ); + ok( uc.lpszHostName == url_k3 + 8, "unexpected hostname\n" ); + ok( uc.dwHostNameLength == 14, "unexpected hostname length\n" ); + ok( uc.nPort == 443, "unexpected port: %u\n", uc.nPort ); + ok( uc.lpszUrlPath == url_k3 + 22, "unexpected path\n" ); + ok( uc.dwUrlPathLength == 5, "unexpected path length\n" ); + ok( uc.lpszExtraInfo == url_k3 + 27, "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 1, "unexpected extra info length\n" ); + + /* bad parameters */ + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k4, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k5, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k6, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k7, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k8, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k9, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.lpszUrlPath == url_k9 + 14, "unexpected path\n" ); + ok( uc.dwUrlPathLength == 0, "unexpected path length\n" ); + ok( uc.lpszExtraInfo == url_k9 + 14, "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 0, "unexpected extra info length\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url_k10, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.lpszUrlPath == url_k10 + 13, "unexpected path\n" ); + ok( uc.dwUrlPathLength == 7, "unexpected path length\n" ); + ok( uc.lpszExtraInfo == url_k10 + 20, "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 0, "unexpected extra info length\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url5, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( empty, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + ret = WinHttpCrackUrl( url1, 0, 0, NULL ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + ret = WinHttpCrackUrl( NULL, 0, 0, &uc ); + ok( !ret, "WinHttpCrackUrl failed\n" ); + + /* decoding without buffers */ + reset_url_components( &uc ); + SetLastError(0xdeadbeef); + ret = WinHttpCrackUrl( url8, 0, ICU_DECODE, &uc ); + error = GetLastError(); + ok( !ret, "WinHttpCrackUrl failed\n" ); + ok( error == ERROR_INVALID_PARAMETER, "WinHttpCrackUrl failed\n" ); + + /* decoding with buffers */ + uc.lpszScheme = scheme; + uc.dwSchemeLength = 20; + uc.lpszUserName = user; + uc.dwUserNameLength = 20; + uc.lpszPassword = pass; + uc.dwPasswordLength = 20; + uc.lpszHostName = host; + uc.dwHostNameLength = 20; + uc.nPort = 0; + uc.lpszUrlPath = path; + uc.dwUrlPathLength = 40; + uc.lpszExtraInfo = extra; + uc.dwExtraInfoLength = 20; + path[0] = 0; + + ret = WinHttpCrackUrl( url8, 0, ICU_DECODE, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( !memcmp( uc.lpszUrlPath + 11, escape, 21 * sizeof(WCHAR) ), "unexpected path\n" ); + ok( uc.dwUrlPathLength == 32, "unexpected path length\n" ); + ok( !memcmp( uc.lpszExtraInfo, escape + 21, 12 * sizeof(WCHAR) ), "unexpected extra info\n" ); + ok( uc.dwExtraInfoLength == 12, "unexpected extra info length\n" ); + + /* Urls with specified port numbers */ + /* decoding with buffers */ + uc.lpszScheme = scheme; + uc.dwSchemeLength = 20; + uc.lpszUserName = user; + uc.dwUserNameLength = 20; + uc.lpszPassword = pass; + uc.dwPasswordLength = 20; + uc.lpszHostName = host; + uc.dwHostNameLength = 20; + uc.nPort = 0; + uc.lpszUrlPath = path; + uc.dwUrlPathLength = 40; + uc.lpszExtraInfo = extra; + uc.dwExtraInfoLength = 20; + path[0] = 0; + + ret = WinHttpCrackUrl( url7, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( !memcmp( uc.lpszHostName, winehq, sizeof(winehq) ), "unexpected host name: %s\n", debugstr_w(uc.lpszHostName) ); + ok( uc.dwHostNameLength == 14, "unexpected host name length: %d\n", uc.dwHostNameLength ); + ok( uc.nPort == 42, "unexpected port: %u\n", uc.nPort ); + + /* decoding without buffers */ + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url9, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nPort == 0, "unexpected port: %u\n", uc.nPort ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url10, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort ); + + reset_url_components( &uc ); + ret = WinHttpCrackUrl( url11, 0, 0, &uc ); + ok( ret, "WinHttpCrackUrl failed\n" ); + ok( uc.nPort == 443, "unexpected port: %u\n", uc.nPort ); + + reset_url_components( &uc ); + SetLastError( 0xdeadbeef ); + ret = WinHttpCrackUrl( empty, 0, 0, &uc ); + error = GetLastError(); + ok( !ret, "WinHttpCrackUrl succeeded\n" ); + ok( error == ERROR_WINHTTP_UNRECOGNIZED_SCHEME, "got %u, expected ERROR_WINHTTP_UNRECOGNIZED_SCHEME\n", error ); + + reset_url_components( &uc ); + SetLastError( 0xdeadbeef ); + ret = WinHttpCrackUrl( http, 0, 0, &uc ); + error = GetLastError(); + ok( !ret, "WinHttpCrackUrl succeeded\n" ); + ok( error == ERROR_WINHTTP_UNRECOGNIZED_SCHEME, "got %u, expected ERROR_WINHTTP_UNRECOGNIZED_SCHEME\n", error ); +} + +START_TEST (url) +{ + WinHttpCreateUrl_test(); + WinHttpCrackUrl_test(); +} diff --git a/rostests/winetests/winhttp/winhttp.c b/rostests/winetests/winhttp/winhttp.c index 71e4efa788c..74e1c9a12ec 100644 --- a/rostests/winetests/winhttp/winhttp.c +++ b/rostests/winetests/winhttp/winhttp.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "wine/test.h" @@ -30,6 +31,154 @@ static const WCHAR test_useragent[] = {'W','i','n','e',' ','R','e','g','r','e','s','s','i','o','n',' ','T','e','s','t',0}; static const WCHAR test_server[] = {'w','i','n','e','h','q','.','o','r','g',0}; +static void test_QueryOption(void) +{ + BOOL ret; + HINTERNET session, request, connection; + DWORD feature, size; + + SetLastError(0xdeadbeef); + session = WinHttpOpen(test_useragent, 0, 0, 0, 0); + ok(session != NULL, "WinHttpOpen failed to open session, error %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, NULL); + ok(!ret, "should fail to set redirect policy %u\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + size = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, &size); + ok(!ret, "should fail to query option\n"); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); + ok(size == 4, "expected 4, got %u\n", size); + + feature = 0xdeadbeef; + size = sizeof(feature) - 1; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size); + ok(!ret, "should fail to query option\n"); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); + ok(size == 4, "expected 4, got %u\n", size); + + feature = 0xdeadbeef; + size = sizeof(feature) + 1; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size); + ok(ret, "failed to query option %u\n", GetLastError()); + ok(size == sizeof(feature), "WinHttpQueryOption should set the size: %u\n", size); + ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, + "expected WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP, got %#x\n", feature); + + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, NULL, sizeof(feature)); + ok(!ret, "should fail to set redirect policy %u\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS; + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature) - 1); + ok(!ret, "should fail to set redirect policy %u\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); + + feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS; + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature) + 1); + ok(!ret, "should fail to set redirect policy %u\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); + + feature = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS; + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, sizeof(feature)); + ok(ret, "failed to set redirect policy %u\n", GetLastError()); + + feature = 0xdeadbeef; + size = sizeof(feature); + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(session, WINHTTP_OPTION_REDIRECT_POLICY, &feature, &size); + ok(ret, "failed to query option %u\n", GetLastError()); + ok(feature == WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, + "expected WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS, got %#x\n", feature); + + feature = WINHTTP_DISABLE_COOKIES; + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(session, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature)); + ok(!ret, "should fail to set disable feature for a session\n"); + ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, + "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + connection = WinHttpConnect(session, test_server, INTERNET_DEFAULT_HTTP_PORT, 0); + ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u\n", GetLastError()); + + feature = WINHTTP_DISABLE_COOKIES; + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(connection, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature)); + ok(!ret, "should fail to set disable feature for a connection\n"); + ok(GetLastError() == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, + "expected ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER, + WINHTTP_DEFAULT_ACCEPT_TYPES, 0); + if (request == NULL && GetLastError() == ERROR_WINHTTP_NAME_NOT_RESOLVED) + { + skip("Network unreachable, skipping the test\n"); + goto done; + } + + feature = 0xdeadbeef; + size = sizeof(feature); + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, &size); + ok(!ret, "should fail to query disable feature for a request\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + feature = 0; + size = sizeof(feature); + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature)); + ok(ret, "failed to set feature %u\n", GetLastError()); + + feature = 0xffffffff; + size = sizeof(feature); + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature)); + ok(ret, "failed to set feature %u\n", GetLastError()); + + feature = WINHTTP_DISABLE_COOKIES; + size = sizeof(feature); + SetLastError(0xdeadbeef); + ret = WinHttpSetOption(request, WINHTTP_OPTION_DISABLE_FEATURE, &feature, sizeof(feature)); + ok(ret, "failed to set feature %u\n", GetLastError()); + + size = 0; + SetLastError(0xdeadbeef); + ret = WinHttpQueryOption(request, WINHTTP_OPTION_DISABLE_FEATURE, NULL, &size); + ok(!ret, "should fail to query disable feature for a request\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = WinHttpCloseHandle(request); + ok(ret, "WinHttpCloseHandle failed on closing request: %u\n", GetLastError()); + +done: + SetLastError(0xdeadbeef); + ret = WinHttpCloseHandle(connection); + ok(ret, "WinHttpCloseHandle failed on closing connection: %u\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = WinHttpCloseHandle(session); + ok(ret, "WinHttpCloseHandle failed on closing session: %u\n", GetLastError()); +} + static void test_OpenRequest (void) { BOOL ret; @@ -272,6 +421,7 @@ static void test_WinHttpAddHeaders(void) */ index = 0; len = 5*sizeof(WCHAR); + memset(check_buffer, 0xab, sizeof(check_buffer)); memcpy(buffer, check_buffer, sizeof(buffer)); ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, test_header_name, buffer, &len, &index); @@ -515,22 +665,22 @@ static void test_WinHttpAddHeaders(void) test_header_name, buffer, &len, &index); ok(ret == FALSE, "WinHttpQueryHeaders succeeded unexpectedly, found third header.\n"); - ret = WinHttpAddRequestHeaders(request, test_headers[8], ~0UL, WINHTTP_ADDREQ_FLAG_ADD); + ret = WinHttpAddRequestHeaders(request, test_headers[8], ~0u, WINHTTP_ADDREQ_FLAG_ADD); ok(!ret, "WinHttpAddRequestHeaders failed\n"); - ret = WinHttpAddRequestHeaders(request, test_headers[9], ~0UL, WINHTTP_ADDREQ_FLAG_ADD); + ret = WinHttpAddRequestHeaders(request, test_headers[9], ~0u, WINHTTP_ADDREQ_FLAG_ADD); ok(ret, "WinHttpAddRequestHeaders failed\n"); - ret = WinHttpAddRequestHeaders(request, test_headers[10], ~0UL, WINHTTP_ADDREQ_FLAG_ADD); + ret = WinHttpAddRequestHeaders(request, test_headers[10], ~0u, WINHTTP_ADDREQ_FLAG_ADD); ok(!ret, "WinHttpAddRequestHeaders failed\n"); - ret = WinHttpAddRequestHeaders(request, test_headers[11], ~0UL, WINHTTP_ADDREQ_FLAG_ADD); + ret = WinHttpAddRequestHeaders(request, test_headers[11], ~0u, WINHTTP_ADDREQ_FLAG_ADD); ok(!ret, "WinHttpAddRequestHeaders failed\n"); - ret = WinHttpAddRequestHeaders(request, test_headers[12], ~0UL, WINHTTP_ADDREQ_FLAG_ADD); + ret = WinHttpAddRequestHeaders(request, test_headers[12], ~0u, WINHTTP_ADDREQ_FLAG_ADD); ok(!ret, "WinHttpAddRequestHeaders failed\n"); - ret = WinHttpAddRequestHeaders(request, test_headers[13], ~0UL, WINHTTP_ADDREQ_FLAG_ADD); + ret = WinHttpAddRequestHeaders(request, test_headers[13], ~0u, WINHTTP_ADDREQ_FLAG_ADD); ok(ret, "WinHttpAddRequestHeaders failed\n"); index = 0; @@ -556,8 +706,9 @@ static void test_secure_connection(void) static const WCHAR google[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0}; HANDLE ses, con, req; - DWORD size, status, policy; + DWORD size, status, policy, bitness; BOOL ret; + CERT_CONTEXT *cert; ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); @@ -591,6 +742,14 @@ static void test_secure_connection(void) ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); ok(ret, "failed to send request %u\n", GetLastError()); + size = sizeof(cert); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert, &size ); + ok(ret, "failed to retrieve certificate context %u\n", GetLastError()); + + size = sizeof(bitness); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_SECURITY_KEY_BITNESS, &bitness, &size ); + ok(ret, "failed to retrieve key bitness %u\n", GetLastError()); + ret = WinHttpReceiveResponse(req, NULL); ok(ret, "failed to receive response %u\n", GetLastError()); @@ -667,4 +826,5 @@ START_TEST (winhttp) test_WinHttpAddHeaders(); test_secure_connection(); test_request_parameter_defaults(); + test_QueryOption(); } diff --git a/rostests/winetests/winhttp/winhttp.rbuild b/rostests/winetests/winhttp/winhttp.rbuild index a49b528e5c2..a08973191e2 100644 --- a/rostests/winetests/winhttp/winhttp.rbuild +++ b/rostests/winetests/winhttp/winhttp.rbuild @@ -7,6 +7,7 @@ notification.c testlist.c + url.c winhttp.c wine winhttp diff --git a/rostests/winetests/wininet/ftp.c b/rostests/winetests/wininet/ftp.c index 992bce99feb..a785fa983f4 100644 --- a/rostests/winetests/wininet/ftp.c +++ b/rostests/winetests/wininet/ftp.c @@ -25,7 +25,6 @@ * TODO: * Add W-function tests. * Add missing function tests: - * FtpFindFirstFile * FtpGetFileSize * FtpSetCurrentDirectory */ @@ -66,6 +65,8 @@ static void test_connect(HINTERNET hInternet) * anonymous : NULL * NULL : IEUser@ * NULL : NULL + * "" : IEUser@ + * "" : NULL */ SetLastError(0xdeadbeef); @@ -85,6 +86,13 @@ static void test_connect(HINTERNET hInternet) ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + SetLastError(0xdeadbeef); + hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "", "IEUser@", + INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); + ok(!hFtp, "Expected InternetConnect to fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + /* Using a NULL username and password will be interpreted as anonymous ftp. The username will be 'anonymous' the password * is created via some simple heuristics (see dlls/wininet/ftp.c). * On Wine this registry key is not set by default so (NULL, NULL) will result in anonymous ftp with an (most likely) not @@ -103,6 +111,20 @@ static void test_connect(HINTERNET hInternet) ok ( hFtp != NULL, "InternetConnect failed : %d\n", GetLastError()); ok ( GetLastError() == ERROR_SUCCESS, "ERROR_SUCCESS, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "", NULL, + INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); + if (!hFtp) + { + ok(GetLastError() == ERROR_INTERNET_LOGIN_FAILURE, + "Expected ERROR_INTERNET_LOGIN_FAILURE, got %d\n", GetLastError()); + } + else + { + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %d\n", GetLastError()); + } } static void test_createdir(HINTERNET hFtp, HINTERNET hConnect) @@ -259,7 +281,6 @@ static void test_getfile(HINTERNET hFtp, HINTERNET hConnect) ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR, "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError()); /* Currently Wine always creates the local file (even on failure) which is not correct, hence the test */ - todo_wine ok (GetFileAttributesA("should_also_be_non_existing_deadbeef") == INVALID_FILE_ATTRIBUTES, "Local file should not have been created\n"); @@ -280,7 +301,6 @@ static void test_getfile(HINTERNET hFtp, HINTERNET hConnect) ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR, "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError()); /* Currently Wine always creates the local file (even on failure) which is not correct, hence the test */ - todo_wine ok (GetFileAttributesA("should_also_be_non_existing_deadbeef") == INVALID_FILE_ATTRIBUTES, "Local file should not have been created\n"); @@ -387,7 +407,9 @@ static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ok ( hOpenFile != NULL, "Expected FtpOpenFileA to succeed\n"); - ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", GetLastError()); + ok ( GetLastError() == ERROR_SUCCESS || + broken(GetLastError() == ERROR_FILE_NOT_FOUND), /* Win98 */ + "Expected ERROR_SUCCESS, got %u\n", GetLastError()); if (hOpenFile) { @@ -700,6 +722,89 @@ static void test_command(HINTERNET hFtp, HINTERNET hConnect) } } +static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect) +{ + WIN32_FIND_DATA findData; + HINTERNET hSearch; + HINTERNET hSearch2; + HINTERNET hOpenFile; + + /* NULL as the search file ought to return the first file in the directory */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, NULL, &findData, 0, 0); + ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" ); + + /* This should fail as the previous handle wasn't closed */ + SetLastError(0xdeadbeef); + hSearch2 = FtpFindFirstFileA(hFtp, "welcome.msg", &findData, 0, 0); + todo_wine ok ( hSearch2 == NULL, "Expected FtpFindFirstFileA to fail\n" ); + todo_wine ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError() ); + InternetCloseHandle(hSearch2); /* Just in case */ + + InternetCloseHandle(hSearch); + + /* Try a valid filename in a subdirectory search */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, "pub/wine", &findData, 0, 0); + todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" ); + InternetCloseHandle(hSearch); + + /* Try a valid filename in a subdirectory wildcard search */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, "pub/w*", &findData, 0, 0); + todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" ); + InternetCloseHandle(hSearch); + + /* Try an invalid wildcard search */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, "*/w*", &findData, 0, 0); + ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); + InternetCloseHandle(hSearch); /* Just in case */ + + /* Try FindFirstFile between FtpOpenFile and InternetCloseHandle */ + SetLastError(0xdeadbeef); + hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); + ok ( hOpenFile != NULL, "Expected FtpOpenFileA to succeed\n" ); + ok ( GetLastError() == ERROR_SUCCESS || + broken(GetLastError() == ERROR_FILE_NOT_FOUND), /* Win98 */ + "Expected ERROR_SUCCESS, got %u\n", GetLastError() ); + + /* This should fail as the OpenFile handle wasn't closed */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, "welcome.msg", &findData, 0, 0); + ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); + ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError() ); + InternetCloseHandle(hSearch); /* Just in case */ + + InternetCloseHandle(hOpenFile); + + /* Test using a nonexistent filename */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, "this_file_should_not_exist", &findData, 0, 0); + ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); + todo_wine ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR, + "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError() ); + InternetCloseHandle(hSearch); /* Just in case */ + + /* Test using a nonexistent filename and a wildcard */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hFtp, "this_file_should_not_exist*", &findData, 0, 0); + ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); + todo_wine ok ( GetLastError() == ERROR_NO_MORE_FILES, + "Expected ERROR_NO_MORE_FILES, got %d\n", GetLastError() ); + InternetCloseHandle(hSearch); /* Just in case */ + + /* Test using an invalid handle type */ + SetLastError(0xdeadbeef); + hSearch = FtpFindFirstFileA(hConnect, "welcome.msg", &findData, 0, 0); + ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); + ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, + "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError() ); + InternetCloseHandle(hSearch); /* Just in case */ +} + static void test_get_current_dir(HINTERNET hFtp, HINTERNET hConnect) { BOOL bRet; @@ -830,6 +935,7 @@ START_TEST(ftp) test_removedir(hFtp, hHttp); test_renamefile(hFtp, hHttp); test_command(hFtp, hHttp); + test_find_first_file(hFtp, hHttp); test_get_current_dir(hFtp, hHttp); InternetCloseHandle(hHttp); diff --git a/rostests/winetests/wininet/generated.c b/rostests/winetests/wininet/generated.c index e88b3bfeb13..ceb21deb869 100644 --- a/rostests/winetests/wininet/generated.c +++ b/rostests/winetests/wininet/generated.c @@ -1,4 +1,4 @@ -/* File generated automatically from tools/winapi/test.dat; do not edit! */ +/* File generated automatically from tools/winapi/tests.dat; do not edit! */ /* This file can be copied, modified and distributed without restriction. */ /* @@ -31,22 +31,14 @@ * Windows API extension */ -#if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) -# define FIELD_ALIGNMENT(type, field) __alignof(((type*)0)->field) -#elif defined(__GNUC__) -# define FIELD_ALIGNMENT(type, field) __alignof__(((type*)0)->field) -#else -/* FIXME: Not sure if is possible to do without compiler extension */ -#endif - #if defined(_MSC_VER) && (_MSC_VER >= 1300) && defined(__cplusplus) # define _TYPE_ALIGNMENT(type) __alignof(type) #elif defined(__GNUC__) # define _TYPE_ALIGNMENT(type) __alignof__(type) #else /* - * FIXME: Not sure if is possible to do without compiler extension - * (if type is not just a name that is, if so the normal) + * FIXME: May not be possible without a compiler extension + * (if type is not just a name that is, otherwise the normal * TYPE_ALIGNMENT can be used) */ #endif @@ -63,857 +55,1275 @@ * Test helper macros */ -#ifdef FIELD_ALIGNMENT -# define TEST_FIELD_ALIGNMENT(type, field, align) \ - ok(FIELD_ALIGNMENT(type, field) == align, \ - "FIELD_ALIGNMENT(" #type ", " #field ") == %d (expected " #align ")\n", \ - (int)FIELD_ALIGNMENT(type, field)) +#ifdef _WIN64 + +# define TEST_TYPE_SIZE(type, size) +# define TEST_TYPE_ALIGN(type, align) +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# define TEST_FIELD_OFFSET(type, field, offset) + #else -# define TEST_FIELD_ALIGNMENT(type, field, align) do { } while (0) + +# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); + +# ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +# else +# define TEST_TYPE_ALIGN(type, align) +# endif + +# ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +# else +# define TEST_TARGET_ALIGN(type, align) +# define TEST_FIELD_ALIGN(type, field, align) +# endif + +# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #endif -#define TEST_FIELD_OFFSET(type, field, offset) \ - ok(FIELD_OFFSET(type, field) == offset, \ - "FIELD_OFFSET(" #type ", " #field ") == %ld (expected " #offset ")\n", \ - (long int)FIELD_OFFSET(type, field)) +#define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) +#define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) +#define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); +#define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); -#ifdef _TYPE_ALIGNMENT -#define TEST__TYPE_ALIGNMENT(type, align) \ - ok(_TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)_TYPE_ALIGNMENT(type)) -#else -# define TEST__TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#ifdef TYPE_ALIGNMENT -#define TEST_TYPE_ALIGNMENT(type, align) \ - ok(TYPE_ALIGNMENT(type) == align, "TYPE_ALIGNMENT(" #type ") == %d (expected " #align ")\n", (int)TYPE_ALIGNMENT(type)) -#else -# define TEST_TYPE_ALIGNMENT(type, align) do { } while (0) -#endif - -#define TEST_TYPE_SIZE(type, size) \ - ok(sizeof(type) == size, "sizeof(" #type ") == %d (expected " #size ")\n", ((int) sizeof(type))) - -/*********************************************************************** - * Test macros - */ - -#define TEST_FIELD(type, field_type, field_name, field_offset, field_size, field_align) \ - TEST_TYPE_SIZE(field_type, field_size); \ - TEST_FIELD_ALIGNMENT(type, field_name, field_align); \ - TEST_FIELD_OFFSET(type, field_name, field_offset); \ - -#define TEST_TYPE(type, size, align) \ - TEST_TYPE_ALIGNMENT(type, align); \ - TEST_TYPE_SIZE(type, size) - -#define TEST_TYPE_POINTER(type, size, align) \ - TEST__TYPE_ALIGNMENT(*(type)0, align); \ - TEST_TYPE_SIZE(*(type)0, size) - -#define TEST_TYPE_SIGNED(type) \ - ok((type) -1 < 0, "(" #type ") -1 < 0\n"); - -#define TEST_TYPE_UNSIGNED(type) \ - ok((type) -1 > 0, "(" #type ") -1 > 0\n"); static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) { /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8, 4); - TEST_FIELD(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, LPCSTR, ShortAbstract, 0, 4, 4); - TEST_FIELD(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, LPCSTR, AbstractFile, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 4) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 4) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 0) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 4) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 4) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 4) } static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) { /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8, 4); - TEST_FIELD(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, LPCWSTR, ShortAbstract, 0, 4, 4); - TEST_FIELD(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, LPCWSTR, AbstractFile, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 4) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 4) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 0) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 4) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 4) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 4) } static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) { /* GOPHER_ADMIN_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_ADMIN_ATTRIBUTE_TYPEA, 8, 4); - TEST_FIELD(GOPHER_ADMIN_ATTRIBUTE_TYPEA, LPCSTR, Comment, 0, 4, 4); - TEST_FIELD(GOPHER_ADMIN_ATTRIBUTE_TYPEA, LPCSTR, EmailAddress, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 4) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 4) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 0) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 4) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 4) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 4) } static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) { /* GOPHER_ADMIN_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_ADMIN_ATTRIBUTE_TYPEW, 8, 4); - TEST_FIELD(GOPHER_ADMIN_ATTRIBUTE_TYPEW, LPCWSTR, Comment, 0, 4, 4); - TEST_FIELD(GOPHER_ADMIN_ATTRIBUTE_TYPEW, LPCWSTR, EmailAddress, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 4) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 4) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 0) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 4) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 4) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 4) } static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) { /* GOPHER_ASK_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_ASK_ATTRIBUTE_TYPEA, 8, 4); - TEST_FIELD(GOPHER_ASK_ATTRIBUTE_TYPEA, LPCSTR, QuestionType, 0, 4, 4); - TEST_FIELD(GOPHER_ASK_ATTRIBUTE_TYPEA, LPCSTR, QuestionText, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 4) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 4) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 0) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 4) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 4) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 4) } static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEW(void) { /* GOPHER_ASK_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_ASK_ATTRIBUTE_TYPEW, 8, 4); - TEST_FIELD(GOPHER_ASK_ATTRIBUTE_TYPEW, LPCWSTR, QuestionType, 0, 4, 4); - TEST_FIELD(GOPHER_ASK_ATTRIBUTE_TYPEW, LPCWSTR, QuestionText, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 4) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 4) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 0) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 4) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 4) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 4) } static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORA(void) { /* GOPHER_ATTRIBUTE_ENUMERATORA */ - TEST_TYPE(GOPHER_ATTRIBUTE_ENUMERATORA, 4, 4); + TEST_TYPE_SIZE (GOPHER_ATTRIBUTE_ENUMERATORA, 4) + TEST_TYPE_ALIGN (GOPHER_ATTRIBUTE_ENUMERATORA, 4) } static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORW(void) { /* GOPHER_ATTRIBUTE_ENUMERATORW */ - TEST_TYPE(GOPHER_ATTRIBUTE_ENUMERATORW, 4, 4); + TEST_TYPE_SIZE (GOPHER_ATTRIBUTE_ENUMERATORW, 4) + TEST_TYPE_ALIGN (GOPHER_ATTRIBUTE_ENUMERATORW, 4) } static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) { /* GOPHER_ATTRIBUTE_TYPEA (pack 4) */ - TEST_FIELD(GOPHER_ATTRIBUTE_TYPEA, DWORD, CategoryId, 0, 4, 4); - TEST_FIELD(GOPHER_ATTRIBUTE_TYPEA, DWORD, AttributeId, 4, 4, 4); + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, CategoryId, 0) + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) } static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) { /* GOPHER_ATTRIBUTE_TYPEW (pack 4) */ - TEST_FIELD(GOPHER_ATTRIBUTE_TYPEW, DWORD, CategoryId, 0, 4, 4); - TEST_FIELD(GOPHER_ATTRIBUTE_TYPEW, DWORD, AttributeId, 4, 4, 4); + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, CategoryId, 0) + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) } static void test_pack_GOPHER_FIND_DATAA(void) { /* GOPHER_FIND_DATAA (pack 4) */ - TEST_TYPE(GOPHER_FIND_DATAA, 808, 4); - TEST_FIELD(GOPHER_FIND_DATAA, CHAR[MAX_GOPHER_DISPLAY_TEXT + 1], DisplayString, 0, 129, 1); - TEST_FIELD(GOPHER_FIND_DATAA, DWORD, GopherType, 132, 4, 4); - TEST_FIELD(GOPHER_FIND_DATAA, DWORD, SizeLow, 136, 4, 4); - TEST_FIELD(GOPHER_FIND_DATAA, DWORD, SizeHigh, 140, 4, 4); - TEST_FIELD(GOPHER_FIND_DATAA, FILETIME, LastModificationTime, 144, 8, 4); - TEST_FIELD(GOPHER_FIND_DATAA, CHAR[MAX_GOPHER_LOCATOR_LENGTH + 1], Locator, 152, 654, 1); + TEST_TYPE_SIZE (GOPHER_FIND_DATAA, 808) + TEST_TYPE_ALIGN (GOPHER_FIND_DATAA, 4) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, DisplayString, 129) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, DisplayString, 1) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, DisplayString, 0) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, GopherType, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, GopherType, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, GopherType, 132) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, SizeLow, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, SizeLow, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, SizeLow, 136) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, SizeHigh, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, SizeHigh, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, SizeHigh, 140) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, LastModificationTime, 8) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, LastModificationTime, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, LastModificationTime, 144) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, Locator, 654) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, Locator, 1) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, Locator, 152) } static void test_pack_GOPHER_FIND_DATAW(void) { /* GOPHER_FIND_DATAW (pack 4) */ - TEST_TYPE(GOPHER_FIND_DATAW, 1588, 4); - TEST_FIELD(GOPHER_FIND_DATAW, WCHAR[MAX_GOPHER_DISPLAY_TEXT + 1], DisplayString, 0, 258, 2); - TEST_FIELD(GOPHER_FIND_DATAW, DWORD, GopherType, 260, 4, 4); - TEST_FIELD(GOPHER_FIND_DATAW, DWORD, SizeLow, 264, 4, 4); - TEST_FIELD(GOPHER_FIND_DATAW, DWORD, SizeHigh, 268, 4, 4); - TEST_FIELD(GOPHER_FIND_DATAW, FILETIME, LastModificationTime, 272, 8, 4); - TEST_FIELD(GOPHER_FIND_DATAW, WCHAR[MAX_GOPHER_LOCATOR_LENGTH + 1], Locator, 280, 1308, 2); + TEST_TYPE_SIZE (GOPHER_FIND_DATAW, 1588) + TEST_TYPE_ALIGN (GOPHER_FIND_DATAW, 4) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, DisplayString, 258) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, DisplayString, 2) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, DisplayString, 0) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, GopherType, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, GopherType, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, GopherType, 260) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, SizeLow, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, SizeLow, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, SizeLow, 264) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, SizeHigh, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, SizeHigh, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, SizeHigh, 268) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, LastModificationTime, 8) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, LastModificationTime, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, LastModificationTime, 272) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, Locator, 1308) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, Locator, 2) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, Locator, 280) } static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) { /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24, 4); - TEST_FIELD(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, INT, DegreesNorth, 0, 4, 4); - TEST_FIELD(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, INT, MinutesNorth, 4, 4, 4); - TEST_FIELD(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, INT, SecondsNorth, 8, 4, 4); - TEST_FIELD(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, INT, DegreesEast, 12, 4, 4); - TEST_FIELD(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, INT, MinutesEast, 16, 4, 4); - TEST_FIELD(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, INT, SecondsEast, 20, 4, 4); + TEST_TYPE_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) + TEST_TYPE_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 0) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 8) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 12) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 16) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 20) } static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) { /* GOPHER_LOCATION_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4, 4); - TEST_FIELD(GOPHER_LOCATION_ATTRIBUTE_TYPEA, LPCSTR, Location, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 4) + TEST_FIELD_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 4) + TEST_FIELD_OFFSET(GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 0) } static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) { /* GOPHER_LOCATION_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4, 4); - TEST_FIELD(GOPHER_LOCATION_ATTRIBUTE_TYPEW, LPCWSTR, Location, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 4) + TEST_FIELD_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 4) + TEST_FIELD_OFFSET(GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 0) } static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) { /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8, 4); - TEST_FIELD(GOPHER_MOD_DATE_ATTRIBUTE_TYPE, FILETIME, DateAndTime, 0, 8, 4); + TEST_TYPE_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 8) + TEST_FIELD_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 4) + TEST_FIELD_OFFSET(GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 0) } static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) { /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4, 4); - TEST_FIELD(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, LPCSTR, Organization, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 4) + TEST_FIELD_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 4) + TEST_FIELD_OFFSET(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 0) } static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) { /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4, 4); - TEST_FIELD(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, LPCWSTR, Organization, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 4) + TEST_FIELD_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 4) + TEST_FIELD_OFFSET(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 0) } static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) { /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4, 4); - TEST_FIELD(GOPHER_PROVIDER_ATTRIBUTE_TYPEA, LPCSTR, Provider, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 4) + TEST_FIELD_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 4) + TEST_FIELD_OFFSET(GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 0) } static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) { /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4, 4); - TEST_FIELD(GOPHER_PROVIDER_ATTRIBUTE_TYPEW, LPCWSTR, Provider, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 4) + TEST_FIELD_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 4) + TEST_FIELD_OFFSET(GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 0) } static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) { /* GOPHER_SCORE_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_SCORE_ATTRIBUTE_TYPE, 4, 4); - TEST_FIELD(GOPHER_SCORE_ATTRIBUTE_TYPE, INT, Score, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 0) } static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) { /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8, 4); - TEST_FIELD(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, INT, LowerBound, 0, 4, 4); - TEST_FIELD(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, INT, UpperBound, 4, 4, 4); + TEST_TYPE_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 0) + TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) } static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) { /* GOPHER_SITE_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_SITE_ATTRIBUTE_TYPEA, 4, 4); - TEST_FIELD(GOPHER_SITE_ATTRIBUTE_TYPEA, LPCSTR, Site, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 4) + TEST_FIELD_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 4) + TEST_FIELD_OFFSET(GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 0) } static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) { /* GOPHER_SITE_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_SITE_ATTRIBUTE_TYPEW, 4, 4); - TEST_FIELD(GOPHER_SITE_ATTRIBUTE_TYPEW, LPCWSTR, Site, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 4) + TEST_FIELD_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 4) + TEST_FIELD_OFFSET(GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 0) } static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) { /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4, 4); - TEST_FIELD(GOPHER_TIMEZONE_ATTRIBUTE_TYPE, INT, Zone, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) + TEST_FIELD_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) + TEST_FIELD_OFFSET(GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 0) } static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) { /* GOPHER_TTL_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_TTL_ATTRIBUTE_TYPE, 4, 4); - TEST_FIELD(GOPHER_TTL_ATTRIBUTE_TYPE, DWORD, Ttl, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) + TEST_FIELD_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) + TEST_FIELD_OFFSET(GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 0) } static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) { /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4, 4); - TEST_FIELD(GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, LPCSTR, Text, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 4) + TEST_FIELD_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 4) + TEST_FIELD_OFFSET(GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 0) } static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) { /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4, 4); - TEST_FIELD(GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, LPCWSTR, Text, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 4) + TEST_FIELD_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 4) + TEST_FIELD_OFFSET(GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 0) } static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) { /* GOPHER_VERONICA_ATTRIBUTE_TYPE (pack 4) */ - TEST_TYPE(GOPHER_VERONICA_ATTRIBUTE_TYPE, 4, 4); - TEST_FIELD(GOPHER_VERONICA_ATTRIBUTE_TYPE, BOOL, TreeWalk, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) + TEST_FIELD_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) + TEST_FIELD_OFFSET(GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 0) } static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) { /* GOPHER_VERSION_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_VERSION_ATTRIBUTE_TYPEA, 4, 4); - TEST_FIELD(GOPHER_VERSION_ATTRIBUTE_TYPEA, LPCSTR, Version, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 4) + TEST_FIELD_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 4) + TEST_FIELD_OFFSET(GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 0) } static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) { /* GOPHER_VERSION_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_VERSION_ATTRIBUTE_TYPEW, 4, 4); - TEST_FIELD(GOPHER_VERSION_ATTRIBUTE_TYPEW, LPCWSTR, Version, 0, 4, 4); + TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 4) + TEST_FIELD_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 4) + TEST_FIELD_OFFSET(GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 0) } static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) { /* GOPHER_VIEW_ATTRIBUTE_TYPEA (pack 4) */ - TEST_TYPE(GOPHER_VIEW_ATTRIBUTE_TYPEA, 12, 4); - TEST_FIELD(GOPHER_VIEW_ATTRIBUTE_TYPEA, LPCSTR, ContentType, 0, 4, 4); - TEST_FIELD(GOPHER_VIEW_ATTRIBUTE_TYPEA, LPCSTR, Language, 4, 4, 4); - TEST_FIELD(GOPHER_VIEW_ATTRIBUTE_TYPEA, DWORD, Size, 8, 4, 4); + TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, 12) + TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, 4) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 0) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 4) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 8) } static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEW(void) { /* GOPHER_VIEW_ATTRIBUTE_TYPEW (pack 4) */ - TEST_TYPE(GOPHER_VIEW_ATTRIBUTE_TYPEW, 12, 4); - TEST_FIELD(GOPHER_VIEW_ATTRIBUTE_TYPEW, LPCWSTR, ContentType, 0, 4, 4); - TEST_FIELD(GOPHER_VIEW_ATTRIBUTE_TYPEW, LPCWSTR, Language, 4, 4, 4); - TEST_FIELD(GOPHER_VIEW_ATTRIBUTE_TYPEW, DWORD, Size, 8, 4, 4); + TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, 12) + TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, 4) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 0) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 4) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 8) } static void test_pack_GROUPID(void) { /* GROUPID */ - TEST_TYPE(GROUPID, 8, 8); - TEST_TYPE_SIGNED(GROUPID); + TEST_TYPE_SIZE (GROUPID, 8) + TEST_TYPE_ALIGN (GROUPID, 8) + TEST_TYPE_SIGNED(GROUPID) } static void test_pack_HINTERNET(void) { /* HINTERNET */ - TEST_TYPE(HINTERNET, 4, 4); + TEST_TYPE_SIZE (HINTERNET, 4) + TEST_TYPE_ALIGN (HINTERNET, 4) } static void test_pack_HTTP_VERSION_INFO(void) { /* HTTP_VERSION_INFO (pack 4) */ - TEST_TYPE(HTTP_VERSION_INFO, 8, 4); - TEST_FIELD(HTTP_VERSION_INFO, DWORD, dwMajorVersion, 0, 4, 4); - TEST_FIELD(HTTP_VERSION_INFO, DWORD, dwMinorVersion, 4, 4, 4); + TEST_TYPE_SIZE (HTTP_VERSION_INFO, 8) + TEST_TYPE_ALIGN (HTTP_VERSION_INFO, 4) + TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (HTTP_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(HTTP_VERSION_INFO, dwMajorVersion, 0) + TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (HTTP_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(HTTP_VERSION_INFO, dwMinorVersion, 4) } static void test_pack_INTERNET_ASYNC_RESULT(void) { /* INTERNET_ASYNC_RESULT (pack 4) */ - TEST_TYPE(INTERNET_ASYNC_RESULT, 8, 4); - TEST_FIELD(INTERNET_ASYNC_RESULT, DWORD, dwResult, 0, 4, 4); - TEST_FIELD(INTERNET_ASYNC_RESULT, DWORD, dwError, 4, 4, 4); + TEST_TYPE_SIZE (INTERNET_ASYNC_RESULT, 8) + TEST_TYPE_ALIGN (INTERNET_ASYNC_RESULT, 4) + TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwResult, 4) + TEST_FIELD_ALIGN (INTERNET_ASYNC_RESULT, dwResult, 4) + TEST_FIELD_OFFSET(INTERNET_ASYNC_RESULT, dwResult, 0) + TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwError, 4) + TEST_FIELD_ALIGN (INTERNET_ASYNC_RESULT, dwError, 4) + TEST_FIELD_OFFSET(INTERNET_ASYNC_RESULT, dwError, 4) } static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) { /* INTERNET_AUTH_NOTIFY_DATA (pack 4) */ - TEST_TYPE(INTERNET_AUTH_NOTIFY_DATA, 16, 4); - TEST_FIELD(INTERNET_AUTH_NOTIFY_DATA, DWORD, cbStruct, 0, 4, 4); - TEST_FIELD(INTERNET_AUTH_NOTIFY_DATA, DWORD, dwOptions, 4, 4, 4); - TEST_FIELD(INTERNET_AUTH_NOTIFY_DATA, PFN_AUTH_NOTIFY, pfnNotify, 8, 4, 4); - TEST_FIELD(INTERNET_AUTH_NOTIFY_DATA, DWORD, dwContext, 12, 4, 4); + TEST_TYPE_SIZE (INTERNET_AUTH_NOTIFY_DATA, 16) + TEST_TYPE_ALIGN (INTERNET_AUTH_NOTIFY_DATA, 4) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, cbStruct, 0) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, dwContext, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, dwContext, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, dwContext, 12) } static void test_pack_INTERNET_BUFFERSA(void) { /* INTERNET_BUFFERSA (pack 4) */ - TEST_TYPE(INTERNET_BUFFERSA, 40, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwStructSize, 0, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, struct _INTERNET_BUFFERSA *, Next, 4, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, LPCSTR, lpcszHeader, 8, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwHeadersLength, 12, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwHeadersTotal, 16, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, LPVOID, lpvBuffer, 20, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwBufferLength, 24, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwBufferTotal, 28, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwOffsetLow, 32, 4, 4); - TEST_FIELD(INTERNET_BUFFERSA, DWORD, dwOffsetHigh, 36, 4, 4); + TEST_TYPE_SIZE (INTERNET_BUFFERSA, 40) + TEST_TYPE_ALIGN (INTERNET_BUFFERSA, 4) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, Next, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, Next, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, Next, 4) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, lpcszHeader, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, lpcszHeader, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, lpcszHeader, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwHeadersLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwHeadersLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwHeadersLength, 12) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwHeadersTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwHeadersTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwHeadersTotal, 16) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, lpvBuffer, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, lpvBuffer, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, lpvBuffer, 20) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwBufferLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwBufferLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwBufferLength, 24) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwBufferTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwBufferTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwBufferTotal, 28) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwOffsetLow, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwOffsetLow, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwOffsetLow, 32) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwOffsetHigh, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwOffsetHigh, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwOffsetHigh, 36) } static void test_pack_INTERNET_BUFFERSW(void) { /* INTERNET_BUFFERSW (pack 4) */ - TEST_TYPE(INTERNET_BUFFERSW, 40, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwStructSize, 0, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, struct _INTERNET_BUFFERSW *, Next, 4, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, LPCWSTR, lpcszHeader, 8, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwHeadersLength, 12, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwHeadersTotal, 16, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, LPVOID, lpvBuffer, 20, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwBufferLength, 24, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwBufferTotal, 28, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwOffsetLow, 32, 4, 4); - TEST_FIELD(INTERNET_BUFFERSW, DWORD, dwOffsetHigh, 36, 4, 4); + TEST_TYPE_SIZE (INTERNET_BUFFERSW, 40) + TEST_TYPE_ALIGN (INTERNET_BUFFERSW, 4) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, Next, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, Next, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, Next, 4) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, lpcszHeader, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, lpcszHeader, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, lpcszHeader, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwHeadersLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwHeadersLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwHeadersLength, 12) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwHeadersTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwHeadersTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwHeadersTotal, 16) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, lpvBuffer, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, lpvBuffer, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, lpvBuffer, 20) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwBufferLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwBufferLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwBufferLength, 24) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwBufferTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwBufferTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwBufferTotal, 28) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwOffsetLow, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwOffsetLow, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwOffsetLow, 32) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwOffsetHigh, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwOffsetHigh, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwOffsetHigh, 36) } static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) { /* INTERNET_CACHE_ENTRY_INFOA (pack 4) */ - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwStructSize, 0, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPSTR, lpszSourceUrlName, 4, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPSTR, lpszLocalFileName, 8, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, CacheEntryType, 12, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwUseCount, 16, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwHitRate, 20, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwSizeLow, 24, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwSizeHigh, 28, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, LastModifiedTime, 32, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, ExpireTime, 40, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, LastAccessTime, 48, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, FILETIME, LastSyncTime, 56, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPBYTE, lpHeaderInfo, 64, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, DWORD, dwHeaderInfoSize, 68, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOA, LPSTR, lpszFileExtension, 72, 4, 4); + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 4) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 8) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 12) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 16) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 20) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 24) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 28) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 32) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 40) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 48) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 56) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 64) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 68) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 72) } static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) { /* INTERNET_CACHE_ENTRY_INFOW (pack 4) */ - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwStructSize, 0, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPWSTR, lpszSourceUrlName, 4, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPWSTR, lpszLocalFileName, 8, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, CacheEntryType, 12, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwUseCount, 16, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwHitRate, 20, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwSizeLow, 24, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwSizeHigh, 28, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, LastModifiedTime, 32, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, ExpireTime, 40, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, LastAccessTime, 48, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, FILETIME, LastSyncTime, 56, 8, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPBYTE, lpHeaderInfo, 64, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, DWORD, dwHeaderInfoSize, 68, 4, 4); - TEST_FIELD(INTERNET_CACHE_ENTRY_INFOW, LPWSTR, lpszFileExtension, 72, 4, 4); + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 4) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 8) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 12) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 16) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 20) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 24) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 28) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 32) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 40) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 48) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 56) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 64) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 68) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 72) } static void test_pack_INTERNET_CERTIFICATE_INFOA(void) { /* INTERNET_CERTIFICATE_INFOA (pack 4) */ - TEST_TYPE(INTERNET_CERTIFICATE_INFOA, 40, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, FILETIME, ftExpiry, 0, 8, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, FILETIME, ftStart, 8, 8, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, LPSTR, lpszSubjectInfo, 16, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, LPSTR, lpszIssuerInfo, 20, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, LPSTR, lpszProtocolName, 24, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, LPSTR, lpszSignatureAlgName, 28, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, LPSTR, lpszEncryptionAlgName, 32, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOA, DWORD, dwKeySize, 36, 4, 4); + TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOA, 40) + TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOA, 4) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftExpiry, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, ftExpiry, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, ftExpiry, 0) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftStart, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, ftStart, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, ftStart, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 16) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 20) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 24) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 28) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 32) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, dwKeySize, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, dwKeySize, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, dwKeySize, 36) } static void test_pack_INTERNET_CERTIFICATE_INFOW(void) { /* INTERNET_CERTIFICATE_INFOW (pack 4) */ - TEST_TYPE(INTERNET_CERTIFICATE_INFOW, 40, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, FILETIME, ftExpiry, 0, 8, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, FILETIME, ftStart, 8, 8, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, LPWSTR, lpszSubjectInfo, 16, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, LPWSTR, lpszIssuerInfo, 20, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, LPWSTR, lpszProtocolName, 24, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, LPWSTR, lpszSignatureAlgName, 28, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, LPWSTR, lpszEncryptionAlgName, 32, 4, 4); - TEST_FIELD(INTERNET_CERTIFICATE_INFOW, DWORD, dwKeySize, 36, 4, 4); + TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOW, 40) + TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOW, 4) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftExpiry, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, ftExpiry, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, ftExpiry, 0) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftStart, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, ftStart, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, ftStart, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 16) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 20) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 24) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 28) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 32) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, dwKeySize, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, dwKeySize, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, dwKeySize, 36) } static void test_pack_INTERNET_CONNECTED_INFO(void) { /* INTERNET_CONNECTED_INFO (pack 4) */ - TEST_TYPE(INTERNET_CONNECTED_INFO, 8, 4); - TEST_FIELD(INTERNET_CONNECTED_INFO, DWORD, dwConnectedState, 0, 4, 4); - TEST_FIELD(INTERNET_CONNECTED_INFO, DWORD, dwFlags, 4, 4, 4); + TEST_TYPE_SIZE (INTERNET_CONNECTED_INFO, 8) + TEST_TYPE_ALIGN (INTERNET_CONNECTED_INFO, 4) + TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwConnectedState, 4) + TEST_FIELD_ALIGN (INTERNET_CONNECTED_INFO, dwConnectedState, 4) + TEST_FIELD_OFFSET(INTERNET_CONNECTED_INFO, dwConnectedState, 0) + TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwFlags, 4) + TEST_FIELD_ALIGN (INTERNET_CONNECTED_INFO, dwFlags, 4) + TEST_FIELD_OFFSET(INTERNET_CONNECTED_INFO, dwFlags, 4) } static void test_pack_INTERNET_PORT(void) { /* INTERNET_PORT */ - TEST_TYPE(INTERNET_PORT, 2, 2); - TEST_TYPE_UNSIGNED(INTERNET_PORT); + TEST_TYPE_SIZE (INTERNET_PORT, 2) + TEST_TYPE_ALIGN (INTERNET_PORT, 2) + TEST_TYPE_UNSIGNED(INTERNET_PORT) } static void test_pack_INTERNET_PROXY_INFOA(void) { /* INTERNET_PROXY_INFOA (pack 4) */ - TEST_TYPE(INTERNET_PROXY_INFOA, 12, 4); - TEST_FIELD(INTERNET_PROXY_INFOA, DWORD, dwAccessType, 0, 4, 4); - TEST_FIELD(INTERNET_PROXY_INFOA, LPCSTR, lpszProxy, 4, 4, 4); - TEST_FIELD(INTERNET_PROXY_INFOA, LPCSTR, lpszProxyBypass, 8, 4, 4); + TEST_TYPE_SIZE (INTERNET_PROXY_INFOA, 12) + TEST_TYPE_ALIGN (INTERNET_PROXY_INFOA, 4) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, dwAccessType, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, dwAccessType, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, dwAccessType, 0) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, lpszProxy, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, lpszProxy, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, lpszProxy, 4) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, lpszProxyBypass, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, lpszProxyBypass, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, lpszProxyBypass, 8) } static void test_pack_INTERNET_PROXY_INFOW(void) { /* INTERNET_PROXY_INFOW (pack 4) */ - TEST_TYPE(INTERNET_PROXY_INFOW, 12, 4); - TEST_FIELD(INTERNET_PROXY_INFOW, DWORD, dwAccessType, 0, 4, 4); - TEST_FIELD(INTERNET_PROXY_INFOW, LPCWSTR, lpszProxy, 4, 4, 4); - TEST_FIELD(INTERNET_PROXY_INFOW, LPCWSTR, lpszProxyBypass, 8, 4, 4); + TEST_TYPE_SIZE (INTERNET_PROXY_INFOW, 12) + TEST_TYPE_ALIGN (INTERNET_PROXY_INFOW, 4) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, dwAccessType, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, dwAccessType, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, dwAccessType, 0) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, lpszProxy, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, lpszProxy, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, lpszProxy, 4) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, lpszProxyBypass, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, lpszProxyBypass, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, lpszProxyBypass, 8) } static void test_pack_INTERNET_STATUS_CALLBACK(void) { /* INTERNET_STATUS_CALLBACK */ - TEST_TYPE(INTERNET_STATUS_CALLBACK, 4, 4); + TEST_TYPE_SIZE (INTERNET_STATUS_CALLBACK, 4) + TEST_TYPE_ALIGN (INTERNET_STATUS_CALLBACK, 4) } static void test_pack_INTERNET_VERSION_INFO(void) { /* INTERNET_VERSION_INFO (pack 4) */ - TEST_TYPE(INTERNET_VERSION_INFO, 8, 4); - TEST_FIELD(INTERNET_VERSION_INFO, DWORD, dwMajorVersion, 0, 4, 4); - TEST_FIELD(INTERNET_VERSION_INFO, DWORD, dwMinorVersion, 4, 4, 4); + TEST_TYPE_SIZE (INTERNET_VERSION_INFO, 8) + TEST_TYPE_ALIGN (INTERNET_VERSION_INFO, 4) + TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (INTERNET_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(INTERNET_VERSION_INFO, dwMajorVersion, 0) + TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (INTERNET_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(INTERNET_VERSION_INFO, dwMinorVersion, 4) } static void test_pack_LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_ADMIN_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_ADMIN_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_ASK_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_ASK_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_ASK_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_ASK_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_ASK_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_ASK_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_FIND_DATAA(void) { /* LPGOPHER_FIND_DATAA */ - TEST_TYPE(LPGOPHER_FIND_DATAA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_FIND_DATAA, 808, 4); + TEST_TYPE_SIZE (LPGOPHER_FIND_DATAA, 4) + TEST_TYPE_ALIGN (LPGOPHER_FIND_DATAA, 4) + TEST_TARGET_SIZE (LPGOPHER_FIND_DATAA, 808) + TEST_TARGET_ALIGN(LPGOPHER_FIND_DATAA, 4) } static void test_pack_LPGOPHER_FIND_DATAW(void) { /* LPGOPHER_FIND_DATAW */ - TEST_TYPE(LPGOPHER_FIND_DATAW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_FIND_DATAW, 1588, 4); + TEST_TYPE_SIZE (LPGOPHER_FIND_DATAW, 4) + TEST_TYPE_ALIGN (LPGOPHER_FIND_DATAW, 4) + TEST_TARGET_SIZE (LPGOPHER_FIND_DATAW, 1588) + TEST_TARGET_ALIGN(LPGOPHER_FIND_DATAW, 4) } static void test_pack_LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) { /* LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24, 4); + TEST_TYPE_SIZE (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) + TEST_TARGET_ALIGN(LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_LOCATION_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_LOCATION_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_ALIGN(LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_LOCATION_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_LOCATION_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_ALIGN(LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) { /* LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_ALIGN(LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_ALIGN(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_ALIGN(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_ALIGN(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_ALIGN(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_SCORE_ATTRIBUTE_TYPE(void) { /* LPGOPHER_SCORE_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) { /* LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8, 4); + TEST_TYPE_SIZE (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_ALIGN(LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_SITE_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_SITE_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_SITE_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_SITE_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_ALIGN(LPGOPHER_SITE_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_SITE_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_SITE_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_SITE_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_SITE_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_ALIGN(LPGOPHER_SITE_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) { /* LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_TTL_ATTRIBUTE_TYPE(void) { /* LPGOPHER_TTL_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_TTL_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_TTL_ATTRIBUTE_TYPE, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_ALIGN(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_ALIGN(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_VERONICA_ATTRIBUTE_TYPE(void) { /* LPGOPHER_VERONICA_ATTRIBUTE_TYPE */ - TEST_TYPE(LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TARGET_SIZE (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) } static void test_pack_LPGOPHER_VERSION_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_VERSION_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_ALIGN(LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_VERSION_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_VERSION_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 4, 4); + TEST_TYPE_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_ALIGN(LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPGOPHER_VIEW_ATTRIBUTE_TYPEA(void) { /* LPGOPHER_VIEW_ATTRIBUTE_TYPEA */ - TEST_TYPE(LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 12, 4); + TEST_TYPE_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 4) + TEST_TYPE_ALIGN (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 4) + TEST_TARGET_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 12) + TEST_TARGET_ALIGN(LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 4) } static void test_pack_LPGOPHER_VIEW_ATTRIBUTE_TYPEW(void) { /* LPGOPHER_VIEW_ATTRIBUTE_TYPEW */ - TEST_TYPE(LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 4, 4); - TEST_TYPE_POINTER(LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 12, 4); + TEST_TYPE_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 4) + TEST_TYPE_ALIGN (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 4) + TEST_TARGET_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 12) + TEST_TARGET_ALIGN(LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 4) } static void test_pack_LPHINTERNET(void) { /* LPHINTERNET */ - TEST_TYPE(LPHINTERNET, 4, 4); - TEST_TYPE_POINTER(LPHINTERNET, 4, 4); + TEST_TYPE_SIZE (LPHINTERNET, 4) + TEST_TYPE_ALIGN (LPHINTERNET, 4) + TEST_TARGET_SIZE (LPHINTERNET, 4) + TEST_TARGET_ALIGN(LPHINTERNET, 4) } static void test_pack_LPHTTP_VERSION_INFO(void) { /* LPHTTP_VERSION_INFO */ - TEST_TYPE(LPHTTP_VERSION_INFO, 4, 4); - TEST_TYPE_POINTER(LPHTTP_VERSION_INFO, 8, 4); + TEST_TYPE_SIZE (LPHTTP_VERSION_INFO, 4) + TEST_TYPE_ALIGN (LPHTTP_VERSION_INFO, 4) + TEST_TARGET_SIZE (LPHTTP_VERSION_INFO, 8) + TEST_TARGET_ALIGN(LPHTTP_VERSION_INFO, 4) } static void test_pack_LPINTERNET_ASYNC_RESULT(void) { /* LPINTERNET_ASYNC_RESULT */ - TEST_TYPE(LPINTERNET_ASYNC_RESULT, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_ASYNC_RESULT, 8, 4); + TEST_TYPE_SIZE (LPINTERNET_ASYNC_RESULT, 4) + TEST_TYPE_ALIGN (LPINTERNET_ASYNC_RESULT, 4) + TEST_TARGET_SIZE (LPINTERNET_ASYNC_RESULT, 8) + TEST_TARGET_ALIGN(LPINTERNET_ASYNC_RESULT, 4) } static void test_pack_LPINTERNET_BUFFERSA(void) { /* LPINTERNET_BUFFERSA */ - TEST_TYPE(LPINTERNET_BUFFERSA, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_BUFFERSA, 40, 4); + TEST_TYPE_SIZE (LPINTERNET_BUFFERSA, 4) + TEST_TYPE_ALIGN (LPINTERNET_BUFFERSA, 4) + TEST_TARGET_SIZE (LPINTERNET_BUFFERSA, 40) + TEST_TARGET_ALIGN(LPINTERNET_BUFFERSA, 4) } static void test_pack_LPINTERNET_BUFFERSW(void) { /* LPINTERNET_BUFFERSW */ - TEST_TYPE(LPINTERNET_BUFFERSW, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_BUFFERSW, 40, 4); + TEST_TYPE_SIZE (LPINTERNET_BUFFERSW, 4) + TEST_TYPE_ALIGN (LPINTERNET_BUFFERSW, 4) + TEST_TARGET_SIZE (LPINTERNET_BUFFERSW, 40) + TEST_TARGET_ALIGN(LPINTERNET_BUFFERSW, 4) } static void test_pack_LPINTERNET_CACHE_ENTRY_INFOA(void) { /* LPINTERNET_CACHE_ENTRY_INFOA */ - TEST_TYPE(LPINTERNET_CACHE_ENTRY_INFOA, 4, 4); + TEST_TYPE_SIZE (LPINTERNET_CACHE_ENTRY_INFOA, 4) + TEST_TYPE_ALIGN (LPINTERNET_CACHE_ENTRY_INFOA, 4) } static void test_pack_LPINTERNET_CACHE_ENTRY_INFOW(void) { /* LPINTERNET_CACHE_ENTRY_INFOW */ - TEST_TYPE(LPINTERNET_CACHE_ENTRY_INFOW, 4, 4); + TEST_TYPE_SIZE (LPINTERNET_CACHE_ENTRY_INFOW, 4) + TEST_TYPE_ALIGN (LPINTERNET_CACHE_ENTRY_INFOW, 4) } static void test_pack_LPINTERNET_CERTIFICATE_INFOA(void) { /* LPINTERNET_CERTIFICATE_INFOA */ - TEST_TYPE(LPINTERNET_CERTIFICATE_INFOA, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_CERTIFICATE_INFOA, 40, 4); + TEST_TYPE_SIZE (LPINTERNET_CERTIFICATE_INFOA, 4) + TEST_TYPE_ALIGN (LPINTERNET_CERTIFICATE_INFOA, 4) + TEST_TARGET_SIZE (LPINTERNET_CERTIFICATE_INFOA, 40) + TEST_TARGET_ALIGN(LPINTERNET_CERTIFICATE_INFOA, 4) } static void test_pack_LPINTERNET_CERTIFICATE_INFOW(void) { /* LPINTERNET_CERTIFICATE_INFOW */ - TEST_TYPE(LPINTERNET_CERTIFICATE_INFOW, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_CERTIFICATE_INFOW, 40, 4); + TEST_TYPE_SIZE (LPINTERNET_CERTIFICATE_INFOW, 4) + TEST_TYPE_ALIGN (LPINTERNET_CERTIFICATE_INFOW, 4) + TEST_TARGET_SIZE (LPINTERNET_CERTIFICATE_INFOW, 40) + TEST_TARGET_ALIGN(LPINTERNET_CERTIFICATE_INFOW, 4) } static void test_pack_LPINTERNET_CONNECTED_INFO(void) { /* LPINTERNET_CONNECTED_INFO */ - TEST_TYPE(LPINTERNET_CONNECTED_INFO, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_CONNECTED_INFO, 8, 4); + TEST_TYPE_SIZE (LPINTERNET_CONNECTED_INFO, 4) + TEST_TYPE_ALIGN (LPINTERNET_CONNECTED_INFO, 4) + TEST_TARGET_SIZE (LPINTERNET_CONNECTED_INFO, 8) + TEST_TARGET_ALIGN(LPINTERNET_CONNECTED_INFO, 4) } static void test_pack_LPINTERNET_PORT(void) { /* LPINTERNET_PORT */ - TEST_TYPE(LPINTERNET_PORT, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_PORT, 2, 2); + TEST_TYPE_SIZE (LPINTERNET_PORT, 4) + TEST_TYPE_ALIGN (LPINTERNET_PORT, 4) + TEST_TARGET_SIZE (LPINTERNET_PORT, 2) + TEST_TARGET_ALIGN(LPINTERNET_PORT, 2) } static void test_pack_LPINTERNET_PROXY_INFOA(void) { /* LPINTERNET_PROXY_INFOA */ - TEST_TYPE(LPINTERNET_PROXY_INFOA, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_PROXY_INFOA, 12, 4); + TEST_TYPE_SIZE (LPINTERNET_PROXY_INFOA, 4) + TEST_TYPE_ALIGN (LPINTERNET_PROXY_INFOA, 4) + TEST_TARGET_SIZE (LPINTERNET_PROXY_INFOA, 12) + TEST_TARGET_ALIGN(LPINTERNET_PROXY_INFOA, 4) } static void test_pack_LPINTERNET_PROXY_INFOW(void) { /* LPINTERNET_PROXY_INFOW */ - TEST_TYPE(LPINTERNET_PROXY_INFOW, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_PROXY_INFOW, 12, 4); + TEST_TYPE_SIZE (LPINTERNET_PROXY_INFOW, 4) + TEST_TYPE_ALIGN (LPINTERNET_PROXY_INFOW, 4) + TEST_TARGET_SIZE (LPINTERNET_PROXY_INFOW, 12) + TEST_TARGET_ALIGN(LPINTERNET_PROXY_INFOW, 4) } static void test_pack_LPINTERNET_STATUS_CALLBACK(void) { /* LPINTERNET_STATUS_CALLBACK */ - TEST_TYPE(LPINTERNET_STATUS_CALLBACK, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_STATUS_CALLBACK, 4, 4); + TEST_TYPE_SIZE (LPINTERNET_STATUS_CALLBACK, 4) + TEST_TYPE_ALIGN (LPINTERNET_STATUS_CALLBACK, 4) + TEST_TARGET_SIZE (LPINTERNET_STATUS_CALLBACK, 4) + TEST_TARGET_ALIGN(LPINTERNET_STATUS_CALLBACK, 4) } static void test_pack_LPINTERNET_VERSION_INFO(void) { /* LPINTERNET_VERSION_INFO */ - TEST_TYPE(LPINTERNET_VERSION_INFO, 4, 4); - TEST_TYPE_POINTER(LPINTERNET_VERSION_INFO, 8, 4); + TEST_TYPE_SIZE (LPINTERNET_VERSION_INFO, 4) + TEST_TYPE_ALIGN (LPINTERNET_VERSION_INFO, 4) + TEST_TARGET_SIZE (LPINTERNET_VERSION_INFO, 8) + TEST_TARGET_ALIGN(LPINTERNET_VERSION_INFO, 4) } static void test_pack_LPURL_COMPONENTSA(void) { /* LPURL_COMPONENTSA */ - TEST_TYPE(LPURL_COMPONENTSA, 4, 4); + TEST_TYPE_SIZE (LPURL_COMPONENTSA, 4) + TEST_TYPE_ALIGN (LPURL_COMPONENTSA, 4) } static void test_pack_LPURL_COMPONENTSW(void) { /* LPURL_COMPONENTSW */ - TEST_TYPE(LPURL_COMPONENTSW, 4, 4); + TEST_TYPE_SIZE (LPURL_COMPONENTSW, 4) + TEST_TYPE_ALIGN (LPURL_COMPONENTSW, 4) } static void test_pack_PFN_AUTH_NOTIFY(void) { /* PFN_AUTH_NOTIFY */ - TEST_TYPE(PFN_AUTH_NOTIFY, 4, 4); + TEST_TYPE_SIZE (PFN_AUTH_NOTIFY, 4) + TEST_TYPE_ALIGN (PFN_AUTH_NOTIFY, 4) } static void test_pack_PFN_DIAL_HANDLER(void) { /* PFN_DIAL_HANDLER */ - TEST_TYPE(PFN_DIAL_HANDLER, 4, 4); + TEST_TYPE_SIZE (PFN_DIAL_HANDLER, 4) + TEST_TYPE_ALIGN (PFN_DIAL_HANDLER, 4) } static void test_pack_URL_COMPONENTSA(void) { /* URL_COMPONENTSA (pack 4) */ - TEST_FIELD(URL_COMPONENTSA, DWORD, dwStructSize, 0, 4, 4); - TEST_FIELD(URL_COMPONENTSA, LPSTR, lpszScheme, 4, 4, 4); - TEST_FIELD(URL_COMPONENTSA, DWORD, dwSchemeLength, 8, 4, 4); + TEST_FIELD_SIZE (URL_COMPONENTSA, dwStructSize, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, dwStructSize, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, dwStructSize, 0) + TEST_FIELD_SIZE (URL_COMPONENTSA, lpszScheme, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, lpszScheme, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, lpszScheme, 4) + TEST_FIELD_SIZE (URL_COMPONENTSA, dwSchemeLength, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, dwSchemeLength, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, dwSchemeLength, 8) } static void test_pack_URL_COMPONENTSW(void) { /* URL_COMPONENTSW (pack 4) */ - TEST_FIELD(URL_COMPONENTSW, DWORD, dwStructSize, 0, 4, 4); - TEST_FIELD(URL_COMPONENTSW, LPWSTR, lpszScheme, 4, 4, 4); - TEST_FIELD(URL_COMPONENTSW, DWORD, dwSchemeLength, 8, 4, 4); + TEST_FIELD_SIZE (URL_COMPONENTSW, dwStructSize, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, dwStructSize, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, dwStructSize, 0) + TEST_FIELD_SIZE (URL_COMPONENTSW, lpszScheme, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, lpszScheme, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, lpszScheme, 4) + TEST_FIELD_SIZE (URL_COMPONENTSW, dwSchemeLength, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, dwSchemeLength, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, dwSchemeLength, 8) } static void test_pack(void) @@ -1024,5 +1434,9 @@ static void test_pack(void) START_TEST(generated) { +#ifdef _WIN64 + ok(0, "The type size / alignment tests don't support Win64 yet\n"); +#else test_pack(); +#endif } diff --git a/rostests/winetests/wininet/http.c b/rostests/winetests/wininet/http.c index 705fcac6020..5fd45d5d069 100644 --- a/rostests/winetests/wininet/http.c +++ b/rostests/winetests/wininet/http.c @@ -31,7 +31,7 @@ #include "wine/test.h" -#define TEST_URL "http://www.winehq.org/site/about" +#define TEST_URL "http://test.winehq.org/hello.html" static BOOL first_connection_to_test_url = TRUE; @@ -43,6 +43,12 @@ static BOOL first_connection_to_test_url = TRUE; #define SET_EXPECT(status) \ SET_EXPECT2(status, 1) +#define SET_OPTIONAL2(status, num) \ + optional[status] = num + +#define SET_OPTIONAL(status) \ + SET_OPTIONAL2(status, 1) + /* SET_WINE_ALLOW's should be used with an appropriate * todo_wine CHECK_NOTIFIED at a later point in the code */ #define SET_WINE_ALLOW2(status, num) \ @@ -53,7 +59,7 @@ static BOOL first_connection_to_test_url = TRUE; #define CHECK_EXPECT(status) \ do { \ - if (!expect[status] && wine_allow[status]) \ + if (!expect[status] && !optional[status] && wine_allow[status]) \ { \ todo_wine ok(expect[status], "unexpected status %d (%s)\n", status, \ status < MAX_INTERNET_STATUS && status_string[status][0] != 0 ? \ @@ -62,10 +68,11 @@ static BOOL first_connection_to_test_url = TRUE; } \ else \ { \ - ok(expect[status], "unexpected status %d (%s)\n", status, \ + ok(expect[status] || optional[status], "unexpected status %d (%s)\n", status, \ status < MAX_INTERNET_STATUS && status_string[status][0] != 0 ? \ status_string[status] : "unknown"); \ - expect[status]--; \ + if (expect[status]) expect[status]--; \ + else optional[status]--; \ } \ notified[status]++; \ }while(0) @@ -73,7 +80,7 @@ static BOOL first_connection_to_test_url = TRUE; /* CLEAR_NOTIFIED used in cases when notification behavior * differs between Windows versions */ #define CLEAR_NOTIFIED(status) \ - expect[status] = wine_allow[status] = notified[status] = 0; + expect[status] = optional[status] = wine_allow[status] = notified[status] = 0; #define CHECK_NOTIFIED2(status, num) \ do { \ @@ -91,17 +98,13 @@ static BOOL first_connection_to_test_url = TRUE; #define MAX_INTERNET_STATUS (INTERNET_STATUS_COOKIE_HISTORY+1) #define MAX_STATUS_NAME 50 -static int expect[MAX_INTERNET_STATUS], wine_allow[MAX_INTERNET_STATUS], - notified[MAX_INTERNET_STATUS]; +static int expect[MAX_INTERNET_STATUS], optional[MAX_INTERNET_STATUS], + wine_allow[MAX_INTERNET_STATUS], notified[MAX_INTERNET_STATUS]; static CHAR status_string[MAX_INTERNET_STATUS][MAX_STATUS_NAME]; static HANDLE hCompleteEvent; static INTERNET_STATUS_CALLBACK (WINAPI *pInternetSetStatusCallbackA)(HINTERNET ,INTERNET_STATUS_CALLBACK); -static BOOL (WINAPI *pInternetTimeFromSystemTimeA)(CONST SYSTEMTIME *,DWORD ,LPSTR ,DWORD); -static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(CONST SYSTEMTIME *,DWORD ,LPWSTR ,DWORD); -static BOOL (WINAPI *pInternetTimeToSystemTimeA)(LPCSTR ,SYSTEMTIME *,DWORD); -static BOOL (WINAPI *pInternetTimeToSystemTimeW)(LPCWSTR ,SYSTEMTIME *,DWORD); static VOID WINAPI callback( @@ -238,7 +241,6 @@ static VOID WINAPI callback( static void InternetReadFile_test(int flags) { BOOL res; - DWORD rc; CHAR buffer[4000]; DWORD length; DWORD out; @@ -261,7 +263,7 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); trace("InternetConnectA <--\n"); - hic=InternetConnectA(hi, "www.winehq.org", INTERNET_INVALID_PORT_NUMBER, + hic=InternetConnectA(hi, "test.winehq.org", INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); ok((hic != 0x0),"InternetConnect failed with error %u\n", GetLastError()); trace("InternetConnectA -->\n"); @@ -270,11 +272,9 @@ static void InternetReadFile_test(int flags) CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); - SET_WINE_ALLOW(INTERNET_STATUS_RESOLVING_NAME); - SET_WINE_ALLOW(INTERNET_STATUS_NAME_RESOLVED); trace("HttpOpenRequestA <--\n"); - hor = HttpOpenRequestA(hic, "GET", "/about/", NULL, NULL, types, + hor = HttpOpenRequestA(hic, "GET", "/testredirect", NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RESYNCHRONIZE, 0xdeadbead); if (hor == 0x0 && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { @@ -294,23 +294,28 @@ static void InternetReadFile_test(int flags) length = sizeof(buffer); res = InternetQueryOptionA(hor, INTERNET_OPTION_URL, buffer, &length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "http://www.winehq.org/about/"), "Wrong URL %s\n", buffer); + ok(!strcmp(buffer, "http://test.winehq.org/testredirect"), "Wrong URL %s\n", buffer); + + length = sizeof(buffer); + res = HttpQueryInfoA(hor, HTTP_QUERY_RAW_HEADERS, buffer, &length, 0x0); + ok(res, "HttpQueryInfoA(HTTP_QUERY_RAW_HEADERS) failed with error %d\n", GetLastError()); + ok(length == 0, "HTTP_QUERY_RAW_HEADERS: expected length 0, but got %d\n", length); + ok(!strcmp(buffer, ""), "HTTP_QUERY_RAW_HEADERS: expected string \"\", but got \"%s\"\n", buffer); CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); - todo_wine - { - CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); - CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); - } + CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); + CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); if (first_connection_to_test_url) { SET_EXPECT(INTERNET_STATUS_RESOLVING_NAME); SET_EXPECT(INTERNET_STATUS_NAME_RESOLVED); + SET_WINE_ALLOW(INTERNET_STATUS_RESOLVING_NAME); + SET_WINE_ALLOW(INTERNET_STATUS_NAME_RESOLVED); } else { - SET_WINE_ALLOW(INTERNET_STATUS_RESOLVING_NAME); - SET_WINE_ALLOW(INTERNET_STATUS_NAME_RESOLVED); + SET_WINE_ALLOW2(INTERNET_STATUS_RESOLVING_NAME,2); + SET_WINE_ALLOW2(INTERNET_STATUS_NAME_RESOLVED,2); } SET_WINE_ALLOW(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); @@ -320,7 +325,11 @@ static void InternetReadFile_test(int flags) SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, 2); SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); + SET_OPTIONAL2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + SET_OPTIONAL2(INTERNET_STATUS_CONNECTION_CLOSED, 2); SET_EXPECT(INTERNET_STATUS_REDIRECT); + SET_OPTIONAL(INTERNET_STATUS_CONNECTING_TO_SERVER); + SET_OPTIONAL(INTERNET_STATUS_CONNECTED_TO_SERVER); if (flags & INTERNET_FLAG_ASYNC) SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); else @@ -328,24 +337,24 @@ static void InternetReadFile_test(int flags) trace("HttpSendRequestA -->\n"); SetLastError(0xdeadbeef); - rc = HttpSendRequestA(hor, "", -1, NULL, 0); + res = HttpSendRequestA(hor, "", -1, NULL, 0); if (flags & INTERNET_FLAG_ASYNC) - ok(((rc == 0)&&(GetLastError() == ERROR_IO_PENDING)), + ok(!res && (GetLastError() == ERROR_IO_PENDING), "Asynchronous HttpSendRequest NOT returning 0 with error ERROR_IO_PENDING\n"); else - ok((rc != 0) || GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED, + ok(res || (GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED), "Synchronous HttpSendRequest returning 0, error %u\n", GetLastError()); trace("HttpSendRequestA <--\n"); if (flags & INTERNET_FLAG_ASYNC) WaitForSingleObject(hCompleteEvent, INFINITE); - if (first_connection_to_test_url) + todo_wine if (first_connection_to_test_url) { CHECK_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); } - else todo_wine + else { CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); @@ -358,41 +367,41 @@ static void InternetReadFile_test(int flags) if (flags & INTERNET_FLAG_ASYNC) CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); else - todo_wine CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); + CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); /* Sent on WinXP only if first_connection_to_test_url is TRUE, on Win98 always sent */ CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER); CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER); length = 4; - rc = InternetQueryOptionA(hor,INTERNET_OPTION_REQUEST_FLAGS,&out,&length); - trace("Option 0x17 -> %i %i\n",rc,out); + res = InternetQueryOptionA(hor,INTERNET_OPTION_REQUEST_FLAGS,&out,&length); + ok(res, "InternetQueryOptionA(INTERNET_OPTION_REQUEST) failed with error %d\n", GetLastError()); length = 100; - rc = InternetQueryOptionA(hor,INTERNET_OPTION_URL,buffer,&length); - trace("Option 0x22 -> %i %s\n",rc,buffer); + res = InternetQueryOptionA(hor,INTERNET_OPTION_URL,buffer,&length); + ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed with error %d\n", GetLastError()); - length = 4000; - rc = HttpQueryInfoA(hor,HTTP_QUERY_RAW_HEADERS,buffer,&length,0x0); + length = sizeof(buffer); + res = HttpQueryInfoA(hor,HTTP_QUERY_RAW_HEADERS,buffer,&length,0x0); + ok(res, "HttpQueryInfoA(HTTP_QUERY_RAW_HEADERS) failed with error %d\n", GetLastError()); buffer[length]=0; - trace("Option 0x16 -> %i %s\n",rc,buffer); length = sizeof(buffer); res = InternetQueryOptionA(hor, INTERNET_OPTION_URL, buffer, &length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "http://www.winehq.org/site/about"), "Wrong URL %s\n", buffer); + ok(!strcmp(buffer, "http://test.winehq.org/hello.html"), "Wrong URL %s\n", buffer); length = 16; - rc = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_LENGTH,&buffer,&length,0x0); - trace("Option 0x5 -> %i %s (%u)\n",rc,buffer,GetLastError()); + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_LENGTH,&buffer,&length,0x0); + trace("Option 0x5 -> %i %s (%u)\n",res,buffer,GetLastError()); length = 100; - rc = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_TYPE,buffer,&length,0x0); + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_TYPE,buffer,&length,0x0); buffer[length]=0; - trace("Option 0x1 -> %i %s\n",rc,buffer); + trace("Option 0x1 -> %i %s\n",res,buffer); SetLastError(0xdeadbeef); - rc = InternetReadFile(NULL, buffer, 100, &length); - ok(!rc, "InternetReadFile should have failed\n"); + res = InternetReadFile(NULL, buffer, 100, &length); + ok(!res, "InternetReadFile should have failed\n"); ok(GetLastError() == ERROR_INVALID_HANDLE, "InternetReadFile should have set last error to ERROR_INVALID_HANDLE instead of %u\n", GetLastError()); @@ -400,19 +409,17 @@ static void InternetReadFile_test(int flags) length = 100; trace("Entering Query loop\n"); - SET_EXPECT(INTERNET_STATUS_CLOSING_CONNECTION); - SET_EXPECT(INTERNET_STATUS_CONNECTION_CLOSED); while (TRUE) { if (flags & INTERNET_FLAG_ASYNC) SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); - rc = InternetQueryDataAvailable(hor,&length,0x0,0x0); - ok(!(rc == 0 && length != 0),"InternetQueryDataAvailable failed with non-zero length\n"); - ok(rc != 0 || ((flags & INTERNET_FLAG_ASYNC) && GetLastError() == ERROR_IO_PENDING), + res = InternetQueryDataAvailable(hor,&length,0x0,0x0); + ok(!(!res && length != 0),"InternetQueryDataAvailable failed with non-zero length\n"); + ok(res || ((flags & INTERNET_FLAG_ASYNC) && GetLastError() == ERROR_IO_PENDING), "InternetQueryDataAvailable failed, error %d\n", GetLastError()); if (flags & INTERNET_FLAG_ASYNC) { - if (rc != 0) + if (res) { CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); } @@ -428,31 +435,32 @@ static void InternetReadFile_test(int flags) char *buffer; buffer = HeapAlloc(GetProcessHeap(),0,length+1); - rc = InternetReadFile(hor,buffer,length,&length); + res = InternetReadFile(hor,buffer,length,&length); buffer[length]=0; - trace("ReadFile -> %i %i\n",rc,length); + trace("ReadFile -> %s %i\n",res?"TRUE":"FALSE",length); HeapFree(GetProcessHeap(),0,buffer); } if (length == 0) break; } - /* WinXP does not send, but Win98 does */ - CLEAR_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); - CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); + todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); abort: + trace("aborting\n"); SET_EXPECT2(INTERNET_STATUS_HANDLE_CLOSING, (hor != 0x0) + (hic != 0x0)); if (hor != 0x0) { SET_WINE_ALLOW(INTERNET_STATUS_CLOSING_CONNECTION); SET_WINE_ALLOW(INTERNET_STATUS_CONNECTION_CLOSED); SetLastError(0xdeadbeef); - rc = InternetCloseHandle(hor); - ok ((rc != 0), "InternetCloseHandle of handle opened by HttpOpenRequestA failed\n"); + trace("closing\n"); + res = InternetCloseHandle(hor); + ok (res, "InternetCloseHandle of handle opened by HttpOpenRequestA failed\n"); SetLastError(0xdeadbeef); - rc = InternetCloseHandle(hor); - ok ((rc == 0), "Double close of handle opened by HttpOpenRequestA succeeded\n"); + res = InternetCloseHandle(hor); + ok (!res, "Double close of handle opened by HttpOpenRequestA succeeded\n"); ok (GetLastError() == ERROR_INVALID_HANDLE, "Double close of handle should have set ERROR_INVALID_HANDLE instead of %u\n", GetLastError()); @@ -463,8 +471,9 @@ abort: * INTERNET_STATUS_HANDLE_CLOSING notifications matches the number expected. */ if (hi != 0x0) { SET_WINE_ALLOW(INTERNET_STATUS_HANDLE_CLOSING); - rc = InternetCloseHandle(hi); - ok ((rc != 0), "InternetCloseHandle of handle opened by InternetOpenA failed\n"); + trace("closing 2\n"); + res = InternetCloseHandle(hi); + ok (res, "InternetCloseHandle of handle opened by InternetOpenA failed\n"); if (flags & INTERNET_FLAG_ASYNC) Sleep(100); } @@ -507,7 +516,7 @@ static void InternetReadFileExA_test(int flags) SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); trace("InternetConnectA <--\n"); - hic=InternetConnectA(hi, "www.winehq.org", INTERNET_INVALID_PORT_NUMBER, + hic=InternetConnectA(hi, "test.winehq.org", INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); ok((hic != 0x0),"InternetConnect failed with error %u\n", GetLastError()); trace("InternetConnectA -->\n"); @@ -516,11 +525,9 @@ static void InternetReadFileExA_test(int flags) CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); - SET_WINE_ALLOW(INTERNET_STATUS_RESOLVING_NAME); - SET_WINE_ALLOW(INTERNET_STATUS_NAME_RESOLVED); trace("HttpOpenRequestA <--\n"); - hor = HttpOpenRequestA(hic, "GET", "/about/", NULL, NULL, types, + hor = HttpOpenRequestA(hic, "GET", "/testredirect", NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RESYNCHRONIZE, 0xdeadbead); if (hor == 0x0 && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { @@ -538,20 +545,19 @@ static void InternetReadFileExA_test(int flags) if (hor == 0x0) goto abort; CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); - todo_wine - { - CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); - CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); - } + CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); + CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); if (first_connection_to_test_url) { SET_EXPECT(INTERNET_STATUS_RESOLVING_NAME); SET_EXPECT(INTERNET_STATUS_NAME_RESOLVED); + SET_WINE_ALLOW(INTERNET_STATUS_RESOLVING_NAME); + SET_WINE_ALLOW(INTERNET_STATUS_NAME_RESOLVED); } else { - SET_WINE_ALLOW(INTERNET_STATUS_RESOLVING_NAME); - SET_WINE_ALLOW(INTERNET_STATUS_NAME_RESOLVED); + SET_WINE_ALLOW2(INTERNET_STATUS_RESOLVING_NAME,2); + SET_WINE_ALLOW2(INTERNET_STATUS_NAME_RESOLVED,2); } SET_WINE_ALLOW(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); @@ -561,7 +567,11 @@ static void InternetReadFileExA_test(int flags) SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, 2); SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); + SET_EXPECT2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + SET_EXPECT2(INTERNET_STATUS_CONNECTION_CLOSED, 2); SET_EXPECT(INTERNET_STATUS_REDIRECT); + SET_OPTIONAL(INTERNET_STATUS_CONNECTING_TO_SERVER); + SET_OPTIONAL(INTERNET_STATUS_CONNECTED_TO_SERVER); if (flags & INTERNET_FLAG_ASYNC) SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); else @@ -595,6 +605,8 @@ static void InternetReadFileExA_test(int flags) CHECK_NOTIFIED2(INTERNET_STATUS_REQUEST_SENT, 2); CHECK_NOTIFIED2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); CHECK_NOTIFIED2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); + todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + todo_wine CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); CHECK_NOTIFIED(INTERNET_STATUS_REDIRECT); if (flags & INTERNET_FLAG_ASYNC) CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); @@ -626,10 +638,13 @@ static void InternetReadFileExA_test(int flags) inetbuffers.lpvBuffer = NULL; inetbuffers.dwOffsetHigh = 1234; inetbuffers.dwOffsetLow = 5678; - SET_WINE_ALLOW(INTERNET_STATUS_RECEIVING_RESPONSE); - SET_WINE_ALLOW(INTERNET_STATUS_RESPONSE_RECEIVED); + SET_EXPECT(INTERNET_STATUS_RECEIVING_RESPONSE); + SET_EXPECT(INTERNET_STATUS_RESPONSE_RECEIVED); + SET_EXPECT(INTERNET_STATUS_CLOSING_CONNECTION); + SET_EXPECT(INTERNET_STATUS_CONNECTION_CLOSED); rc = InternetReadFileEx(hor, &inetbuffers, 0, 0xdeadcafe); ok(rc, "InternetReadFileEx failed with error %u\n", GetLastError()); + trace("read %i bytes\n", inetbuffers.dwBufferLength); todo_wine { CHECK_NOT_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); @@ -654,9 +669,11 @@ static void InternetReadFileExA_test(int flags) inetbuffers.dwOffsetHigh = 1234; inetbuffers.dwOffsetLow = 5678; - SET_EXPECT(INTERNET_STATUS_RECEIVING_RESPONSE); + SET_WINE_ALLOW(INTERNET_STATUS_RECEIVING_RESPONSE); + SET_WINE_ALLOW(INTERNET_STATUS_RESPONSE_RECEIVED); + SET_EXPECT(INTERNET_STATUS_CLOSING_CONNECTION); + SET_EXPECT(INTERNET_STATUS_CONNECTION_CLOSED); SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); - SET_EXPECT(INTERNET_STATUS_RESPONSE_RECEIVED); rc = InternetReadFileExA(hor, &inetbuffers, IRF_ASYNC | IRF_USE_CONTEXT, 0xcafebabe); if (!rc) { @@ -682,8 +699,10 @@ static void InternetReadFileExA_test(int flags) CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); if (inetbuffers.dwBufferLength) { - CHECK_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); - CHECK_NOTIFIED(INTERNET_STATUS_RESPONSE_RECEIVED); + todo_wine { + CHECK_NOT_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); + CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESPONSE_RECEIVED); + } } else { @@ -735,16 +754,8 @@ abort: Sleep(100); CHECK_NOTIFIED2(INTERNET_STATUS_HANDLE_CLOSING, (hor != 0x0) + (hic != 0x0)); } - if (hor != 0x0) todo_wine - { - CHECK_NOT_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); - CHECK_NOT_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); - } - else - { - CHECK_NOT_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); - CHECK_NOT_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); - } + CHECK_NOT_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); + CHECK_NOT_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); CloseHandle(hCompleteEvent); first_connection_to_test_url = FALSE; } @@ -779,91 +790,6 @@ static void InternetOpenUrlA_test(void) InternetCloseHandle(myhinternet); } -static void InternetTimeFromSystemTimeA_test(void) -{ - BOOL ret; - static const SYSTEMTIME time = { 2005, 1, 5, 7, 12, 6, 35, 0 }; - char string[INTERNET_RFC1123_BUFSIZE]; - static const char expect[] = "Fri, 07 Jan 2005 12:06:35 GMT"; - - ret = pInternetTimeFromSystemTimeA( &time, INTERNET_RFC1123_FORMAT, string, sizeof(string) ); - ok( ret, "InternetTimeFromSystemTimeA failed (%u)\n", GetLastError() ); - - ok( !memcmp( string, expect, sizeof(expect) ), - "InternetTimeFromSystemTimeA failed (%u)\n", GetLastError() ); -} - -static void InternetTimeFromSystemTimeW_test(void) -{ - BOOL ret; - static const SYSTEMTIME time = { 2005, 1, 5, 7, 12, 6, 35, 0 }; - WCHAR string[INTERNET_RFC1123_BUFSIZE + 1]; - static const WCHAR expect[] = { 'F','r','i',',',' ','0','7',' ','J','a','n',' ','2','0','0','5',' ', - '1','2',':','0','6',':','3','5',' ','G','M','T',0 }; - - ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string, sizeof(string) ); - ok( ret, "InternetTimeFromSystemTimeW failed (%u)\n", GetLastError() ); - - ok( !memcmp( string, expect, sizeof(expect) ), - "InternetTimeFromSystemTimeW failed (%u)\n", GetLastError() ); -} - -static void InternetTimeToSystemTimeA_test(void) -{ - BOOL ret; - SYSTEMTIME time; - static const SYSTEMTIME expect = { 2005, 1, 5, 7, 12, 6, 35, 0 }; - static const char string[] = "Fri, 07 Jan 2005 12:06:35 GMT"; - static const char string2[] = " fri 7 jan 2005 12 06 35"; - - ret = pInternetTimeToSystemTimeA( string, &time, 0 ); - ok( ret, "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); - ok( !memcmp( &time, &expect, sizeof(expect) ), - "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeA( string2, &time, 0 ); - ok( ret, "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); - ok( !memcmp( &time, &expect, sizeof(expect) ), - "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); -} - -static void InternetTimeToSystemTimeW_test(void) -{ - BOOL ret; - SYSTEMTIME time; - static const SYSTEMTIME expect = { 2005, 1, 5, 7, 12, 6, 35, 0 }; - static const WCHAR string[] = { 'F','r','i',',',' ','0','7',' ','J','a','n',' ','2','0','0','5',' ', - '1','2',':','0','6',':','3','5',' ','G','M','T',0 }; - static const WCHAR string2[] = { ' ','f','r','i',' ','7',' ','j','a','n',' ','2','0','0','5',' ', - '1','2',' ','0','6',' ','3','5',0 }; - static const WCHAR string3[] = { 'F','r',0 }; - - ret = pInternetTimeToSystemTimeW( NULL, NULL, 0 ); - ok( !ret, "InternetTimeToSystemTimeW succeeded (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeW( NULL, &time, 0 ); - ok( !ret, "InternetTimeToSystemTimeW succeeded (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeW( string, NULL, 0 ); - ok( !ret, "InternetTimeToSystemTimeW succeeded (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeW( string, &time, 0 ); - ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeW( string, &time, 0 ); - ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); - ok( !memcmp( &time, &expect, sizeof(expect) ), - "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeW( string2, &time, 0 ); - ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); - ok( !memcmp( &time, &expect, sizeof(expect) ), - "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); - - ret = pInternetTimeToSystemTimeW( string3, &time, 0 ); - ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); -} - static void HttpSendRequestEx_test(void) { HINTERNET hSession; @@ -891,7 +817,7 @@ static void HttpSendRequestEx_test(void) NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); if (!hRequest && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { - trace( "Network unreachable, skipping test\n" ); + skip( "Network unreachable, skipping test\n" ); goto done; } ok( hRequest != NULL, "Failed to open request handle err %u\n", GetLastError()); @@ -951,14 +877,14 @@ static void InternetOpenRequest_test(void) ok(connect == NULL, "InternetConnectA should have failed\n"); ok(GetLastError() == ERROR_INVALID_PARAMETER, "InternetConnectA with blank server named should have failed with ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); - connect = InternetConnectA(session, "winehq.org", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, + connect = InternetConnectA(session, "test.winehq.org", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); - ok(connect != NULL, "Unable to connect to http://winehq.org with error %d\n", GetLastError()); + ok(connect != NULL, "Unable to connect to http://test.winehq.org with error %d\n", GetLastError()); request = HttpOpenRequestA(connect, NULL, "/", NULL, NULL, types, INTERNET_FLAG_NO_CACHE_WRITE, 0); if (!request && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { - trace( "Network unreachable, skipping test\n" ); + skip( "Network unreachable, skipping test\n" ); goto done; } ok(request != NULL, "Failed to open request handle err %u\n", GetLastError()); @@ -993,14 +919,14 @@ static void test_http_cache(void) session = InternetOpenA("Wine Regression Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ok(session != NULL ,"Unable to open Internet session\n"); - connect = InternetConnectA(session, "www.winehq.org", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, + connect = InternetConnectA(session, "test.winehq.org", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); - ok(connect != NULL, "Unable to connect to http://winehq.org with error %d\n", GetLastError()); + ok(connect != NULL, "Unable to connect to http://test.winehq.org with error %d\n", GetLastError()); - request = HttpOpenRequestA(connect, NULL, "/site/about", NULL, NULL, types, INTERNET_FLAG_NEED_FILE, 0); + request = HttpOpenRequestA(connect, NULL, "/hello.html", NULL, NULL, types, INTERNET_FLAG_NEED_FILE, 0); if (!request && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { - trace( "Network unreachable, skipping test\n" ); + skip( "Network unreachable, skipping test\n" ); ok(InternetCloseHandle(connect), "Close connect handle failed\n"); ok(InternetCloseHandle(session), "Close session handle failed\n"); @@ -1012,7 +938,7 @@ static void test_http_cache(void) size = sizeof(url); ret = InternetQueryOptionA(request, INTERNET_OPTION_URL, url, &size); ok(ret, "InternetQueryOptionA(INTERNET_OPTION_url) failed: %u\n", GetLastError()); - ok(!strcmp(url, "http://www.winehq.org/site/about"), "Wrong URL %s\n", url); + ok(!strcmp(url, "http://test.winehq.org/hello.html"), "Wrong URL %s\n", url); size = sizeof(file_name); ret = InternetQueryOptionA(request, INTERNET_OPTION_DATAFILE_NAME, file_name, &size); @@ -1031,26 +957,28 @@ static void test_http_cache(void) FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); file_size = GetFileSize(file, NULL); - ok(file_size == 0, "file size=%d\n", file_size); + todo_wine ok(file_size == 106, "file size = %u\n", file_size); + size = sizeof(buf); ret = InternetReadFile(request, buf, sizeof(buf), &size); ok(ret, "InternetReadFile failed: %u\n", GetLastError()); - ok(size == sizeof(buf), "size=%d\n", size); + ok(size == 100, "size = %u\n", size); file_size = GetFileSize(file, NULL); - ok(file_size == sizeof(buf), "file size=%d\n", file_size); + todo_wine ok(file_size == 106, "file size = %u\n", file_size); CloseHandle(file); ok(InternetCloseHandle(request), "Close request handle failed\n"); file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - ok(file == INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "GetLastError()=%u, expected ERROR_FILE_NOT_FOUND\n", GetLastError()); + todo_wine ok(file != INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); + CloseHandle(file); request = HttpOpenRequestA(connect, NULL, "/", NULL, NULL, types, INTERNET_FLAG_NO_CACHE_WRITE, 0); ok(request != NULL, "Failed to open request handle err %u\n", GetLastError()); + size = sizeof(file_name); ret = InternetQueryOptionA(request, INTERNET_OPTION_DATAFILE_NAME, file_name, &size); ok(!ret, "InternetQueryOptionA(INTERNET_OPTION_DATAFILE_NAME) succeeded\n"); ok(GetLastError() == ERROR_INTERNET_ITEM_NOT_FOUND, "GetLastError()=%u\n", GetLastError()); @@ -1061,17 +989,14 @@ static void test_http_cache(void) size = sizeof(file_name); ret = InternetQueryOptionA(request, INTERNET_OPTION_DATAFILE_NAME, file_name, &size); - ok(!ret, "InternetQueryOptionA(INTERNET_OPTION_DATAFILE_NAME) succeeded\n"); - ok(GetLastError() == ERROR_INTERNET_ITEM_NOT_FOUND, "GetLastError()=%u\n", GetLastError()); - ok(!size, "size = %d\n", size); + todo_wine ok(ret, "InternetQueryOptionA(INTERNET_OPTION_DATAFILE_NAME) failed %u\n", GetLastError()); file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - ok(file == INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "GetLastError()=%u, expected ERROR_FILE_NOT_FOUND\n", GetLastError()); + todo_wine ok(file != INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); + CloseHandle(file); ok(InternetCloseHandle(request), "Close request handle failed\n"); - ok(InternetCloseHandle(connect), "Close connect handle failed\n"); ok(InternetCloseHandle(session), "Close session handle failed\n"); } @@ -1082,7 +1007,9 @@ static void HttpHeaders_test(void) HINTERNET hConnect; HINTERNET hRequest; CHAR buffer[256]; + WCHAR wbuffer[256]; DWORD len = 256; + DWORD oldlen; DWORD index = 0; hSession = InternetOpen("Wine Regression Test", @@ -1096,7 +1023,7 @@ static void HttpHeaders_test(void) NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); if (!hRequest && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { - trace( "Network unreachable, skipping test\n" ); + skip( "Network unreachable, skipping test\n" ); goto done; } ok( hRequest != NULL, "Failed to open request handle\n"); @@ -1160,19 +1087,57 @@ static void HttpHeaders_test(void) ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected last error: %d\n", GetLastError()); ok(len > 40, "Invalid length (exp. more than 40, got %d)\n", len); ok(index == 0, "Index was incremented\n"); + oldlen = len; /* bytes; at least long enough to hold buffer & nul */ /* a working query */ index = 0; len = sizeof(buffer); + memset(buffer, 'x', sizeof(buffer)); ok(HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(len + sizeof(CHAR) <= oldlen, "Result longer than advertised\n"); + ok((len < sizeof(buffer)-sizeof(CHAR)) && (buffer[len/sizeof(CHAR)] == 0),"No NUL at end\n"); + ok(len == strlen(buffer) * sizeof(CHAR), "Length wrong\n"); /* what's in the middle differs between Wine and Windows so currently we check only the beginning and the end */ ok(strncmp(buffer, "POST /posttest.php HTTP/1", 25)==0, "Invalid beginning of headers string\n"); ok(strcmp(buffer + strlen(buffer) - 4, "\r\n\r\n")==0, "Invalid end of headers string\n"); ok(index == 0, "Index was incremented\n"); + /* Like above two tests, but for W version */ + index = 0; + len = 0; + SetLastError(0xdeadbeef); + ok(HttpQueryInfoW(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS, + NULL,&len,&index) == FALSE,"Query worked\n"); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Unexpected last error: %d\n", GetLastError()); + ok(len > 80, "Invalid length (exp. more than 80, got %d)\n", len); + ok(index == 0, "Index was incremented\n"); + oldlen = len; /* bytes; at least long enough to hold buffer & nul */ + + /* a working query */ + index = 0; + len = sizeof(wbuffer); + memset(wbuffer, 'x', sizeof(wbuffer)); + ok(HttpQueryInfoW(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF|HTTP_QUERY_FLAG_REQUEST_HEADERS, + wbuffer,&len,&index),"Unable to query header\n"); + ok(len + sizeof(WCHAR) <= oldlen, "Result longer than advertised\n"); + ok(len == lstrlenW(wbuffer) * sizeof(WCHAR), "Length wrong\n"); + ok((len < sizeof(wbuffer)-sizeof(WCHAR)) && (wbuffer[len/sizeof(WCHAR)] == 0),"No NUL at end\n"); + ok(index == 0, "Index was incremented\n"); + + /* end of W version tests */ + + /* Without HTTP_QUERY_FLAG_REQUEST_HEADERS */ + index = 0; + len = sizeof(buffer); + memset(buffer, 'x', sizeof(buffer)); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_RAW_HEADERS_CRLF, + buffer,&len,&index) == TRUE,"Query failed\n"); + ok(len == 2, "Expected 2, got %d\n", len); + ok(strcmp(buffer, "\r\n") == 0, "Expected CRLF, got '%s'\n", buffer); + ok(index == 0, "Index was incremented\n"); ok(HttpAddRequestHeaders(hRequest,"Warning:test2",-1,HTTP_ADDREQ_FLAG_ADD), "Failed to add duplicate header using HTTP_ADDREQ_FLAG_ADD\n"); @@ -1319,6 +1284,15 @@ static const char okmsg[] = "Server: winetest\r\n" "\r\n"; +static const char okmsg2[] = +"HTTP/1.1 200 OK\r\n" +"Date: Mon, 01 Dec 2008 13:44:34 GMT\r\n" +"Server: winetest\r\n" +"Content-Length: 0\r\n" +"Set-Cookie: one\r\n" +"Set-Cookie: two\r\n" +"\r\n"; + static const char notokmsg[] = "HTTP/1.1 400 Bad Request\r\n" "Server: winetest\r\n" @@ -1327,6 +1301,8 @@ static const char notokmsg[] = static const char noauthmsg[] = "HTTP/1.1 401 Unauthorized\r\n" "Server: winetest\r\n" +"Connection: close\r\n" +"WWW-Authenticate: Basic realm=\"placebo\"\r\n" "\r\n"; static const char proxymsg[] = @@ -1356,6 +1332,8 @@ static DWORD CALLBACK server_thread(LPVOID param) char buffer[0x100]; WSADATA wsaData; int last_request = 0; + char host_header[22]; + static int test_b = 0; WSAStartup(MAKEWORD(1,1), &wsaData); @@ -1379,6 +1357,8 @@ static DWORD CALLBACK server_thread(LPVOID param) SetEvent(si->hEvent); + sprintf(host_header, "Host: localhost:%d", si->port); + do { c = accept(s, NULL, NULL); @@ -1394,7 +1374,6 @@ static DWORD CALLBACK server_thread(LPVOID param) buffer[i-3] == '\r' && buffer[i-1] == '\r') break; } - if (strstr(buffer, "GET /test1")) { if (!strstr(buffer, "Content-Length: 0")) @@ -1405,7 +1384,6 @@ static DWORD CALLBACK server_thread(LPVOID param) else send(c, notokmsg, sizeof notokmsg-1, 0); } - if (strstr(buffer, "/test2")) { if (strstr(buffer, "Proxy-Authorization: Basic bWlrZToxMTAx")) @@ -1416,7 +1394,6 @@ static DWORD CALLBACK server_thread(LPVOID param) else send(c, proxymsg, sizeof proxymsg-1, 0); } - if (strstr(buffer, "/test3")) { if (strstr(buffer, "Authorization: Basic dXNlcjpwd2Q=")) @@ -1424,7 +1401,6 @@ static DWORD CALLBACK server_thread(LPVOID param) else send(c, noauthmsg, sizeof noauthmsg-1, 0); } - if (strstr(buffer, "/test4")) { if (strstr(buffer, "Connection: Close")) @@ -1432,8 +1408,9 @@ static DWORD CALLBACK server_thread(LPVOID param) else send(c, notokmsg, sizeof notokmsg-1, 0); } - - if (strstr(buffer, "POST /test5")) + if (strstr(buffer, "POST /test5") || + strstr(buffer, "RPC_IN_DATA /test5") || + strstr(buffer, "RPC_OUT_DATA /test5")) { if (strstr(buffer, "Content-Length: 0")) { @@ -1443,7 +1420,6 @@ static DWORD CALLBACK server_thread(LPVOID param) else send(c, notokmsg, sizeof notokmsg-1, 0); } - if (strstr(buffer, "GET /test6")) { send(c, contmsg, sizeof contmsg-1, 0); @@ -1451,7 +1427,67 @@ static DWORD CALLBACK server_thread(LPVOID param) send(c, okmsg, sizeof okmsg-1, 0); send(c, page1, sizeof page1-1, 0); } - + if (strstr(buffer, "POST /test7")) + { + if (strstr(buffer, "Content-Length: 100")) + { + send(c, okmsg, sizeof okmsg-1, 0); + send(c, page1, sizeof page1-1, 0); + } + else + send(c, notokmsg, sizeof notokmsg-1, 0); + } + if (strstr(buffer, "/test8")) + { + if (!strstr(buffer, "Connection: Close") && + strstr(buffer, "Connection: Keep-Alive") && + !strstr(buffer, "Cache-Control: no-cache") && + !strstr(buffer, "Pragma: no-cache") && + strstr(buffer, host_header)) + send(c, okmsg, sizeof okmsg-1, 0); + else + send(c, notokmsg, sizeof notokmsg-1, 0); + } + if (strstr(buffer, "/test9")) + { + if (!strstr(buffer, "Connection: Close") && + !strstr(buffer, "Connection: Keep-Alive") && + !strstr(buffer, "Cache-Control: no-cache") && + !strstr(buffer, "Pragma: no-cache") && + strstr(buffer, host_header)) + send(c, okmsg, sizeof okmsg-1, 0); + else + send(c, notokmsg, sizeof notokmsg-1, 0); + } + if (strstr(buffer, "/testA")) + { + if (!strstr(buffer, "Connection: Close") && + !strstr(buffer, "Connection: Keep-Alive") && + (strstr(buffer, "Cache-Control: no-cache") || + strstr(buffer, "Pragma: no-cache")) && + strstr(buffer, host_header)) + send(c, okmsg, sizeof okmsg-1, 0); + else + send(c, notokmsg, sizeof notokmsg-1, 0); + } + if (!test_b && strstr(buffer, "/testB HTTP/1.1")) + { + test_b = 1; + send(c, okmsg, sizeof okmsg-1, 0); + recvfrom(c, buffer, sizeof buffer, 0, NULL, NULL); + send(c, okmsg, sizeof okmsg-1, 0); + } + if (strstr(buffer, "/testC")) + { + if (strstr(buffer, "Cookie: cookie=biscuit")) + send(c, okmsg, sizeof okmsg-1, 0); + else + send(c, notokmsg, sizeof notokmsg-1, 0); + } + if (strstr(buffer, "/testD")) + { + send(c, okmsg2, sizeof okmsg2-1, 0); + } if (strstr(buffer, "GET /quit")) { send(c, okmsg, sizeof okmsg-1, 0); @@ -1569,7 +1605,7 @@ static void test_proxy_direct(int port) ok(hi != NULL, "open failed\n"); /* try connect without authorization */ - hc = InternetConnect(hi, "www.winehq.org/", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + hc = InternetConnect(hi, "test.winehq.org/", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); ok(hc != NULL, "connect failed\n"); hr = HttpOpenRequest(hc, NULL, "/test2", NULL, NULL, NULL, 0, 0); @@ -1627,7 +1663,7 @@ static void test_header_handling_order(int port) request = HttpOpenRequest(connect, NULL, "/test3", NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION, 0); ok(request != NULL, "HttpOpenRequest failed\n"); - ret = HttpAddRequestHeaders(request, authorization, ~0UL, HTTP_ADDREQ_FLAG_ADD); + ret = HttpAddRequestHeaders(request, authorization, ~0u, HTTP_ADDREQ_FLAG_ADD); ok(ret, "HttpAddRequestHeaders failed\n"); ret = HttpSendRequest(request, NULL, 0, NULL, 0); @@ -1644,9 +1680,232 @@ static void test_header_handling_order(int port) request = HttpOpenRequest(connect, NULL, "/test4", NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION, 0); ok(request != NULL, "HttpOpenRequest failed\n"); - ret = HttpSendRequest(request, connection, ~0UL, NULL, 0); + ret = HttpSendRequest(request, connection, ~0u, NULL, 0); ok(ret, "HttpSendRequest failed\n"); + status = 0; + size = sizeof(status); + ret = HttpQueryInfo( request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL ); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200 || status == 400 /* IE6 */, "got status %u, expected 200 or 400\n", status); + + InternetCloseHandle(request); + + request = HttpOpenRequest(connect, "POST", "/test7", NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + + ret = HttpAddRequestHeaders(request, "Content-Length: 100\r\n", ~0u, HTTP_ADDREQ_FLAG_ADD_IF_NEW); + ok(ret, "HttpAddRequestHeaders failed\n"); + + ret = HttpSendRequest(request, connection, ~0u, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo( request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL ); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200 || status == 400 /* IE6 */, "got status %u, expected 200 or 400\n", status); + + InternetCloseHandle(request); + InternetCloseHandle(connect); + InternetCloseHandle(session); +} + +static void test_connection_header(int port) +{ + HINTERNET ses, con, req; + DWORD size, status; + BOOL ret; + + ses = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + req = HttpOpenRequest(con, NULL, "/test8", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo(req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200, "request failed with status %u\n", status); + + InternetCloseHandle(req); + + req = HttpOpenRequest(con, NULL, "/test9", NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo(req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200, "request failed with status %u\n", status); + + InternetCloseHandle(req); + + req = HttpOpenRequest(con, NULL, "/test9", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo(req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200, "request failed with status %u\n", status); + + InternetCloseHandle(req); + + req = HttpOpenRequest(con, "POST", "/testA", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo(req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200, "request failed with status %u\n", status); + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); +} + +static void test_http1_1(int port) +{ + HINTERNET ses, con, req; + BOOL ret; + + ses = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + req = HttpOpenRequest(con, NULL, "/testB", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + if (ret) + { + InternetCloseHandle(req); + + req = HttpOpenRequest(con, NULL, "/testB", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + todo_wine + ok(ret, "HttpSendRequest failed\n"); + } + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); +} + +static void test_HttpSendRequestW(int port) +{ + static const WCHAR header[] = {'U','A','-','C','P','U',':',' ','x','8','6',0}; + HINTERNET ses, con, req; + DWORD error; + BOOL ret; + + ses = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + req = HttpOpenRequest(con, NULL, "/test1", NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + SetLastError(0xdeadbeef); + ret = HttpSendRequestW(req, header, ~0u, NULL, 0); + error = GetLastError(); + ok(!ret, "HttpSendRequestW succeeded\n"); + ok(error == ERROR_IO_PENDING || broken(error == ERROR_HTTP_HEADER_NOT_FOUND), /* IE6 */ + "got %u expected ERROR_IO_PENDING\n", error); + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); +} + +static void test_cookie_header(int port) +{ + HINTERNET ses, con, req; + DWORD size, status, error; + BOOL ret; + char buffer[64]; + + ses = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + InternetSetCookie("http://localhost", "cookie", "biscuit"); + + req = HttpOpenRequest(con, NULL, "/testC", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + ret = HttpQueryInfo(req, HTTP_QUERY_COOKIE | HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &size, NULL); + error = GetLastError(); + ok(!ret, "HttpQueryInfo succeeded\n"); + ok(error == ERROR_HTTP_HEADER_NOT_FOUND, "got %u expected ERROR_HTTP_HEADER_NOT_FOUND\n", error); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); + + status = 0; + size = sizeof(status); + ret = HttpQueryInfo(req, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL); + ok(ret, "HttpQueryInfo failed\n"); + ok(status == 200, "request failed with status %u\n", status); + + buffer[0] = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(req, HTTP_QUERY_COOKIE | HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &size, NULL); + ok(ret, "HttpQueryInfo failed: %u\n", GetLastError()); + ok(!strcmp(buffer, "cookie=biscuit"), "got '%s' expected \'cookie=biscuit\'\n", buffer); + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); +} + +static void test_basic_authentication(int port) +{ + HINTERNET session, connect, request; + DWORD size, status; + BOOL ret; + + session = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(session != NULL, "InternetOpen failed\n"); + + connect = InternetConnect(session, "localhost", port, "user", "pwd", INTERNET_SERVICE_HTTP, 0, 0); + ok(connect != NULL, "InternetConnect failed\n"); + + request = HttpOpenRequest(connect, NULL, "/test3", NULL, NULL, NULL, 0, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed %u\n", GetLastError()); + status = 0; size = sizeof(status); ret = HttpQueryInfo( request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL ); @@ -1658,6 +1917,110 @@ static void test_header_handling_order(int port) InternetCloseHandle(session); } +static void test_HttpQueryInfo(int port) +{ + HINTERNET hi, hc, hr; + DWORD size, index; + char buffer[1024]; + BOOL ret; + + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hi != NULL, "InternetOpen failed\n"); + + hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(hc != NULL, "InternetConnect failed\n"); + + hr = HttpOpenRequest(hc, NULL, "/testD", NULL, NULL, NULL, 0, 0); + ok(hr != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(hr, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed\n"); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_HOST | HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 1, "expected 1 got %u\n", index); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_DATE | HTTP_QUERY_FLAG_SYSTEMTIME, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 1, "expected 1 got %u\n", index); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_RAW_HEADERS, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_RAW_HEADERS, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_RAW_HEADERS_CRLF, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_STATUS_TEXT, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_VERSION, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 0, "expected 0 got %u\n", index); + + index = 0xdeadbeef; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_FORWARDED, buffer, &size, &index); + ok(!ret, "HttpQueryInfo succeeded\n"); + ok(index == 0xdeadbeef, "expected 0xdeadbeef got %u\n", index); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_SERVER, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 1, "expected 1 got %u\n", index); + + index = 0; + size = sizeof(buffer); + strcpy(buffer, "Server"); + ret = HttpQueryInfo(hr, HTTP_QUERY_CUSTOM, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 1, "expected 1 got %u\n", index); + + index = 0; + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_SET_COOKIE, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 1, "expected 1 got %u\n", index); + + size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_SET_COOKIE, buffer, &size, &index); + ok(ret, "HttpQueryInfo failed %u\n", GetLastError()); + ok(index == 2, "expected 2 got %u\n", index); + + InternetCloseHandle(hr); + InternetCloseHandle(hc); + InternetCloseHandle(hi); +} + static void test_http_connection(void) { struct server_info si; @@ -1680,7 +2043,15 @@ static void test_http_connection(void) test_proxy_direct(si.port); test_header_handling_order(si.port); test_basic_request(si.port, "POST", "/test5"); + test_basic_request(si.port, "RPC_IN_DATA", "/test5"); + test_basic_request(si.port, "RPC_OUT_DATA", "/test5"); test_basic_request(si.port, "GET", "/test6"); + test_connection_header(si.port); + test_http1_1(si.port); + test_cookie_header(si.port); + test_basic_authentication(si.port); + test_HttpQueryInfo(si.port); + test_HttpSendRequestW(si.port); /* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit"); @@ -1700,10 +2071,10 @@ static void test_user_agent_header(void) ses = InternetOpen("Gizmo5", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); ok(ses != NULL, "InternetOpen failed\n"); - con = InternetConnect(ses, "www.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + con = InternetConnect(ses, "test.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); ok(con != NULL, "InternetConnect failed\n"); - req = HttpOpenRequest(con, "GET", "/", "HTTP/1.0", NULL, NULL, 0, 0); + req = HttpOpenRequest(con, "GET", "/hello.html", "HTTP/1.0", NULL, NULL, 0, 0); ok(req != NULL, "HttpOpenRequest failed\n"); size = sizeof(buffer); @@ -1712,7 +2083,7 @@ static void test_user_agent_header(void) ok(!ret, "HttpQueryInfo succeeded\n"); ok(err == ERROR_HTTP_HEADER_NOT_FOUND, "expected ERROR_HTTP_HEADER_NOT_FOUND, got %u\n", err); - ret = HttpAddRequestHeaders(req, "User-Agent: Gizmo Project\r\n", ~0UL, HTTP_ADDREQ_FLAG_ADD_IF_NEW); + ret = HttpAddRequestHeaders(req, "User-Agent: Gizmo Project\r\n", ~0u, HTTP_ADDREQ_FLAG_ADD_IF_NEW); ok(ret, "HttpAddRequestHeaders succeeded\n"); size = sizeof(buffer); @@ -1732,7 +2103,7 @@ static void test_user_agent_header(void) ok(!ret, "HttpQueryInfo succeeded\n"); ok(err == ERROR_HTTP_HEADER_NOT_FOUND, "expected ERROR_HTTP_HEADER_NOT_FOUND, got %u\n", err); - ret = HttpAddRequestHeaders(req, "Accept: audio/*, image/*, text/*\r\nUser-Agent: Gizmo Project\r\n", ~0UL, HTTP_ADDREQ_FLAG_ADD_IF_NEW); + ret = HttpAddRequestHeaders(req, "Accept: audio/*, image/*, text/*\r\nUser-Agent: Gizmo Project\r\n", ~0u, HTTP_ADDREQ_FLAG_ADD_IF_NEW); ok(ret, "HttpAddRequestHeaders failed\n"); buffer[0] = 0; @@ -1749,7 +2120,7 @@ static void test_user_agent_header(void) static void test_bogus_accept_types_array(void) { HINTERNET ses, con, req; - static const char *types[] = { (const char *)6240, "*/*", "%p", "", "*/*", NULL }; + static const char *types[] = { (const char *)6240, "*/*", "%p", "", (const char *)0xffffffff, "*/*", NULL }; DWORD size; char buffer[32]; BOOL ret; @@ -1764,13 +2135,97 @@ static void test_bogus_accept_types_array(void) size = sizeof(buffer); ret = HttpQueryInfo(req, HTTP_QUERY_ACCEPT | HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &size, NULL); ok(ret, "HttpQueryInfo failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "*/*, %p, */*"), "got '%s' expected '*/*, %%p, */*'\n", buffer); + ok(!strcmp(buffer, ", */*, %p, , , */*") || /* IE6 */ + !strcmp(buffer, "*/*, %p, */*"), + "got '%s' expected '*/*, %%p, */*' or ', */*, %%p, , , */*'\n", buffer); InternetCloseHandle(req); InternetCloseHandle(con); InternetCloseHandle(ses); } +struct context +{ + HANDLE event; + HINTERNET req; +}; + +static void WINAPI cb(HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID info, DWORD size) +{ + INTERNET_ASYNC_RESULT *result = info; + struct context *ctx = (struct context *)context; + + trace("%p 0x%08lx %u %p 0x%08x\n", handle, context, status, info, size); + + if (status == INTERNET_STATUS_REQUEST_COMPLETE) + { + trace("request handle: 0x%08lx\n", result->dwResult); + ctx->req = (HINTERNET)result->dwResult; + SetEvent(ctx->event); + } + if (status == INTERNET_STATUS_HANDLE_CLOSING) + { + DWORD type = INTERNET_HANDLE_TYPE_CONNECT_HTTP, size = sizeof(type); + + if (InternetQueryOption(handle, INTERNET_OPTION_HANDLE_TYPE, &type, &size)) + ok(type != INTERNET_HANDLE_TYPE_CONNECT_HTTP, "unexpected callback\n"); + SetEvent(ctx->event); + } +} + +static void test_open_url_async(void) +{ + BOOL ret; + HINTERNET ses, req; + DWORD size, error; + struct context ctx; + ULONG type; + + ctx.req = NULL; + ctx.event = CreateEvent(NULL, TRUE, FALSE, "Z:_home_hans_jaman-installer.exe_ev1"); + + ses = InternetOpen("AdvancedInstaller", 0, NULL, NULL, INTERNET_FLAG_ASYNC); + ok(ses != NULL, "InternetOpen failed\n"); + + SetLastError(0xdeadbeef); + ret = InternetSetOptionA(NULL, INTERNET_OPTION_CALLBACK, &cb, sizeof(DWORD_PTR)); + error = GetLastError(); + ok(!ret, "InternetSetOptionA succeeded\n"); + ok(error == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "got %u expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE\n", error); + + ret = InternetSetOptionA(ses, INTERNET_OPTION_CALLBACK, &cb, sizeof(DWORD_PTR)); + error = GetLastError(); + ok(!ret, "InternetSetOptionA failed\n"); + ok(error == ERROR_INTERNET_OPTION_NOT_SETTABLE, "got %u expected ERROR_INTERNET_OPTION_NOT_SETTABLE\n", error); + + pInternetSetStatusCallbackA(ses, cb); + ResetEvent(ctx.event); + + req = InternetOpenUrl(ses, "http://test.winehq.org", NULL, 0, 0, (DWORD_PTR)&ctx); + ok(!req && GetLastError() == ERROR_IO_PENDING, "InternetOpenUrl failed\n"); + + WaitForSingleObject(ctx.event, INFINITE); + + type = 0; + size = sizeof(type); + ret = InternetQueryOption(ctx.req, INTERNET_OPTION_HANDLE_TYPE, &type, &size); + ok(ret, "InternetQueryOption failed: %u\n", GetLastError()); + ok(type == INTERNET_HANDLE_TYPE_HTTP_REQUEST, + "expected INTERNET_HANDLE_TYPE_HTTP_REQUEST, got %u\n", type); + + size = 0; + ret = HttpQueryInfo(ctx.req, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &size, NULL); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "HttpQueryInfo failed\n"); + ok(size > 0, "expected size > 0\n"); + + ResetEvent(ctx.event); + InternetCloseHandle(ctx.req); + WaitForSingleObject(ctx.event, INFINITE); + + InternetCloseHandle(ses); + CloseHandle(ctx.event); +} + #define STATUS_STRING(status) \ memcpy(status_string[status], #status, sizeof(CHAR) * \ (strlen(#status) < MAX_STATUS_NAME ? \ @@ -1779,6 +2234,7 @@ static void test_bogus_accept_types_array(void) static void init_status_tests(void) { memset(expect, 0, sizeof(expect)); + memset(optional, 0, sizeof(optional)); memset(wine_allow, 0, sizeof(wine_allow)); memset(notified, 0, sizeof(notified)); memset(status_string, 0, sizeof(status_string)); @@ -1816,10 +2272,6 @@ START_TEST(http) HMODULE hdll; hdll = GetModuleHandleA("wininet.dll"); pInternetSetStatusCallbackA = (void*)GetProcAddress(hdll, "InternetSetStatusCallbackA"); - pInternetTimeFromSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeFromSystemTimeA"); - pInternetTimeFromSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeFromSystemTimeW"); - pInternetTimeToSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeA"); - pInternetTimeToSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeW"); if (!pInternetSetStatusCallbackA) skip("skipping the InternetReadFile tests\n"); @@ -1829,19 +2281,11 @@ START_TEST(http) InternetReadFile_test(INTERNET_FLAG_ASYNC); InternetReadFile_test(0); InternetReadFileExA_test(INTERNET_FLAG_ASYNC); + test_open_url_async(); } InternetOpenRequest_test(); test_http_cache(); InternetOpenUrlA_test(); - if (!pInternetTimeFromSystemTimeA) - skip("skipping the InternetTime tests\n"); - else - { - InternetTimeFromSystemTimeA_test(); - InternetTimeFromSystemTimeW_test(); - InternetTimeToSystemTimeA_test(); - InternetTimeToSystemTimeW_test(); - } HttpSendRequestEx_test(); HttpHeaders_test(); test_http_connection(); diff --git a/rostests/winetests/wininet/internet.c b/rostests/winetests/wininet/internet.c index 15495db514d..fe3f4778f3a 100644 --- a/rostests/winetests/wininet/internet.c +++ b/rostests/winetests/wininet/internet.c @@ -27,6 +27,12 @@ #include "wine/test.h" +static BOOL (WINAPI *pInternetTimeFromSystemTimeA)(CONST SYSTEMTIME *,DWORD ,LPSTR ,DWORD); +static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(CONST SYSTEMTIME *,DWORD ,LPWSTR ,DWORD); +static BOOL (WINAPI *pInternetTimeToSystemTimeA)(LPCSTR ,SYSTEMTIME *,DWORD); +static BOOL (WINAPI *pInternetTimeToSystemTimeW)(LPCWSTR ,SYSTEMTIME *,DWORD); +static BOOL (WINAPI *pIsDomainLegalCookieDomainW)(LPCWSTR, LPCWSTR); + /* ############################### */ static void test_InternetCanonicalizeUrlA(void) @@ -73,6 +79,16 @@ static void test_InternetCanonicalizeUrlA(void) "got %u and %u with size %u for '%s' (%d)\n", res, GetLastError(), dwSize, buffer, lstrlenA(buffer)); + memset(buffer, '#', sizeof(buffer)-1); + buffer[sizeof(buffer)-1] = '\0'; + dwSize = sizeof(buffer); + SetLastError(0xdeadbeef); + res = InternetCanonicalizeUrlA("file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", buffer, &dwSize, ICU_DECODE | ICU_NO_ENCODE); + ok(res, "InternetCanonicalizeUrlA failed %u\n", GetLastError()); + ok(dwSize == lstrlenA(buffer), "got %d expected %d\n", dwSize, lstrlenA(buffer)); + todo_wine ok(!lstrcmpA("file://C:\\Program Files\\Atmel\\AVR Tools\\STK500\\STK500.xml", buffer), + "got %s expected 'file://C:\\Program Files\\Atmel\\AVR Tools\\STK500\\STK500.xml'\n", buffer); + /* buffer is larger as the required size */ memset(buffer, '#', sizeof(buffer)-1); buffer[sizeof(buffer)-1] = '\0'; @@ -113,6 +129,12 @@ static void test_InternetCanonicalizeUrlA(void) "got %u and %u with size %u for '%s' (%d)\n", res, GetLastError(), dwSize, buffer, lstrlenA(buffer)); + /* test with trailing space */ + dwSize = 256; + res = InternetCanonicalizeUrlA("http://www.winehq.org/index.php?x= ", buffer, &dwSize, ICU_BROWSER_MODE); + ok(res == 1, "InternetCanonicalizeUrlA failed\n"); + ok(!strcmp(buffer, "http://www.winehq.org/index.php?x="), "Trailing space should have been stripped even in ICU_BROWSER_MODE (%s)\n", buffer); + res = InternetSetOptionA(NULL, 0xdeadbeef, buffer, sizeof(buffer)); ok(!res, "InternetSetOptionA succeeded\n"); ok(GetLastError() == ERROR_INTERNET_INVALID_OPTION, @@ -133,23 +155,29 @@ static void test_InternetQueryOptionA(void) hinet = InternetOpenA(useragent,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL, 0); ok((hinet != 0x0),"InternetOpen Failed\n"); + SetLastError(0xdeadbeef); + retval=InternetQueryOptionA(NULL,INTERNET_OPTION_USER_AGENT,NULL,&len); + err=GetLastError(); + ok(retval == 0,"Got wrong return value %d\n",retval); + ok(err == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Got wrong error code%d\n",err); + SetLastError(0xdeadbeef); len=strlen(useragent)+1; retval=InternetQueryOptionA(hinet,INTERNET_OPTION_USER_AGENT,NULL,&len); err=GetLastError(); ok(len == strlen(useragent)+1,"Got wrong user agent length %d instead of %d\n",len,lstrlenA(useragent)); ok(retval == 0,"Got wrong return value %d\n",retval); - todo_wine ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); + ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code %d\n",err); SetLastError(0xdeadbeef); len=strlen(useragent)+1; buffer=HeapAlloc(GetProcessHeap(),0,len); retval=InternetQueryOptionA(hinet,INTERNET_OPTION_USER_AGENT,buffer,&len); err=GetLastError(); - todo_wine ok(retval == 1,"Got wrong return value %d\n",retval); + ok(retval == 1,"Got wrong return value %d\n",retval); if (retval) { - todo_wine ok(!strcmp(useragent,buffer),"Got wrong user agent string %s instead of %s\n",buffer,useragent); + ok(!strcmp(useragent,buffer),"Got wrong user agent string %s instead of %s\n",buffer,useragent); todo_wine ok(len == strlen(useragent),"Got wrong user agent length %d instead of %d\n",len,lstrlenA(useragent)); } ok(err == 0xdeadbeef, "Got wrong error code %d\n",err); @@ -160,9 +188,9 @@ static void test_InternetQueryOptionA(void) buffer=HeapAlloc(GetProcessHeap(),0,100); retval=InternetQueryOptionA(hinet,INTERNET_OPTION_USER_AGENT,buffer,&len); err=GetLastError(); - todo_wine ok(len == strlen(useragent) + 1,"Got wrong user agent length %d instead of %d\n", len, lstrlenA(useragent) + 1); + ok(len == strlen(useragent) + 1,"Got wrong user agent length %d instead of %d\n", len, lstrlenA(useragent) + 1); ok(!retval, "Got wrong return value %d\n", retval); - todo_wine ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code %d\n", err); + ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code %d\n", err); HeapFree(GetProcessHeap(),0,buffer); hurl = InternetConnectA(hinet,"www.winehq.com",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0); @@ -173,7 +201,7 @@ static void test_InternetQueryOptionA(void) err=GetLastError(); ok(len == 0,"Got wrong user agent length %d instead of 0\n",len); ok(retval == 0,"Got wrong return value %d\n",retval); - todo_wine ok(err == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Got wrong error code %d\n",err); + ok(err == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Got wrong error code %d\n",err); InternetCloseHandle(hurl); InternetCloseHandle(hinet); @@ -185,9 +213,9 @@ static void test_InternetQueryOptionA(void) len=0; retval=InternetQueryOptionA(hinet,INTERNET_OPTION_USER_AGENT,NULL,&len); err=GetLastError(); - todo_wine ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); + ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); ok(retval == 0,"Got wrong return value %d\n",retval); - todo_wine ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); + ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); InternetCloseHandle(hinet); @@ -199,7 +227,7 @@ static void test_InternetQueryOptionA(void) err=GetLastError(); todo_wine ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); ok(retval == 0,"Got wrong return value %d\n",retval); - todo_wine ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); + ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); InternetCloseHandle(hinet); } @@ -216,6 +244,102 @@ static void test_get_cookie(void) ret ? "TRUE" : "FALSE", GetLastError()); } + +static void test_complicated_cookie(void) +{ + DWORD len; + BOOL ret; + + CHAR buffer[1024]; + + ret = InternetSetCookie("http://www.example.com/bar",NULL,"A=B; domain=.example.com"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + ret = InternetSetCookie("http://www.example.com/bar",NULL,"C=D; domain=.example.com; path=/"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + + /* Technically illegal! domain should require 2 dots, but native wininet accepts it */ + ret = InternetSetCookie("http://www.example.com",NULL,"E=F; domain=example.com"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + ret = InternetSetCookie("http://www.example.com",NULL,"G=H; domain=.example.com; path=/foo"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + ret = InternetSetCookie("http://www.example.com/bar.html",NULL,"I=J; domain=.example.com"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + ret = InternetSetCookie("http://www.example.com/bar/",NULL,"K=L; domain=.example.com"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + ret = InternetSetCookie("http://www.example.com/bar/",NULL,"M=N; domain=.example.com; path=/foo/"); + ok(ret == TRUE,"InternetSetCookie failed\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")==NULL,"G=H present\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); + ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com/foobar", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")==NULL,"G=H present\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); + ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com/foobar/", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")!=NULL,"G=H missing\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); + ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com/foo/bar", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")!=NULL,"G=H missing\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); + ok(strstr(buffer,"M=N")!=NULL,"M=N missing\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com/barfoo", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")==NULL,"G=H present\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); + ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com/barfoo/", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")==NULL,"G=H present\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")==NULL,"K=L present\n"); + ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); + + len = 1024; + ret = InternetGetCookie("http://testing.example.com/bar/foo", NULL, buffer, &len); + ok(strstr(buffer,"A=B")!=NULL,"A=B missing\n"); + ok(strstr(buffer,"C=D")!=NULL,"C=D missing\n"); + ok(strstr(buffer,"E=F")!=NULL,"E=F missing\n"); + ok(strstr(buffer,"G=H")==NULL,"G=H present\n"); + ok(strstr(buffer,"I=J")!=NULL,"I=J missing\n"); + ok(strstr(buffer,"K=L")!=NULL,"K=L missing\n"); + ok(strstr(buffer,"M=N")==NULL,"M=N present\n"); +} + static void test_null(void) { HINTERNET hi, hc; @@ -248,7 +372,8 @@ static void test_null(void) ok(hc == NULL, "connect failed\n"); hc = InternetOpenUrlW(hi, NULL, NULL, 0, 0, 0); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "wrong error\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER || + GetLastError() == ERROR_INTERNET_UNRECOGNIZED_SCHEME, "wrong error\n"); ok(hc == NULL, "connect failed\n"); hc = InternetOpenUrlW(hi, szServer, NULL, 0, 0, 0); @@ -339,13 +464,336 @@ static void test_version(void) ok(version.dwMinorVersion == 2, "dwMinorVersion=%d, expected 2\n", version.dwMinorVersion); } +static void InternetTimeFromSystemTimeA_test(void) +{ + BOOL ret; + static const SYSTEMTIME time = { 2005, 1, 5, 7, 12, 6, 35, 0 }; + char string[INTERNET_RFC1123_BUFSIZE]; + static const char expect[] = "Fri, 07 Jan 2005 12:06:35 GMT"; + DWORD error; + + ret = pInternetTimeFromSystemTimeA( &time, INTERNET_RFC1123_FORMAT, string, sizeof(string) ); + ok( ret, "InternetTimeFromSystemTimeA failed (%u)\n", GetLastError() ); + + ok( !memcmp( string, expect, sizeof(expect) ), + "InternetTimeFromSystemTimeA failed (%u)\n", GetLastError() ); + + /* test NULL time parameter */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeA( NULL, INTERNET_RFC1123_FORMAT, string, sizeof(string) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeA should have returned FALSE\n" ); + ok( error == ERROR_INVALID_PARAMETER, + "InternetTimeFromSystemTimeA failed with ERROR_INVALID_PARAMETER instead of %u\n", + error ); + + /* test NULL string parameter */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeA( &time, INTERNET_RFC1123_FORMAT, NULL, sizeof(string) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeA should have returned FALSE\n" ); + ok( error == ERROR_INVALID_PARAMETER, + "InternetTimeFromSystemTimeA failed with ERROR_INVALID_PARAMETER instead of %u\n", + error ); + + /* test invalid format parameter */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeA( &time, INTERNET_RFC1123_FORMAT + 1, string, sizeof(string) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeA should have returned FALSE\n" ); + ok( error == ERROR_INVALID_PARAMETER, + "InternetTimeFromSystemTimeA failed with ERROR_INVALID_PARAMETER instead of %u\n", + error ); + + /* test too small buffer size */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeA( &time, INTERNET_RFC1123_FORMAT, string, 0 ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeA should have returned FALSE\n" ); + ok( error == ERROR_INSUFFICIENT_BUFFER, + "InternetTimeFromSystemTimeA failed with ERROR_INSUFFICIENT_BUFFER instead of %u\n", + error ); +} + +static void InternetTimeFromSystemTimeW_test(void) +{ + BOOL ret; + static const SYSTEMTIME time = { 2005, 1, 5, 7, 12, 6, 35, 0 }; + WCHAR string[INTERNET_RFC1123_BUFSIZE + 1]; + static const WCHAR expect[] = { 'F','r','i',',',' ','0','7',' ','J','a','n',' ','2','0','0','5',' ', + '1','2',':','0','6',':','3','5',' ','G','M','T',0 }; + DWORD error; + + ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string, sizeof(string) ); + ok( ret, "InternetTimeFromSystemTimeW failed (%u)\n", GetLastError() ); + + ok( !memcmp( string, expect, sizeof(expect) ), + "InternetTimeFromSystemTimeW failed (%u)\n", GetLastError() ); + + /* test NULL time parameter */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeW( NULL, INTERNET_RFC1123_FORMAT, string, sizeof(string) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeW should have returned FALSE\n" ); + ok( error == ERROR_INVALID_PARAMETER, + "InternetTimeFromSystemTimeW failed with ERROR_INVALID_PARAMETER instead of %u\n", + error ); + + /* test NULL string parameter */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, NULL, sizeof(string) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeW should have returned FALSE\n" ); + ok( error == ERROR_INVALID_PARAMETER, + "InternetTimeFromSystemTimeW failed with ERROR_INVALID_PARAMETER instead of %u\n", + error ); + + /* test invalid format parameter */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT + 1, string, sizeof(string) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeW should have returned FALSE\n" ); + ok( error == ERROR_INVALID_PARAMETER, + "InternetTimeFromSystemTimeW failed with ERROR_INVALID_PARAMETER instead of %u\n", + error ); + + /* test too small buffer size */ + SetLastError(0xdeadbeef); + ret = pInternetTimeFromSystemTimeW( &time, INTERNET_RFC1123_FORMAT, string, sizeof(string)/sizeof(string[0]) ); + error = GetLastError(); + ok( !ret, "InternetTimeFromSystemTimeW should have returned FALSE\n" ); + ok( error == ERROR_INSUFFICIENT_BUFFER, + "InternetTimeFromSystemTimeW failed with ERROR_INSUFFICIENT_BUFFER instead of %u\n", + error ); +} + +static void InternetTimeToSystemTimeA_test(void) +{ + BOOL ret; + SYSTEMTIME time; + static const SYSTEMTIME expect = { 2005, 1, 5, 7, 12, 6, 35, 0 }; + static const char string[] = "Fri, 07 Jan 2005 12:06:35 GMT"; + static const char string2[] = " fri 7 jan 2005 12 06 35"; + + ret = pInternetTimeToSystemTimeA( string, &time, 0 ); + ok( ret, "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); + ok( !memcmp( &time, &expect, sizeof(expect) ), + "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeA( string2, &time, 0 ); + ok( ret, "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); + ok( !memcmp( &time, &expect, sizeof(expect) ), + "InternetTimeToSystemTimeA failed (%u)\n", GetLastError() ); +} + +static void InternetTimeToSystemTimeW_test(void) +{ + BOOL ret; + SYSTEMTIME time; + static const SYSTEMTIME expect = { 2005, 1, 5, 7, 12, 6, 35, 0 }; + static const WCHAR string[] = { 'F','r','i',',',' ','0','7',' ','J','a','n',' ','2','0','0','5',' ', + '1','2',':','0','6',':','3','5',' ','G','M','T',0 }; + static const WCHAR string2[] = { ' ','f','r','i',' ','7',' ','j','a','n',' ','2','0','0','5',' ', + '1','2',' ','0','6',' ','3','5',0 }; + static const WCHAR string3[] = { 'F','r',0 }; + + ret = pInternetTimeToSystemTimeW( NULL, NULL, 0 ); + ok( !ret, "InternetTimeToSystemTimeW succeeded (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeW( NULL, &time, 0 ); + ok( !ret, "InternetTimeToSystemTimeW succeeded (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeW( string, NULL, 0 ); + ok( !ret, "InternetTimeToSystemTimeW succeeded (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeW( string, &time, 0 ); + ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeW( string, &time, 0 ); + ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); + ok( !memcmp( &time, &expect, sizeof(expect) ), + "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeW( string2, &time, 0 ); + ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); + ok( !memcmp( &time, &expect, sizeof(expect) ), + "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); + + ret = pInternetTimeToSystemTimeW( string3, &time, 0 ); + ok( ret, "InternetTimeToSystemTimeW failed (%u)\n", GetLastError() ); +} + +static void test_IsDomainLegalCookieDomainW(void) +{ + BOOL ret; + DWORD error; + static const WCHAR empty[] = {0}; + static const WCHAR dot[] = {'.',0}; + static const WCHAR uk[] = {'u','k',0}; + static const WCHAR com[] = {'c','o','m',0}; + static const WCHAR dot_com[] = {'.','c','o','m',0}; + static const WCHAR gmail_com[] = {'g','m','a','i','l','.','c','o','m',0}; + static const WCHAR dot_gmail_com[] = {'.','g','m','a','i','l','.','c','o','m',0}; + static const WCHAR mail_gmail_com[] = {'m','a','i','l','.','g','m','a','i','l','.','c','o','m',0}; + static const WCHAR gmail_co_uk[] = {'g','m','a','i','l','.','c','o','.','u','k',0}; + static const WCHAR co_uk[] = {'c','o','.','u','k',0}; + static const WCHAR dot_co_uk[] = {'.','c','o','.','u','k',0}; + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(NULL, NULL); + error = GetLastError(); + ok(!ret || + broken(ret), /* Win98, NT4, W2K, XP (some) */ + "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(com, NULL); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(NULL, gmail_com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(empty, gmail_com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == ERROR_INVALID_PARAMETER), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(com, empty); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == ERROR_INVALID_PARAMETER), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(gmail_com, dot); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(dot, gmail_com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(com, com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == 0xdeadbeef, "got %u expected 0xdeadbeef\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(com, dot_com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(dot_com, com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(com, gmail_com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == 0xdeadbeef, "got %u expected 0xdeadbeef\n", error); + + ret = pIsDomainLegalCookieDomainW(gmail_com, gmail_com); + ok(ret, "IsDomainLegalCookieDomainW failed\n"); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(gmail_co_uk, co_uk); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == 0xdeadbeef, "got %u expected 0xdeadbeef\n", error); + + ret = pIsDomainLegalCookieDomainW(uk, co_uk); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + + ret = pIsDomainLegalCookieDomainW(gmail_co_uk, dot_co_uk); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + + ret = pIsDomainLegalCookieDomainW(gmail_co_uk, gmail_co_uk); + ok(ret, "IsDomainLegalCookieDomainW failed\n"); + + ret = pIsDomainLegalCookieDomainW(gmail_com, com); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + + SetLastError(0xdeadbeef); + ret = pIsDomainLegalCookieDomainW(dot_gmail_com, mail_gmail_com); + error = GetLastError(); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + ok(error == ERROR_INVALID_NAME || + broken(error == 0xdeadbeef), /* Win98, NT4, W2K, XP (some) */ + "got %u expected ERROR_INVALID_NAME\n", error); + + ret = pIsDomainLegalCookieDomainW(gmail_com, mail_gmail_com); + ok(ret, "IsDomainLegalCookieDomainW failed\n"); + + ret = pIsDomainLegalCookieDomainW(mail_gmail_com, gmail_com); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + + ret = pIsDomainLegalCookieDomainW(mail_gmail_com, com); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + + ret = pIsDomainLegalCookieDomainW(dot_gmail_com, mail_gmail_com); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); + + ret = pIsDomainLegalCookieDomainW(mail_gmail_com, dot_gmail_com); + ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); +} + /* ############################### */ START_TEST(internet) { - test_InternetCanonicalizeUrlA(); - test_InternetQueryOptionA(); - test_get_cookie(); - test_version(); - test_null(); + HMODULE hdll; + hdll = GetModuleHandleA("wininet.dll"); + pInternetTimeFromSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeFromSystemTimeA"); + pInternetTimeFromSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeFromSystemTimeW"); + pInternetTimeToSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeA"); + pInternetTimeToSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeW"); + pIsDomainLegalCookieDomainW = (void*)GetProcAddress(hdll, (LPCSTR)117); + + test_InternetCanonicalizeUrlA(); + test_InternetQueryOptionA(); + test_get_cookie(); + test_complicated_cookie(); + test_version(); + test_null(); + + if (!pInternetTimeFromSystemTimeA) + skip("skipping the InternetTime tests\n"); + else + { + InternetTimeFromSystemTimeA_test(); + InternetTimeFromSystemTimeW_test(); + InternetTimeToSystemTimeA_test(); + InternetTimeToSystemTimeW_test(); + } + if (!pIsDomainLegalCookieDomainW) + skip("skipping IsDomainLegalCookieDomainW tests\n"); + else + test_IsDomainLegalCookieDomainW(); } diff --git a/rostests/winetests/wininet/url.c b/rostests/winetests/wininet/url.c index ccc56076bad..c848f6bc90d 100644 --- a/rostests/winetests/wininet/url.c +++ b/rostests/winetests/wininet/url.c @@ -52,6 +52,7 @@ #define CREATE_URL10 "about://host/blank" #define CREATE_URL11 "about:" #define CREATE_URL12 "http://www.winehq.org:65535" +#define CREATE_URL13 "http://localhost/?test=123" static void copy_compsA( URL_COMPONENTSA *src, @@ -268,6 +269,7 @@ static void InternetCrackUrlW_test(void) '=','I','D','E','&','A','C','T','I','O','N','=','I','D','E','_','D','E','F','A', 'U','L','T', 0 }; static const WCHAR url2[] = { '.','.','/','R','i','t','z','.','x','m','l',0 }; + static const WCHAR url3[] = { 'h','t','t','p',':','/','/','x','.','o','r','g',0 }; URL_COMPONENTSW comp; WCHAR scheme[20], host[20], user[20], pwd[20], urlpart[50], extra[50]; DWORD error; @@ -389,6 +391,32 @@ static void InternetCrackUrlW_test(void) "InternetCrackUrl should have failed with error ERROR_INTERNET_UNRECOGNIZED_SCHEME instead of error %d\n", GetLastError()); } + + /* Test to see whether cracking a URL without a filename initializes urlpart */ + urlpart[0]=0xba; + scheme[0]=0; + extra[0]=0; + host[0]=0; + user[0]=0; + pwd[0]=0; + memset(&comp, 0, sizeof comp); + comp.dwStructSize = sizeof comp; + comp.lpszScheme = scheme; + comp.dwSchemeLength = sizeof scheme; + comp.lpszHostName = host; + comp.dwHostNameLength = sizeof host; + comp.lpszUserName = user; + comp.dwUserNameLength = sizeof user; + comp.lpszPassword = pwd; + comp.dwPasswordLength = sizeof pwd; + comp.lpszUrlPath = urlpart; + comp.dwUrlPathLength = sizeof urlpart; + comp.lpszExtraInfo = extra; + comp.dwExtraInfoLength = sizeof extra; + r = InternetCrackUrlW(url3, 0, 0, &comp ); + ok( r, "InternetCrackUrlW failed unexpectedly\n"); + ok( host[0] == 'x', "host should be x.org\n"); + ok( urlpart[0] == 0, "urlpart should be empty\n"); } static void fill_url_components(LPURL_COMPONENTS lpUrlComponents) @@ -428,9 +456,12 @@ static void InternetCreateUrlA_test(void) http[] = "http", https[] = "https", winehq[] = "www.winehq.org", + localhost[] = "localhost", username[] = "username", password[] = "password", + root[] = "/", site_about[] = "/site/about", + extra_info[] = "?test=123", about[] = "about", blank[] = "blank", host[] = "host"; @@ -744,6 +775,26 @@ static void InternetCreateUrlA_test(void) ok(!strcmp(szUrl, CREATE_URL12), "Expected %s, got %s\n", CREATE_URL12, szUrl); HeapFree(GetProcessHeap(), 0, szUrl); + + memset(&urlComp, 0, sizeof(urlComp)); + urlComp.dwStructSize = sizeof(URL_COMPONENTS); + urlComp.lpszScheme = http; + urlComp.dwSchemeLength = strlen(urlComp.lpszScheme); + urlComp.lpszHostName = localhost; + urlComp.dwHostNameLength = strlen(urlComp.lpszHostName); + urlComp.nPort = 80; + urlComp.lpszUrlPath = root; + urlComp.dwUrlPathLength = strlen(urlComp.lpszUrlPath); + urlComp.lpszExtraInfo = extra_info; + urlComp.dwExtraInfoLength = strlen(urlComp.lpszExtraInfo); + len = 256; + szUrl = HeapAlloc(GetProcessHeap(), 0, len); + InternetCreateUrlA(&urlComp, ICU_ESCAPE, szUrl, &len); + ok(ret, "Expected success\n"); + ok(len == strlen(CREATE_URL13), "Got len %u\n", len); + ok(!strcmp(szUrl, CREATE_URL13), "Expected \"%s\", got \"%s\"\n", CREATE_URL13, szUrl); + + HeapFree(GetProcessHeap(), 0, szUrl); } START_TEST(url) diff --git a/rostests/winetests/wininet/urlcache.c b/rostests/winetests/wininet/urlcache.c index 6570d5a9eba..d13597626de 100644 --- a/rostests/winetests/wininet/urlcache.c +++ b/rostests/winetests/wininet/urlcache.c @@ -30,6 +30,9 @@ #define TEST_URL "http://urlcachetest.winehq.org/index.html" +static BOOL (WINAPI *pDeleteUrlCacheEntryA)(LPCSTR); +static BOOL (WINAPI *pUnlockUrlCacheEntryFileA)(LPCSTR,DWORD); + static char filenameA[MAX_PATH + 1]; static void check_cache_entry_infoA(const char *returnedfrom, LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo) @@ -109,9 +112,42 @@ static void test_GetUrlCacheEntryInfoExA(void) check_cache_entry_infoA("GetUrlCacheEntryInfoEx", lpCacheEntryInfo); + cbCacheEntryInfo = 100000; + SetLastError(0xdeadbeef); + ret = GetUrlCacheEntryInfoEx(TEST_URL, NULL, &cbCacheEntryInfo, NULL, NULL, NULL, 0); + ok(!ret, "GetUrlCacheEntryInfoEx with zero-length buffer should fail\n"); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetUrlCacheEntryInfoEx should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, lpCacheEntryInfo); } +static void test_RetrieveUrlCacheEntryA(void) +{ + BOOL ret; + DWORD cbCacheEntryInfo; + + cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); + ret = RetrieveUrlCacheEntryFile(NULL, NULL, &cbCacheEntryInfo, 0); + ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); + + if (0) + { + /* Crashes on Win9x, NT4 and W2K */ + SetLastError(0xdeadbeef); + ret = RetrieveUrlCacheEntryFile(TEST_URL, NULL, NULL, 0); + ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); + } + + SetLastError(0xdeadbeef); + cbCacheEntryInfo = 100000; + ret = RetrieveUrlCacheEntryFile(NULL, NULL, &cbCacheEntryInfo, 0); + ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); +} + static void test_urlcacheA(void) { BOOL ret; @@ -150,23 +186,45 @@ static void test_urlcacheA(void) HeapFree(GetProcessHeap(), 0, lpCacheEntryInfo); - ret = UnlockUrlCacheEntryFile(TEST_URL, 0); - ok(ret, "UnlockUrlCacheEntryFile failed with error %d\n", GetLastError()); + if (pUnlockUrlCacheEntryFileA) + { + ret = pUnlockUrlCacheEntryFileA(TEST_URL, 0); + ok(ret, "UnlockUrlCacheEntryFileA failed with error %d\n", GetLastError()); + } /* test Find*UrlCacheEntry functions */ test_find_url_cache_entriesA(); test_GetUrlCacheEntryInfoExA(); + test_RetrieveUrlCacheEntryA(); - ret = DeleteUrlCacheEntry(TEST_URL); - ok(ret, "DeleteUrlCacheEntry failed with error %d\n", GetLastError()); + if (pDeleteUrlCacheEntryA) + { + ret = pDeleteUrlCacheEntryA(TEST_URL); + ok(ret, "DeleteUrlCacheEntryA failed with error %d\n", GetLastError()); + } ret = DeleteFile(filenameA); todo_wine ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, "local file should no longer exist\n"); } +static void test_FindCloseUrlCache(void) +{ + BOOL r; + DWORD err; + r = FindCloseUrlCache(NULL); + err = GetLastError(); + ok(0 == r, "expected 0, got %d\n", r); + ok(ERROR_INVALID_HANDLE == err, "expected %d, got %d\n", ERROR_INVALID_HANDLE, err); +} + START_TEST(urlcache) { + HMODULE hdll; + hdll = GetModuleHandleA("wininet.dll"); + pDeleteUrlCacheEntryA = (void*)GetProcAddress(hdll, "DeleteUrlCacheEntryA"); + pUnlockUrlCacheEntryFileA = (void*)GetProcAddress(hdll, "UnlockUrlCacheEntryFileA"); test_urlcacheA(); + test_FindCloseUrlCache(); } diff --git a/rostests/winetests/wintrust/crypt.c b/rostests/winetests/wintrust/crypt.c index 64211f18394..9129fa9da78 100644 --- a/rostests/winetests/wintrust/crypt.c +++ b/rostests/winetests/wintrust/crypt.c @@ -469,13 +469,13 @@ static void test_CryptCATAdminAddRemoveCatalog(void) hcatinfo = pCryptCATAdminAddCatalog(NULL, NULL, NULL, 0); error = GetLastError(); ok(hcatinfo == NULL, "CryptCATAdminAddCatalog succeeded\n"); - ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMTER\n", GetLastError()); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", GetLastError()); SetLastError(0xdeadbeef); hcatinfo = pCryptCATAdminAddCatalog(hcatadmin, NULL, NULL, 0); error = GetLastError(); ok(hcatinfo == NULL, "CryptCATAdminAddCatalog succeeded\n"); - ok(error == ERROR_INVALID_PARAMETER, "got %u expected INVALID_PARAMTER\n", GetLastError()); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", GetLastError()); MultiByteToWideChar(0, 0, tmpfile, -1, tmpfileW, MAX_PATH); @@ -491,7 +491,7 @@ static void test_CryptCATAdminAddRemoveCatalog(void) hcatinfo = pCryptCATAdminAddCatalog(hcatadmin, tmpfileW, basenameW, 1); error = GetLastError(); ok(hcatinfo == NULL, "CryptCATAdminAddCatalog succeeded\n"); - ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMTER\n", GetLastError()); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", GetLastError()); SetLastError(0xdeadbeef); hcatinfo = pCryptCATAdminAddCatalog(hcatadmin, tmpfileW, NULL, 0); @@ -740,7 +740,7 @@ static void test_create_catalog_file(void) ok(attrcount == 2, "Expected 2 attributes, got %d\n", attrcount); pCryptCATCDFClose(catcdf); - /* Eventhough the resulting catalogfile shows the attributes, they will not be enumerated */ + /* Even though the resulting catalog file shows the attributes, they will not be enumerated */ test_catalog_properties(catfileA, 0, 0); DeleteFileA(catfileA); @@ -904,7 +904,7 @@ static void test_cdf_parsing(void) todo_wine ok(DeleteFileA(catfileA), "Expected a catalog file to be created\n"); - /* Header and non-existing member */ + /* Header and nonexistent member */ lstrcpyA(cdf_contents, "[CatalogHeader]\r\n"); lstrcatA(cdf_contents, "Name=tempfile.cat\r\n"); lstrcatA(cdf_contents, "[CatalogFiles]\r\n"); @@ -1079,7 +1079,7 @@ START_TEST(crypt) { int myARGC; char** myARGV; - char windir[MAX_PATH]; + char sysdir[MAX_PATH]; InitFunctionPtrs(); @@ -1089,11 +1089,11 @@ START_TEST(crypt) return; } - GetWindowsDirectoryA(windir, MAX_PATH); - lstrcpyA(catroot, windir); - lstrcatA(catroot, "\\system32\\CatRoot"); - lstrcpyA(catroot2, windir); - lstrcatA(catroot2, "\\system32\\CatRoot2"); + GetSystemDirectoryA(sysdir, MAX_PATH); + lstrcpyA(catroot, sysdir); + lstrcatA(catroot, "\\CatRoot"); + lstrcpyA(catroot2, sysdir); + lstrcatA(catroot2, "\\CatRoot2"); myARGC = winetest_get_mainargs(&myARGV); strcpy(selfname, myARGV[0]); @@ -1106,7 +1106,7 @@ START_TEST(crypt) test_CryptCATCDF_params(); /* Test the parsing of a cdf file */ test_cdf_parsing(); - /* Create a catalogfile out of our own catalog definition file */ + /* Create a catalog file out of our own catalog definition file */ test_create_catalog_file(); test_CryptCATAdminAddRemoveCatalog(); } diff --git a/rostests/winetests/wintrust/register.c b/rostests/winetests/wintrust/register.c index 81be1042cd0..8a6675cbdb4 100644 --- a/rostests/winetests/wintrust/register.c +++ b/rostests/winetests/wintrust/register.c @@ -120,8 +120,10 @@ static void test_AddRem_ActionID(void) SetLastError(0xdeadbeef); ret = pWintrustAddActionID(&ActionID, 0, &ActionIDFunctions); ok (ret, "Expected WintrustAddActionID to succeed.\n"); - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); + ok (GetLastError() == ERROR_INVALID_PARAMETER || + GetLastError() == ERROR_ACCESS_DENIED, + "Expected ERROR_INVALID_PARAMETER or ERROR_ACCESS_DENIED, got %u.\n", + GetLastError()); /* All OK and all functions are correctly defined. The DLL and entrypoints * are not present. @@ -139,8 +141,9 @@ static void test_AddRem_ActionID(void) SetLastError(0xdeadbeef); ret = pWintrustAddActionID(&ActionID, 0, &ActionIDFunctions); ok (ret, "Expected WintrustAddActionID to succeed.\n"); - ok (GetLastError() == 0xdeadbeef, - "Expected 0xdeadbeef, got %u.\n", GetLastError()); + ok (GetLastError() == 0xdeadbeef || GetLastError() == ERROR_ACCESS_DENIED, + "Expected 0xdeadbeef or ERROR_ACCESS_DENIED, got %u.\n", + GetLastError()); SetLastError(0xdeadbeef); ret = pWintrustRemoveActionID(&ActionID); @@ -165,12 +168,10 @@ static void test_AddRem_ActionID(void) static void test_AddDefaultForUsage(void) { BOOL ret; - LONG res; static GUID ActionID = { 0xdeadbeef, 0xdead, 0xbeef, { 0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef }}; static WCHAR DummyDllW[] = {'d','e','a','d','b','e','e','f','.','d','l','l',0 }; static CHAR DummyFunction[] = "dummyfunction"; static const CHAR oid[] = "1.2.3.4.5.6.7.8.9.10"; - static const CHAR Usages[] = "SOFTWARE\\Microsoft\\Cryptography\\Providers\\Trust\\Usages\\1.2.3.4.5.6.7.8.9.10"; static CRYPT_PROVIDER_REGDEFUSAGE DefUsage; if (!pWintrustAddDefaultForUsage) @@ -206,27 +207,6 @@ static void test_AddDefaultForUsage(void) ok (GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); - /* Just the ActionID */ - memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); - DefUsage.cbStruct = sizeof(CRYPT_PROVIDER_REGDEFUSAGE); - DefUsage.pgActionID = &ActionID; - SetLastError(0xdeadbeef); - ret = pWintrustAddDefaultForUsage(oid, &DefUsage); - ok ( ret, "Expected WintrustAddDefaultForUsage to succeed\n"); - ok (GetLastError() == 0xdeadbeef, - "Last error should not have been changed: %u\n", GetLastError()); - - /* No ActionID */ - memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); - DefUsage.cbStruct = sizeof(CRYPT_PROVIDER_REGDEFUSAGE); - DefUsage.pwszDllName = DummyDllW; - DefUsage.pwszLoadCallbackDataFunctionName = DummyFunction; - DefUsage.pwszFreeCallbackDataFunctionName = DummyFunction; - ret = pWintrustAddDefaultForUsage(oid, &DefUsage); - ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); - ok (GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); - /* cbStruct set to 0 */ memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); DefUsage.cbStruct = 0; @@ -239,28 +219,6 @@ static void test_AddDefaultForUsage(void) ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); ok (GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); - - /* All OK */ - memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); - DefUsage.cbStruct = sizeof(CRYPT_PROVIDER_REGDEFUSAGE); - DefUsage.pgActionID = &ActionID; - DefUsage.pwszDllName = DummyDllW; - DefUsage.pwszLoadCallbackDataFunctionName = DummyFunction; - DefUsage.pwszFreeCallbackDataFunctionName = DummyFunction; - SetLastError(0xdeadbeef); - ret = pWintrustAddDefaultForUsage(oid, &DefUsage); - ok ( ret, "Expected WintrustAddDefaultForUsage to succeed\n"); - ok (GetLastError() == 0xdeadbeef, - "Last error should not have been changed: %u\n", GetLastError()); - - /* There is no corresponding remove for WintrustAddDefaultForUsage - * so we delete the registry key manually. - */ - if (ret) - { - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, Usages); - ok (res == ERROR_SUCCESS, "Key delete failed : 0x%08x\n", res); - } } static void test_LoadFunctionPointers(void) @@ -332,9 +290,9 @@ static void test_RegPolicyFlags(void) size = sizeof(flags1); r = RegQueryValueExA(key, State, NULL, NULL, (LPBYTE)&flags1, &size); - ok(!r, "RegQueryValueEx failed: %d\n", r); - - ok(flags1 == flags2, "Got %08x flags instead of %08x\n", flags1, flags2); + ok(!r || r == ERROR_FILE_NOT_FOUND, "RegQueryValueEx failed: %d\n", r); + if (!r) + ok(flags1 == flags2, "Got %08x flags instead of %08x\n", flags1, flags2); flags3 = flags2 | 1; ret = pWintrustSetRegPolicyFlags(flags3); diff --git a/rostests/winetests/wintrust/softpub.c b/rostests/winetests/wintrust/softpub.c index 5c5d892d45d..3e4347d80d3 100644 --- a/rostests/winetests/wintrust/softpub.c +++ b/rostests/winetests/wintrust/softpub.c @@ -303,12 +303,20 @@ static void testObjTrust(SAFE_PROVIDER_FUNCTIONS *funcs, GUID *actionID) ret = funcs->pfnObjectTrust(&data); ok(ret == S_FALSE, "Expected S_FALSE, got %08x\n", ret); ok(data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] == - TRUST_E_NOSIGNATURE, "Expected TRUST_E_NOSIGNATURE, got %08x\n", + TRUST_E_NOSIGNATURE || + data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] == + TRUST_E_SUBJECT_FORM_UNKNOWN, + "Expected TRUST_E_NOSIGNATURE or TRUST_E_SUBJECT_FORM_UNKNOWN, got %08x\n", data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV]); - ok(!memcmp(&provDataSIP.gSubject, &unknown, sizeof(unknown)), - "Unexpected subject GUID\n"); - ok(provDataSIP.pSip != NULL, "Expected a SIP\n"); - ok(provDataSIP.psSipSubjectInfo != NULL, "Expected a subject info\n"); + if (data.padwTrustStepErrors[TRUSTERROR_STEP_FINAL_OBJPROV] == + TRUST_E_NOSIGNATURE) + { + ok(!memcmp(&provDataSIP.gSubject, &unknown, sizeof(unknown)), + "Unexpected subject GUID\n"); + ok(provDataSIP.pSip != NULL, "Expected a SIP\n"); + ok(provDataSIP.psSipSubjectInfo != NULL, + "Expected a subject info\n"); + } funcs->pfnFree(data.padwTrustStepErrors); } } @@ -444,10 +452,11 @@ static void test_wintrust(void) getNotepadPath(notepadPathW, MAX_PATH); file.pcwszFilePath = notepadPathW; r = WinVerifyTrust(INVALID_HANDLE_VALUE, &generic_action_v2, &wtd); - ok(r == TRUST_E_NOSIGNATURE, "expected TRUST_E_NOSIGNATURE, got %08x\n", r); + ok(r == TRUST_E_NOSIGNATURE || r == CRYPT_E_FILE_ERROR, + "expected TRUST_E_NOSIGNATURE or CRYPT_E_FILE_ERROR, got %08x\n", r); hr = WinVerifyTrustEx(INVALID_HANDLE_VALUE, &generic_action_v2, &wtd); - ok(hr == TRUST_E_NOSIGNATURE, "expected TRUST_E_NOSIGNATURE, got %08x\n", - hr); + ok(hr == TRUST_E_NOSIGNATURE || r == CRYPT_E_FILE_ERROR, + "expected TRUST_E_NOSIGNATURE or CRYPT_E_FILE_ERROR, got %08x\n", hr); } static BOOL (WINAPI * pWTHelperGetKnownUsages)(DWORD action, PCCRYPT_OID_INFO **usages); diff --git a/rostests/winetests/ws2_32/sock.c b/rostests/winetests/ws2_32/sock.c index 0b5cb88becc..22455ef0c3e 100644 --- a/rostests/winetests/ws2_32/sock.c +++ b/rostests/winetests/ws2_32/sock.c @@ -852,7 +852,8 @@ static void Exit (void) ok ( ret == 0, "WSACleanup failed ret = %d GetLastError is %d\n", ret, err); ret = WSACleanup(); err = WSAGetLastError(); - ok ( ret == SOCKET_ERROR && err == WSANOTINITIALISED, + ok ( (ret == SOCKET_ERROR && err == WSANOTINITIALISED) || + broken(ret == 0), /* WinME */ "WSACleanup returned %d GetLastError is %d\n", ret, err); }