Author: cwittich Date: Sat Jan 31 08:49:08 2009 New Revision: 39239
URL: http://svn.reactos.org/svn/reactos?rev=39239&view=rev Log: sync shlwapi_winetest with wine 1.1.14
Added: trunk/rostests/winetests/shlwapi/assoc.c (with props) Modified: trunk/rostests/winetests/shlwapi/clist.c trunk/rostests/winetests/shlwapi/clsid.c trunk/rostests/winetests/shlwapi/generated.c trunk/rostests/winetests/shlwapi/istream.c trunk/rostests/winetests/shlwapi/ordinal.c trunk/rostests/winetests/shlwapi/path.c trunk/rostests/winetests/shlwapi/shlwapi.rbuild trunk/rostests/winetests/shlwapi/shreg.c trunk/rostests/winetests/shlwapi/string.c trunk/rostests/winetests/shlwapi/url.c
Added: trunk/rostests/winetests/shlwapi/assoc.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/assoc.c?... ============================================================================== --- trunk/rostests/winetests/shlwapi/assoc.c (added) +++ trunk/rostests/winetests/shlwapi/assoc.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -1,0 +1,248 @@ +/* Unit test suite for SHLWAPI IQueryAssociations functions + * + * Copyright 2008 Google (Lei Zhang) + * + * 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 <stdarg.h> + +#include "wine/test.h" +#include "shlwapi.h" + +#define expect(expected, got) ok ( expected == got, "Expected %d, got %d\n", expected, got) +#define expect_hr(expected, got) ok ( expected == got, "Expected %08x, got %08x\n", expected, got) + +static HRESULT (WINAPI *pAssocQueryStringA)(ASSOCF,ASSOCSTR,LPCSTR,LPCSTR,LPSTR,LPDWORD) = NULL; +static HRESULT (WINAPI *pAssocQueryStringW)(ASSOCF,ASSOCSTR,LPCWSTR,LPCWSTR,LPWSTR,LPDWORD) = NULL; + +/* Every version of Windows with IE should have this association? */ +static const WCHAR dotHtml[] = { '.','h','t','m','l',0 }; +static const WCHAR badBad[] = { 'b','a','d','b','a','d',0 }; +static const WCHAR dotBad[] = { '.','b','a','d',0 }; +static const WCHAR open[] = { 'o','p','e','n',0 }; +static const WCHAR invalid[] = { 'i','n','v','a','l','i','d',0 }; + +static void test_getstring_bad(void) +{ + HRESULT hr; + DWORD len; + + if (!pAssocQueryStringW) + { + win_skip("AssocQueryStringW() is missing\n"); + return; + } + + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, NULL, open, NULL, &len); + expect_hr(E_INVALIDARG, hr); + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, badBad, open, NULL, &len); + ok(hr == E_FAIL || + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION), /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, dotBad, open, NULL, &len); + ok(hr == E_FAIL || + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION), /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, dotHtml, invalid, NULL, + &len); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION), /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, dotHtml, open, NULL, NULL); + ok(hr == E_UNEXPECTED || + hr == E_INVALIDARG, /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); + + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, NULL, open, NULL, &len); + expect_hr(E_INVALIDARG, hr); + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, badBad, open, NULL, + &len); + ok(hr == E_FAIL || + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION), /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotBad, open, NULL, + &len); + ok(hr == E_FAIL || + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION), /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotHtml, invalid, NULL, + &len); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) || /* W2K/Vista/W2K8 */ + hr == E_FAIL, /* Win9x/WinMe/NT4 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotHtml, open, NULL, + NULL); + ok(hr == E_UNEXPECTED || + hr == E_INVALIDARG, /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + "Unexpected result : %08x\n", hr); +} + +static void test_getstring_basic(void) +{ + HRESULT hr; + WCHAR * friendlyName; + WCHAR * executableName; + DWORD len, len2, slen; + + if (!pAssocQueryStringW) + { + win_skip("AssocQueryStringW() is missing\n"); + return; + } + + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, dotHtml, open, NULL, &len); + expect_hr(S_FALSE, hr); + if (hr != S_FALSE) + { + skip("failed to get initial len\n"); + return; + } + + executableName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + len * sizeof(WCHAR)); + if (!executableName) + { + skip("failed to allocate memory\n"); + return; + } + + len2 = len; + hr = pAssocQueryStringW(0, ASSOCSTR_EXECUTABLE, dotHtml, open, + executableName, &len2); + expect_hr(S_OK, hr); + slen = lstrlenW(executableName) + 1; + expect(len, len2); + expect(len, slen); + + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotHtml, open, NULL, + &len); + ok(hr == S_FALSE || + hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), /* Win9x/NT4 */ + "Unexpected result : %08x\n", hr); + if (hr != S_FALSE) + { + HeapFree(GetProcessHeap(), 0, executableName); + skip("failed to get initial len\n"); + return; + } + + friendlyName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + len * sizeof(WCHAR)); + if (!friendlyName) + { + HeapFree(GetProcessHeap(), 0, executableName); + skip("failed to allocate memory\n"); + return; + } + + len2 = len; + hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotHtml, open, + friendlyName, &len2); + expect_hr(S_OK, hr); + slen = lstrlenW(friendlyName) + 1; + expect(len, len2); + expect(len, slen); + + HeapFree(GetProcessHeap(), 0, executableName); + HeapFree(GetProcessHeap(), 0, friendlyName); +} + +static void test_getstring_no_extra(void) +{ + LONG ret; + HKEY hkey; + HRESULT hr; + static const CHAR dotWinetest[] = { + '.','w','i','n','e','t','e','s','t',0 + }; + static const CHAR winetestfile[] = { + 'w','i','n','e','t','e','s','t', 'f','i','l','e',0 + }; + static const CHAR winetestfileAction[] = { + 'w','i','n','e','t','e','s','t','f','i','l','e', + '\','s','h','e','l','l', + '\','f','o','o', + '\','c','o','m','m','a','n','d',0 + }; + static const CHAR action[] = { + 'n','o','t','e','p','a','d','.','e','x','e',0 + }; + CHAR buf[MAX_PATH]; + DWORD len = MAX_PATH; + + if (!pAssocQueryStringA) + { + win_skip("AssocQueryStringA() is missing\n"); + return; + } + + buf[0] = '\0'; + ret = RegCreateKeyA(HKEY_CLASSES_ROOT, dotWinetest, &hkey); + if (ret != ERROR_SUCCESS) { + skip("failed to create dotWinetest key\n"); + return; + } + + ret = RegSetValueA(hkey, NULL, REG_SZ, winetestfile, lstrlenA(winetestfile)); + RegCloseKey(hkey); + if (ret != ERROR_SUCCESS) + { + skip("failed to set dotWinetest key\n"); + goto cleanup; + } + + ret = RegCreateKeyA(HKEY_CLASSES_ROOT, winetestfileAction, &hkey); + if (ret != ERROR_SUCCESS) + { + skip("failed to create winetestfileAction key\n"); + goto cleanup; + } + + ret = RegSetValueA(hkey, NULL, REG_SZ, action, lstrlenA(action)); + RegCloseKey(hkey); + if (ret != ERROR_SUCCESS) + { + skip("failed to set winetestfileAction key\n"); + goto cleanup; + } + + hr = pAssocQueryStringA(0, ASSOCSTR_EXECUTABLE, dotWinetest, NULL, buf, &len); + ok(hr == S_OK || + hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), /* XP and W2K3 */ + "Unexpected result : %08x\n", hr); + hr = pAssocQueryStringA(0, ASSOCSTR_EXECUTABLE, dotWinetest, "foo", buf, &len); + expect_hr(S_OK, hr); + ok(strstr(buf, action) != NULL, + "got '%s' (Expected result to include 'notepad.exe')\n", buf); + +cleanup: + SHDeleteKeyA(HKEY_CLASSES_ROOT, dotWinetest); + SHDeleteKeyA(HKEY_CLASSES_ROOT, winetestfile); + +} + +START_TEST(assoc) +{ + HMODULE hshlwapi; + hshlwapi = GetModuleHandleA("shlwapi.dll"); + pAssocQueryStringA = (void*)GetProcAddress(hshlwapi, "AssocQueryStringA"); + pAssocQueryStringW = (void*)GetProcAddress(hshlwapi, "AssocQueryStringW"); + + test_getstring_bad(); + test_getstring_basic(); + test_getstring_no_extra(); +}
Propchange: trunk/rostests/winetests/shlwapi/assoc.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/rostests/winetests/shlwapi/clist.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/clist.c?... ============================================================================== --- trunk/rostests/winetests/shlwapi/clist.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/clist.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -116,7 +116,7 @@ else { unsigned int i; - char* buff = (char*)lpMem; + char* buff = lpMem;
/* Read item data */ if (!This->item->ulSize)
Modified: trunk/rostests/winetests/shlwapi/clsid.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/clsid.c?... ============================================================================== --- trunk/rostests/winetests/shlwapi/clsid.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/clsid.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -24,12 +24,12 @@ #include "winerror.h" #include "winnls.h" #include "winuser.h" +#include "initguid.h" #include "shlguid.h" #include "shobjidl.h" #include "olectl.h"
-#define INITGUID -#include "initguid.h" +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
/* This GUID has been removed from the PSDK */ DEFINE_OLEGUID(WINE_IID_IDelayedRelease, 0x000214EDL, 0, 0); @@ -107,6 +107,7 @@ DWORD dwLen; BOOL bRet; int i = 0; + int is_vista = 0;
if (!pSHLWAPI_269 || !pSHLWAPI_23) return; @@ -114,7 +115,8 @@ while (*guids) { dwLen = pSHLWAPI_23(*guids, szBuff, 256); - ok(dwLen == 39, "wrong size for id %d\n", i); + if (!i && dwLen == S_OK) is_vista = 1; /* seems to return an HRESULT on vista */ + ok(dwLen == (is_vista ? S_OK : 39), "wrong size %u for id %d\n", dwLen, i);
bRet = pSHLWAPI_269(szBuff, &guid); ok(bRet != FALSE, "created invalid string '%s'\n", szBuff); @@ -128,7 +130,7 @@
/* Test endianess */ dwLen = pSHLWAPI_23(&IID_Endianess, szBuff, 256); - ok(dwLen == 39, "wrong size for IID_Endianess\n"); + ok(dwLen == (is_vista ? S_OK : 39), "wrong size %u for IID_Endianess\n", dwLen);
ok(!strcmp(szBuff, "{01020304-0506-0708-090A-0B0C0D0E0F0A}"), "Endianess Broken, got '%s'\n", szBuff); @@ -136,17 +138,17 @@ /* test lengths */ szBuff[0] = ':'; dwLen = pSHLWAPI_23(&IID_Endianess, szBuff, 0); - ok(dwLen == 0, "accepted bad length\n"); + ok(dwLen == (is_vista ? E_FAIL : 0), "accepted bad length\n"); ok(szBuff[0] == ':', "wrote to buffer with no length\n");
szBuff[0] = ':'; dwLen = pSHLWAPI_23(&IID_Endianess, szBuff, 38); - ok(dwLen == 0, "accepted bad length\n"); + ok(dwLen == (is_vista ? E_FAIL : 0), "accepted bad length\n"); ok(szBuff[0] == ':', "wrote to buffer with no length\n");
szBuff[0] = ':'; dwLen = pSHLWAPI_23(&IID_Endianess, szBuff, 39); - ok(dwLen == 39, "rejected ok length\n"); + ok(dwLen == (is_vista ? S_OK : 39), "rejected ok length\n"); ok(szBuff[0] == '{', "Didn't write to buffer with ok length\n");
/* Test string */ @@ -155,7 +157,7 @@ ok(bRet == FALSE, "accepted invalid string\n");
dwLen = pSHLWAPI_23(&IID_Endianess, szBuff, 39); - ok(dwLen == 39, "rejected ok length\n"); + ok(dwLen == (is_vista ? S_OK : 39), "rejected ok length\n"); ok(szBuff[0] == '{', "Didn't write to buffer with ok length\n"); }
Modified: trunk/rostests/winetests/shlwapi/generated.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/generate... ============================================================================== --- trunk/rostests/winetests/shlwapi/generated.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/generated.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -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. */
/* @@ -33,21 +33,13 @@ */
#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 @@ -64,104 +56,109 @@ * 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_ASSOCF(void) { /* ASSOCF */ - TEST_TYPE(ASSOCF, 4, 4); - TEST_TYPE_UNSIGNED(ASSOCF); + TEST_TYPE_SIZE (ASSOCF, 4) + TEST_TYPE_ALIGN (ASSOCF, 4) + TEST_TYPE_UNSIGNED(ASSOCF) }
static void test_pack_DLLGETVERSIONPROC(void) { /* DLLGETVERSIONPROC */ - TEST_TYPE(DLLGETVERSIONPROC, 4, 4); + TEST_TYPE_SIZE (DLLGETVERSIONPROC, 4) + TEST_TYPE_ALIGN (DLLGETVERSIONPROC, 4) }
static void test_pack_DLLVERSIONINFO(void) { /* DLLVERSIONINFO (pack 8) */ - TEST_TYPE(DLLVERSIONINFO, 20, 4); - TEST_FIELD(DLLVERSIONINFO, DWORD, cbSize, 0, 4, 4); - TEST_FIELD(DLLVERSIONINFO, DWORD, dwMajorVersion, 4, 4, 4); - TEST_FIELD(DLLVERSIONINFO, DWORD, dwMinorVersion, 8, 4, 4); - TEST_FIELD(DLLVERSIONINFO, DWORD, dwBuildNumber, 12, 4, 4); - TEST_FIELD(DLLVERSIONINFO, DWORD, dwPlatformID, 16, 4, 4); + TEST_TYPE_SIZE (DLLVERSIONINFO, 20) + TEST_TYPE_ALIGN (DLLVERSIONINFO, 4) + TEST_FIELD_SIZE (DLLVERSIONINFO, cbSize, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, cbSize, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, cbSize, 0) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMinorVersion, 8) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwBuildNumber, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwBuildNumber, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwBuildNumber, 12) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwPlatformID, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwPlatformID, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwPlatformID, 16) }
static void test_pack_DLLVERSIONINFO2(void) { /* DLLVERSIONINFO2 (pack 8) */ - TEST_TYPE(DLLVERSIONINFO2, 32, 8); - TEST_FIELD(DLLVERSIONINFO2, DLLVERSIONINFO, info1, 0, 20, 4); - TEST_FIELD(DLLVERSIONINFO2, DWORD, dwFlags, 20, 4, 4); - TEST_FIELD(DLLVERSIONINFO2, ULONGLONG, ullVersion, 24, 8, 8); + TEST_TYPE_SIZE (DLLVERSIONINFO2, 32) + TEST_TYPE_ALIGN (DLLVERSIONINFO2, 8) + TEST_FIELD_SIZE (DLLVERSIONINFO2, info1, 20) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, info1, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, info1, 0) + TEST_FIELD_SIZE (DLLVERSIONINFO2, dwFlags, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, dwFlags, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, dwFlags, 20) + TEST_FIELD_SIZE (DLLVERSIONINFO2, ullVersion, 8) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, ullVersion, 8) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, ullVersion, 24) }
static void test_pack_HUSKEY(void) { /* HUSKEY */ - TEST_TYPE(HUSKEY, 4, 4); + TEST_TYPE_SIZE (HUSKEY, 4) + TEST_TYPE_ALIGN (HUSKEY, 4) }
static void test_pack_PHUSKEY(void) { /* PHUSKEY */ - TEST_TYPE(PHUSKEY, 4, 4); - TEST_TYPE_POINTER(PHUSKEY, 4, 4); + TEST_TYPE_SIZE (PHUSKEY, 4) + TEST_TYPE_ALIGN (PHUSKEY, 4) + TEST_TARGET_SIZE (PHUSKEY, 4) + TEST_TARGET_ALIGN(PHUSKEY, 4) }
static void test_pack(void) @@ -176,5 +173,9 @@
START_TEST(generated) { +#ifdef _WIN64 + ok(0, "The type size / alignment tests don't support Win64 yet\n"); +#else test_pack(); +#endif }
Modified: trunk/rostests/winetests/shlwapi/istream.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/istream.... ============================================================================== --- trunk/rostests/winetests/shlwapi/istream.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/istream.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -209,8 +209,12 @@ /* invalid arguments */
stream = NULL; + /* NT: ERROR_PATH_NOT_FOUND, 9x: ERROR_BAD_PATHNAME */ ret = (*pSHCreateStreamOnFileA)(NULL, mode | stgm, &stream); - ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), got 0x%08x\n", ret); + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || + ret == HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), + "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)" + "or HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), got 0x%08x\n", ret); ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream);
#if 0 /* This test crashes on WinXP SP2 */ @@ -290,27 +294,35 @@ HRESULT ret; ULONG refcount; WCHAR test_file[MAX_PATH]; - static const WCHAR testW_txt[] = { '\', 't', 'e', 's', 't', 'W', '.', 't', 'x', 't', '\0' }; + CHAR test_fileA[MAX_PATH]; + static const CHAR testW_txt[] = "\testW.txt";
trace("SHCreateStreamOnFileW: testing mode %d, STGM flags %08x\n", mode, stgm);
/* Don't used a fixed path for the testW.txt file */ - GetTempPathW(MAX_PATH, test_file); - lstrcatW(test_file, testW_txt); + GetTempPathA(MAX_PATH, test_fileA); + lstrcatA(test_fileA, testW_txt); + MultiByteToWideChar(CP_ACP, 0, test_fileA, -1, test_file, MAX_PATH);
/* invalid arguments */
- stream = NULL; - ret = (*pSHCreateStreamOnFileW)(NULL, mode | stgm, &stream); - ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */ - ret == E_INVALIDARG /* Vista */, - "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret); - ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); - -#if 0 /* This test crashes on WinXP SP2 */ - ret = (*pSHCreateStreamOnFileW)(test_file, mode | stgm, NULL); - ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret); -#endif + if (0) + { + /* Crashes on NT4 */ + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(NULL, mode | stgm, &stream); + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */ + ret == E_INVALIDARG /* Vista */, + "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); + } + + if (0) + { + /* This test crashes on WinXP SP2 */ + ret = (*pSHCreateStreamOnFileW)(test_file, mode | stgm, NULL); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret); + }
stream = NULL; ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CONVERT | stgm, &stream); @@ -373,7 +385,9 @@ refcount = IStream_Release(stream); ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount);
- ok(DeleteFileW(test_file), "SHCreateStreamOnFileW: could not delete the test file, got error %d\n", GetLastError()); + ok(DeleteFileA(test_fileA), + "SHCreateStreamOnFileW: could not delete the test file, got error %d\n", + GetLastError()); } }
@@ -385,32 +399,44 @@ HRESULT ret; ULONG refcount; WCHAR test_file[MAX_PATH]; - static const WCHAR testEx_txt[] = { '\', 't', 'e', 's', 't', 'E','x', '.', 't', 'x', 't', '\0' }; + CHAR test_fileA[MAX_PATH]; + static const CHAR testEx_txt[] = "\testEx.txt";
trace("SHCreateStreamOnFileEx: testing mode %d, STGM flags %08x\n", mode, stgm);
/* Don't used a fixed path for the testEx.txt file */ - GetTempPathW(MAX_PATH, test_file); - lstrcatW(test_file, testEx_txt); + GetTempPathA(MAX_PATH, test_fileA); + lstrcatA(test_fileA, testEx_txt); + MultiByteToWideChar(CP_ACP, 0, test_fileA, -1, test_file, MAX_PATH);
/* invalid arguments */
- stream = NULL; - ret = (*pSHCreateStreamOnFileEx)(NULL, mode, 0, FALSE, NULL, &stream); - ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */ - ret == E_INVALIDARG /* Vista */, - "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret); + if (0) + { + /* Crashes on NT4 */ + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(NULL, mode, 0, FALSE, NULL, &stream); + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */ + ret == E_INVALIDARG /* Vista */, + "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); + ok( ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || + ret == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), + "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or " + "HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream);
- stream = NULL; - ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); - ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); - ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream); - -#if 0 /* This test crashes on WinXP SP2 */ - ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, NULL, NULL); - ok(ret == E_INVALIDARG, "SHCreateStreamOnFileEx: expected E_INVALIDARG, got 0x%08x\n", ret); -#endif + if (0) + { + /* This test crashes on WinXP SP2 */ + ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, NULL, NULL); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileEx: expected E_INVALIDARG, got 0x%08x\n", ret); + }
/* file does not exist */
@@ -425,12 +451,22 @@ return; } } else { - ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); + ok( ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || + ret == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), + "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or " + "HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), got 0x%08x\n", ret); } ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream);
stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, TRUE, NULL, &stream); + /* not supported on win9x */ + if (broken(ret == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER) && stream == NULL)) { + skip("Not supported\n"); + DeleteFileA(test_fileA); + return; + } + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n");
@@ -440,7 +476,9 @@ refcount = IStream_Release(stream); ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
- ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError()); + ok(DeleteFileA(test_fileA), + "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", + GetLastError()); }
stream = NULL; @@ -454,7 +492,9 @@ refcount = IStream_Release(stream); ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount);
- ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError()); + ok(DeleteFileA(test_fileA), + "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", + GetLastError()); }
stream = NULL; @@ -514,7 +554,9 @@ ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); }
- ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError()); + ok(DeleteFileA(test_fileA), + "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", + GetLastError()); }
Modified: trunk/rostests/winetests/shlwapi/ordinal.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/ordinal.... ============================================================================== --- trunk/rostests/winetests/shlwapi/ordinal.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/ordinal.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -42,13 +42,19 @@ DWORD buffersize, buffersize2, exactsize; char buffer[100];
- if (!pGetAcceptLanguagesA) + if (!pGetAcceptLanguagesA) { + win_skip("GetAcceptLanguagesA is not available\n"); return; + }
buffersize = sizeof(buffer); memset(buffer, 0, sizeof(buffer)); SetLastError(ERROR_SUCCESS); retval = pGetAcceptLanguagesA( buffer, &buffersize); + if (!retval && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("GetAcceptLanguagesA is not implemented\n"); + return; + } trace("GetAcceptLanguagesA: retval %08x, size %08x, buffer (%s)," " last error %u\n", retval, buffersize, buffer, GetLastError()); if(retval != S_OK) { @@ -58,28 +64,31 @@ ok( (ERROR_NO_IMPERSONATION_TOKEN == GetLastError()) || (ERROR_CLASS_DOES_NOT_EXIST == GetLastError()) || (ERROR_PROC_NOT_FOUND == GetLastError()) || - (ERROR_CALL_NOT_IMPLEMENTED == GetLastError()) || (ERROR_SUCCESS == GetLastError()), "last error set to %u\n", GetLastError()); exactsize = strlen(buffer);
SetLastError(ERROR_SUCCESS); retval = pGetAcceptLanguagesA( NULL, NULL); - ok(retval == E_FAIL, + ok(retval == E_FAIL || + retval == E_INVALIDARG, /* w2k8 */ "function result wrong: got %08x; expected E_FAIL\n", retval); ok(ERROR_SUCCESS == GetLastError(), "last error set to %u\n", GetLastError());
buffersize = sizeof(buffer); SetLastError(ERROR_SUCCESS); retval = pGetAcceptLanguagesA( NULL, &buffersize); - ok(retval == E_FAIL, + ok(retval == E_FAIL || + retval == E_INVALIDARG, /* w2k8 */ "function result wrong: got %08x; expected E_FAIL\n", retval); - ok(buffersize == sizeof(buffer), - "buffersize was changed (2nd parameter; not on Win2k)\n"); + ok(buffersize == sizeof(buffer) || + buffersize == 0, /* w2k8*/ + "buffersize was changed and is not 0; size (%d))\n", buffersize); ok(ERROR_SUCCESS == GetLastError(), "last error set to %u\n", GetLastError());
SetLastError(ERROR_SUCCESS); retval = pGetAcceptLanguagesA( buffer, NULL); - ok(retval == E_FAIL, + ok(retval == E_FAIL || + retval == E_INVALIDARG, /* w2k8 */ "function result wrong: got %08x; expected E_FAIL\n", retval); ok(ERROR_SUCCESS == GetLastError(), "last error set to %u\n", GetLastError());
@@ -87,7 +96,8 @@ memset(buffer, 0, sizeof(buffer)); SetLastError(ERROR_SUCCESS); retval = pGetAcceptLanguagesA( buffer, &buffersize); - ok(retval == E_FAIL, + ok(retval == E_FAIL || + retval == E_INVALIDARG, /* w2k8 */ "function result wrong: got %08x; expected E_FAIL\n", retval); ok(buffersize == 0, "buffersize wrong(changed) got %08x; expected 0 (2nd parameter; not on Win2k)\n", buffersize); @@ -100,9 +110,9 @@ switch(retval) { case 0L: if(buffersize == exactsize) { - ok( (ERROR_SUCCESS == GetLastError()) || (ERROR_CALL_NOT_IMPLEMENTED == GetLastError()) || + ok( (ERROR_SUCCESS == GetLastError()) || (ERROR_PROC_NOT_FOUND == GetLastError()) || (ERROR_NO_IMPERSONATION_TOKEN == GetLastError()), - "last error wrong: got %u; expected ERROR_SUCCESS(NT4)/ERROR_CALL_NOT_IMPLEMENTED(98/ME)/" + "last error wrong: got %u; expected ERROR_SUCCESS(NT4)/" "ERROR_PROC_NOT_FOUND(NT4)/ERROR_NO_IMPERSONATION_TOKEN(XP)\n", GetLastError()); ok(exactsize == strlen(buffer), "buffer content (length) wrong: got %08x, expected %08x\n", lstrlenA(buffer), exactsize); @@ -219,7 +229,7 @@ hmem=pSHAllocShared(&val,4,procid); ok(hmem!=NULL,"SHAllocShared(NULL...) failed: %u\n", GetLastError());
- p=(int*)pSHLockShared(hmem,procid); + p=pSHLockShared(hmem,procid); ok(p!=NULL,"SHLockShared failed: %u\n", GetLastError()); if (p!=NULL) ok(*p==val,"Wrong value in shared memory: %d instead of %d\n",*p,val); @@ -363,12 +373,25 @@
pGetShellSecurityDescriptor=(void*)GetProcAddress(hShlwapi,(char*)475);
+ if(!pGetShellSecurityDescriptor) + { + win_skip("GetShellSecurityDescriptor not available\n"); + return; + } + psd = pGetShellSecurityDescriptor(NULL, 2); ok(psd==NULL, "GetShellSecurityDescriptor should fail\n"); psd = pGetShellSecurityDescriptor(rgsup, 0); ok(psd==NULL, "GetShellSecurityDescriptor should fail\n");
+ SetLastError(0xdeadbeef); psd = pGetShellSecurityDescriptor(rgsup, 2); + if (psd == NULL && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + /* The previous calls to GetShellSecurityDescriptor don't set the last error */ + win_skip("GetShellSecurityDescriptor is not implemented\n"); + return; + } ok(psd!=NULL, "GetShellSecurityDescriptor failed\n"); if (psd!=NULL) {
Modified: trunk/rostests/winetests/shlwapi/path.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/path.c?r... ============================================================================== --- trunk/rostests/winetests/shlwapi/path.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/path.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -82,7 +82,26 @@ {"foo.bar", FALSE}, {"bogusscheme:", TRUE}, {"http:partial", TRUE}, - {"www.winehq.org", FALSE} + {"www.winehq.org", FALSE}, + /* More examples that the user might enter as the browser start page */ + {"winehq.org", FALSE}, + {"ftp.winehq.org", FALSE}, + {"http://winehq.org", TRUE}, + {"http://www.winehq.org", TRUE}, + {"https://winehq.org", TRUE}, + {"https://www.winehq.org", TRUE}, + {"ftp://winehq.org", TRUE}, + {"ftp://ftp.winehq.org", TRUE}, + {"file://does_not_exist.txt", TRUE}, + {"about:blank", TRUE}, + {"about:home", TRUE}, + {"about:mozilla", TRUE}, + /* scheme is case independent */ + {"HTTP://www.winehq.org", TRUE}, + /* a space at the start is not allowed */ + {" http://www.winehq.org", FALSE}, + {"", FALSE}, + {NULL, FALSE} };
struct { @@ -271,62 +290,34 @@ BOOL ret; unsigned int c;
- ret = pPathIsValidCharA( 0x7f, 0 ); - ok ( !ret, "PathIsValidCharA succeeded: 0x%08x\n", (DWORD)ret ); - - ret = pPathIsValidCharA( 0x7f, 1 ); - ok ( !ret, "PathIsValidCharA succeeded: 0x%08x\n", (DWORD)ret ); - for (c = 0; c < 0x7f; c++) { ret = pPathIsValidCharA( c, ~0U ); - ok ( ret == SHELL_charclass[c] || (ret == 1 && SHELL_charclass[c] == 0xffffffff), - "PathIsValidCharA failed: 0x%02x got 0x%08x expected 0x%08x\n", - c, (DWORD)ret, SHELL_charclass[c] ); + ok ( ret || !SHELL_charclass[c], "PathIsValidCharA failed: 0x%02x got 0x%08x\n", c, ret ); }
for (c = 0x7f; c <= 0xff; c++) { ret = pPathIsValidCharA( c, ~0U ); - ok ( ret == 0x00000100, - "PathIsValidCharA failed: 0x%02x got 0x%08x expected 0x00000100\n", - c, (DWORD)ret ); + ok ( ret, "PathIsValidCharA failed: 0x%02x got 0x%08x\n", c, ret ); } }
static void test_PathIsValidCharW(void) { BOOL ret; - unsigned int c, err_count = 0; - - ret = pPathIsValidCharW( 0x7f, 0 ); - ok ( !ret, "PathIsValidCharW succeeded: 0x%08x\n", (DWORD)ret ); - - ret = pPathIsValidCharW( 0x7f, 1 ); - ok ( !ret, "PathIsValidCharW succeeded: 0x%08x\n", (DWORD)ret ); + unsigned int c;
for (c = 0; c < 0x7f; c++) { ret = pPathIsValidCharW( c, ~0U ); - ok ( ret == SHELL_charclass[c] || (ret == 1 && SHELL_charclass[c] == 0xffffffff), - "PathIsValidCharW failed: 0x%02x got 0x%08x expected 0x%08x\n", - c, (DWORD)ret, SHELL_charclass[c] ); + ok ( ret || !SHELL_charclass[c], "PathIsValidCharW failed: 0x%02x got 0x%08x\n", c, ret ); }
for (c = 0x007f; c <= 0xffff; c++) { ret = pPathIsValidCharW( c, ~0U ); - ok ( ret == 0x00000100, - "PathIsValidCharW failed: 0x%02x got 0x%08x expected 0x00000100\n", - c, (DWORD)ret ); - if (ret != 0x00000100) - { - if(++err_count > 100 ) { - trace("skipping rest of PathIsValidCharW tests " - "because of the current number of errors\n"); - break; - } - } + ok ( ret, "PathIsValidCharW failed: 0x%02x got 0x%08x\n", c, ret ); } }
@@ -799,7 +790,7 @@
static void test_PathCanonicalizeA(void) { - char dest[MAX_PATH]; + char dest[LONG_LEN + MAX_PATH]; char too_long[LONG_LEN]; BOOL res;
@@ -891,7 +882,9 @@ res = PathCanonicalizeA(dest, "C:\one/.\two\.."); ok(res, "Expected success\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok(!lstrcmp(dest, "C:\one/."), "Expected C:\one/., got %s\n", dest); + ok(!lstrcmp(dest, "C:\one/.") || + !lstrcmp(dest, "C:\one/"), /* Vista */ + "Expected "C:\one/." or "C:\one/", got "%s"\n", dest);
/* try forward slashes with change dirs * NOTE: if there is a forward slash in between two backslashes, @@ -913,7 +906,8 @@ ok(!res, "Expected failure\n"); todo_wine { - ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); + ok(GetLastError() == 0xdeadbeef || GetLastError() == ERROR_FILENAME_EXCED_RANGE /* Vista */, + "Expected 0xdeadbeef or ERROR_FILENAME_EXCED_RANGE, got %d\n", GetLastError()); } ok(lstrlen(too_long) == LONG_LEN - 1, "Expected length LONG_LEN - 1, got %i\n", lstrlen(too_long)); } @@ -1012,7 +1006,9 @@ lstrcpy(path, "aaaaaaaaa"); root = PathBuildRootA(path, -1); ok(root == path, "Expected root == path, got %p\n", root); - ok(!lstrcmp(path, "aaaaaaaaa"), "Expected aaaaaaaaa, got %s\n", path); + ok(!lstrcmp(path, "aaaaaaaaa") || + lstrlenA(path) == 0, /* Vista */ + "Expected aaaaaaaaa or empty string, got %s\n", path); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError());
/* test a drive number greater than 25 */ @@ -1020,7 +1016,9 @@ lstrcpy(path, "aaaaaaaaa"); root = PathBuildRootA(path, 26); ok(root == path, "Expected root == path, got %p\n", root); - ok(!lstrcmp(path, "aaaaaaaaa"), "Expected aaaaaaaaa, got %s\n", path); + ok(!lstrcmp(path, "aaaaaaaaa") || + lstrlenA(path) == 0, /* Vista */ + "Expected aaaaaaaaa or empty string, got %s\n", path); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError());
/* length of path is less than 4 */
Modified: trunk/rostests/winetests/shlwapi/shlwapi.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/shlwapi.... ============================================================================== --- trunk/rostests/winetests/shlwapi/shlwapi.rbuild [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/shlwapi.rbuild [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -5,6 +5,7 @@ <compilerflag compiler="cc">-Wno-format</compilerflag> <include base="shlwapi_winetest">.</include> <define name="__ROS_LONG64__" /> + <file>assoc.c</file> <file>clist.c</file> <file>clsid.c</file> <file>generated.c</file>
Modified: trunk/rostests/winetests/shlwapi/shreg.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/shreg.c?... ============================================================================== --- trunk/rostests/winetests/shlwapi/shreg.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/shreg.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -31,7 +31,7 @@
/* Keys used for testing */ #define REG_TEST_KEY "Software\Wine\Test" -#define REG_CURRENT_VERSION "Software\Microsoft\Windows\CurrentVersion" +#define REG_CURRENT_VERSION "Software\Microsoft\Windows\CurrentVersion\explorer"
static HMODULE hshlwapi; typedef DWORD (WINAPI *SHCopyKeyA_func)(HKEY,LPCSTR,HKEY,DWORD); @@ -284,6 +284,12 @@ HKEY hKeySrc, hKeyDst; DWORD dwRet;
+ if (!pSHCopyKeyA) + { + win_skip("SHCopyKeyA is not available\n"); + return; + } + /* Delete existing destination sub keys */ hKeyDst = NULL; if (!RegOpenKeyA(HKEY_CURRENT_USER, REG_TEST_KEY "\CopyDestination", &hKeyDst) && hKeyDst) @@ -305,22 +311,19 @@ if (dwRet || !hKeySrc) { ok( 0, "Source couldn't be opened, RegOpenKeyA returned (%u)\n", dwRet); + RegCloseKey(hKeyDst); return; }
- - if (pSHCopyKeyA) - { - dwRet = (*pSHCopyKeyA)(hKeySrc, NULL, hKeyDst, 0); - ok ( ERROR_SUCCESS == dwRet, "Copy failed, ret=(%u)\n", dwRet); - } + dwRet = (*pSHCopyKeyA)(hKeySrc, NULL, hKeyDst, 0); + ok ( ERROR_SUCCESS == dwRet, "Copy failed, ret=(%u)\n", dwRet);
RegCloseKey(hKeySrc); RegCloseKey(hKeyDst);
/* Check we copied the sub keys, i.e. something that's on every windows system (including Wine) */ hKeyDst = NULL; - dwRet = RegOpenKeyA(HKEY_CURRENT_USER, REG_TEST_KEY "\CopyDestination\Setup", &hKeyDst); + dwRet = RegOpenKeyA(HKEY_CURRENT_USER, REG_TEST_KEY "\CopyDestination\Shell Folders", &hKeyDst); if (dwRet || !hKeyDst) { ok ( 0, "Copy couldn't be opened, RegOpenKeyA returned (%u)\n", dwRet); @@ -328,7 +331,7 @@ }
/* And the we copied the values too */ - ok(!SHQueryValueExA(hKeyDst, "BootDir", NULL, NULL, NULL, NULL), "SHQueryValueExA failed\n"); + ok(!SHQueryValueExA(hKeyDst, "Common AppData", NULL, NULL, NULL, NULL), "SHQueryValueExA failed\n");
RegCloseKey(hKeyDst); }
Modified: trunk/rostests/winetests/shlwapi/string.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/string.c... ============================================================================== --- trunk/rostests/winetests/shlwapi/string.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/string.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -33,6 +33,11 @@ #define expect_eq(expr, val, type, fmt) do { \ type ret = expr; \ ok(ret == val, "Unexpected value of '" #expr "': " #fmt " instead of " #val "\n", ret); \ +} while (0); + +#define expect_eq2(expr, val1, val2, type, fmt) do { \ + type ret = expr; \ + ok(ret == val1 || ret == val2, "Unexpected value of '" #expr "': " #fmt " instead of " #val1 " or " #val2 "\n", ret); \ } while (0);
static BOOL (WINAPI *pIntlStrEqWorkerA)(BOOL,LPCSTR,LPCSTR,int); @@ -198,9 +203,8 @@ for (count = 32; count < 128; count++) { LPSTR result = StrChrA(string+32, count); - ok(result - string == count, - "found char '%c' in wrong place: got %d, expected %d\n", - count, result - string, count); + INT pos = result - string; + ok(pos == count, "found char '%c' in wrong place: got %d, expected %d\n", count, pos, count); }
for (count = 32; count < 128; count++) @@ -335,9 +339,8 @@ for (count = 32; count < 128; count++) { LPWSTR result = StrRChrW(string+32, NULL, count); - ok(result - string == count, - "found char %d in wrong place: got %d, expected %d\n", - count, result - string, count); + INT pos = result - string; + ok(pos == count, "found char %d in wrong place: got %d, expected %d\n", count, pos, count); }
for (count = 32; count < 128; count++) @@ -481,7 +484,7 @@ if (lpszStr) { ok(!strcmp(result->byte_size_64, lpszStr), "Copied string wrong\n"); - LocalFree((HLOCAL)lpszStr); + LocalFree(lpszStr); } result++; } @@ -491,7 +494,7 @@ */ lpszStr = StrDupA(NULL); ok(lpszStr == NULL || *lpszStr == '\0', "NULL string returned %p\n", lpszStr); - LocalFree((HLOCAL)lpszStr); + LocalFree(lpszStr); }
static void test_StrFormatByteSize64A(void) @@ -659,16 +662,14 @@ ret = pStrRetToBSTR(&strret, NULL, &bstr); ok(ret == S_OK && bstr && !strcmpW(bstr, szTestW), "STRRET_WSTR: dup failed, ret=0x%08x, bstr %p\n", ret, bstr); - if (bstr) - SysFreeString(bstr); + SysFreeString(bstr);
strret.uType = STRRET_CSTR; lstrcpyA(U(strret).cStr, "Test"); ret = pStrRetToBSTR(&strret, NULL, &bstr); ok(ret == S_OK && bstr && !strcmpW(bstr, szTestW), "STRRET_CSTR: dup failed, ret=0x%08x, bstr %p\n", ret, bstr); - if (bstr) - SysFreeString(bstr); + SysFreeString(bstr);
strret.uType = STRRET_OFFSET; U(strret).uOffset = 1; @@ -676,8 +677,7 @@ ret = pStrRetToBSTR(&strret, iidl, &bstr); ok(ret == S_OK && bstr && !strcmpW(bstr, szTestW), "STRRET_OFFSET: dup failed, ret=0x%08x, bstr %p\n", ret, bstr); - if (bstr) - SysFreeString(bstr); + SysFreeString(bstr);
/* Native crashes if str is NULL */ } @@ -850,7 +850,7 @@ memset(wbuf, 0xbf, sizeof(wbuf)); strret.uType = STRRET_WSTR; U(strret).pOleStr = StrDupW(wstr1); - expect_eq(pStrRetToBufW(&strret, NULL, wbuf, 10), S_OK, HRESULT, "%x"); + expect_eq2(pStrRetToBufW(&strret, NULL, wbuf, 10), S_OK, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) /* Vista */, HRESULT, "%x"); expect_eq(wbuf[9], 0, WCHAR, "%x"); expect_eq(wbuf[10], (WCHAR)0xbfbf, WCHAR, "%x"); } @@ -862,7 +862,7 @@ memset(buf, 0xbf, sizeof(buf)); strret.uType = STRRET_CSTR; StrCpyN(U(strret).cStr, str1, MAX_PATH); - expect_eq(pStrRetToBufA(&strret, NULL, buf, 10), S_OK, HRESULT, "%x"); + expect_eq2(pStrRetToBufA(&strret, NULL, buf, 10), S_OK, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) /* Vista */, HRESULT, "%x"); expect_eq(buf[9], 0, CHAR, "%x"); expect_eq(buf[10], (CHAR)0xbf, CHAR, "%x"); } @@ -873,7 +873,7 @@ { memset(buf, 0xbf, sizeof(buf)); ret = pwnsprintfA(buf, 10, "%s", str1); - todo_wine ok(ret == 9, "Unexpected wsnprintfA return %d, expected 9\n", ret); + ok(broken(ret == 9) || ret == -1 /* Vista */, "Unexpected wsnprintfA return %d, expected 9 or -1\n", ret); expect_eq(buf[9], 0, CHAR, "%x"); expect_eq(buf[10], (CHAR)0xbf, CHAR, "%x"); } @@ -884,7 +884,7 @@ { memset(wbuf, 0xbf, sizeof(wbuf)); ret = pwnsprintfW(wbuf, 10, fmt, wstr1); - todo_wine ok(ret == 9, "Unexpected wsnprintfW return %d, expected 9\n", ret); + ok(broken(ret == 9) || ret == -1 /* Vista */, "Unexpected wsnprintfW return %d, expected 9 or -1\n", ret); expect_eq(wbuf[9], 0, WCHAR, "%x"); expect_eq(wbuf[10], (WCHAR)0xbfbf, WCHAR, "%x"); }
Modified: trunk/rostests/winetests/shlwapi/url.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shlwapi/url.c?re... ============================================================================== --- trunk/rostests/winetests/shlwapi/url.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shlwapi/url.c [iso-8859-1] Sat Jan 31 08:49:08 2009 @@ -1,7 +1,7 @@ /* Unit test suite for Path functions * * Copyright 2002 Matthew Mastracci - * Copyright 2007 Detlef Riekenberg + * Copyright 2007,2008 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -37,6 +37,35 @@ static const char* TEST_URL_3 = "http://foo:bar@localhost:21/internal.php?query=x&return=y"; static const WCHAR winehqW[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/',0}; static const CHAR winehqA[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/',0}; + +/* ################ */ + +static const CHAR untouchedA[] = "untouched"; + +#define TEST_APPLY_MAX_LENGTH INTERNET_MAX_URL_LENGTH + +typedef struct _TEST_URL_APPLY { + const char * url; + DWORD flags; + HRESULT res; + DWORD newlen; + const char * newurl; +} TEST_URL_APPLY; + +static const TEST_URL_APPLY TEST_APPLY[] = { + {"www.winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 21, "http://www.winehq.org%22%7D, + {"www.winehq.org", URL_APPLY_GUESSSCHEME, S_OK, 21, "http://www.winehq.org%22%7D, + {"www.winehq.org", URL_APPLY_DEFAULT, S_OK, 21, "http://www.winehq.org%22%7D, + {"ftp.winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 20, "ftp://ftp.winehq.org"}, + {"ftp.winehq.org", URL_APPLY_GUESSSCHEME, S_OK, 20, "ftp://ftp.winehq.org"}, + {"ftp.winehq.org", URL_APPLY_DEFAULT, S_OK, 21, "http://ftp.winehq.org%22%7D, + {"winehq.org", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 17, "http://winehq.org%22%7D, + {"winehq.org", URL_APPLY_GUESSSCHEME, S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, + {"winehq.org", URL_APPLY_DEFAULT, S_OK, 17, "http://winehq.org%22%7D, + {"", URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT, S_OK, 7, "http://%22%7D, + {"", URL_APPLY_GUESSSCHEME, S_FALSE, TEST_APPLY_MAX_LENGTH, untouchedA}, + {"", URL_APPLY_DEFAULT, S_OK, 7, "http://%22%7D +};
/* ################ */
@@ -103,7 +132,7 @@ {"res:///c:\tests\foo bar", URL_DONT_SIMPLIFY, S_OK, "res:///c:\tests\foo bar", TRUE}, {"A", 0, S_OK, "A", FALSE}, {"/uri-res/N2R?urn:sha1:B3K", URL_DONT_ESCAPE_EXTRA_INFO | URL_WININET_COMPATIBILITY /*0x82000000*/, S_OK, "/uri-res/N2R?urn:sha1:B3K", TRUE} /*LimeWire online installer calls this*/, - {"", 0, S_OK, "", FALSE} + {"http:www.winehq.org/dir/../index.html", 0, S_OK, "http:www.winehq.org/index.html"}, };
/* ################ */ @@ -233,6 +262,8 @@ {"foo:today", "bar:calendar", 0, S_OK, "bar:calendar"}, {"foo:/today", "foo:calendar", 0, S_OK, "foo:/calendar"}, {"foo:/today/", "foo:calendar", 0, S_OK, "foo:/today/calendar"}, + {"mk:@MSITStore:dir/test.chm::dir/index.html", "image.jpg", 0, S_OK, "mk:@MSITStore:dir/test.chm::dir/image.jpg"}, + {"mk:@MSITStore:dir/test.chm::dir/dir2/index.html", "../image.jpg", 0, S_OK, "mk:@MSITStore:dir/test.chm::dir/image.jpg"} };
/* ################ */ @@ -264,7 +295,8 @@ const char *expect; } TEST_URL_UNESCAPE[] = { {"file://foo/bar", "file://foo/bar"}, - {"file://fo%20o%5Ca/bar", "file://fo o\a/bar"} + {"file://fo%20o%5Ca/bar", "file://fo o\a/bar"}, + {"file://%24%25foobar", "file://$%foobar"} };
/* ################ */ @@ -335,6 +367,79 @@
/* ########################### */
+static void test_UrlApplyScheme(void) +{ + CHAR newurl[TEST_APPLY_MAX_LENGTH]; + WCHAR urlW[TEST_APPLY_MAX_LENGTH]; + WCHAR newurlW[TEST_APPLY_MAX_LENGTH]; + HRESULT res; + DWORD len; + DWORD i; + + for(i = 0; i < sizeof(TEST_APPLY)/sizeof(TEST_APPLY[0]); i++) { + len = TEST_APPLY_MAX_LENGTH; + lstrcpyA(newurl, untouchedA); + res = UrlApplySchemeA(TEST_APPLY[i].url, newurl, &len, TEST_APPLY[i].flags); + ok( res == TEST_APPLY[i].res, + "#%dA: got HRESULT 0x%x (expected 0x%x)\n", i, res, TEST_APPLY[i].res); + + ok( len == TEST_APPLY[i].newlen, + "#%dA: got len %d (expected %d)\n", i, len, TEST_APPLY[i].newlen); + + ok( !lstrcmpA(newurl, TEST_APPLY[i].newurl), + "#%dA: got '%s' (expected '%s')\n", i, newurl, TEST_APPLY[i].newurl); + + /* returned length is in character */ + len = TEST_APPLY_MAX_LENGTH; + lstrcpyA(newurl, untouchedA); + MultiByteToWideChar(CP_ACP, 0, newurl, -1, newurlW, len); + MultiByteToWideChar(CP_ACP, 0, TEST_APPLY[i].url, -1, urlW, len); + + res = UrlApplySchemeW(urlW, newurlW, &len, TEST_APPLY[i].flags); + WideCharToMultiByte(CP_ACP, 0, newurlW, -1, newurl, TEST_APPLY_MAX_LENGTH, NULL, NULL); + ok( res == TEST_APPLY[i].res, + "#%dW: got HRESULT 0x%x (expected 0x%x)\n", i, res, TEST_APPLY[i].res); + + ok( len == TEST_APPLY[i].newlen, + "#%dW: got len %d (expected %d)\n", i, len, TEST_APPLY[i].newlen); + + ok( !lstrcmpA(newurl, TEST_APPLY[i].newurl), + "#%dW: got '%s' (expected '%s')\n", i, newurl, TEST_APPLY[i].newurl); + + } + + /* buffer too small */ + lstrcpyA(newurl, untouchedA); + len = lstrlenA(TEST_APPLY[0].newurl); + res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, &len, TEST_APPLY[0].flags); + ok(res == E_POINTER, "got HRESULT 0x%x (expected E_POINTER)\n", res); + /* The returned length include the space for the terminating 0 */ + i = lstrlenA(TEST_APPLY[0].newurl)+1; + ok(len == i, "got len %d (expected %d)\n", len, i); + ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); + + /* NULL as parameter. The length and the buffer are not modified */ + lstrcpyA(newurl, untouchedA); + len = TEST_APPLY_MAX_LENGTH; + res = UrlApplySchemeA(NULL, newurl, &len, TEST_APPLY[0].flags); + ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); + ok(len == TEST_APPLY_MAX_LENGTH, "got len %d\n", len); + ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); + + len = TEST_APPLY_MAX_LENGTH; + res = UrlApplySchemeA(TEST_APPLY[0].url, NULL, &len, TEST_APPLY[0].flags); + ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); + ok(len == TEST_APPLY_MAX_LENGTH, "got len %d\n", len); + + lstrcpyA(newurl, untouchedA); + res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, NULL, TEST_APPLY[0].flags); + ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); + ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); + +} + +/* ########################### */ + static void hash_url(const char* szUrl) { LPCSTR szTestUrl = szUrl; @@ -441,19 +546,23 @@
}
-static void test_url_canonicalize(int index, const char *szUrl, DWORD dwFlags, HRESULT dwExpectReturn, const char *szExpectUrl, BOOL todo) +static void test_url_canonicalize(int index, const char *szUrl, DWORD dwFlags, HRESULT dwExpectReturn, HRESULT dwExpectReturnAlt, const char *szExpectUrl, BOOL todo) { CHAR szReturnUrl[INTERNET_MAX_URL_LENGTH]; WCHAR wszReturnUrl[INTERNET_MAX_URL_LENGTH]; LPWSTR wszUrl = GetWideString(szUrl); LPWSTR wszExpectUrl = GetWideString(szExpectUrl); LPWSTR wszConvertedUrl; + HRESULT ret;
DWORD dwSize;
dwSize = INTERNET_MAX_URL_LENGTH; ok(UrlCanonicalizeA(szUrl, NULL, &dwSize, dwFlags) != dwExpectReturn, "Unexpected return for NULL buffer, index %d\n", index); - ok(UrlCanonicalizeA(szUrl, szReturnUrl, &dwSize, dwFlags) == dwExpectReturn, "UrlCanonicalizeA didn't return 0x%08x, index %d\n", dwExpectReturn, index); + ret = UrlCanonicalizeA(szUrl, szReturnUrl, &dwSize, dwFlags); + ok(ret == dwExpectReturn || ret == dwExpectReturnAlt, + "UrlCanonicalizeA failed: expected=0x%08x or 0x%08x, got=0x%08x, index %d\n", + dwExpectReturn, dwExpectReturnAlt, ret, index); if (todo) todo_wine ok(strcmp(szReturnUrl,szExpectUrl)==0, "UrlCanonicalizeA dwFlags 0x%08x url '%s' Expected "%s", but got "%s", index %d\n", dwFlags, szUrl, szExpectUrl, szReturnUrl, index); @@ -562,11 +671,12 @@ "got 0x%x with %u and size %u for '%s' and %u (expected 'S_OK' and size %u)\n", hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), urllen);
+ test_url_canonicalize(-1, "", 0, S_OK, S_FALSE /* Vista/win2k8 */, "", FALSE);
/* test url-modification */ for(i=0; i<sizeof(TEST_CANONICALIZE)/sizeof(TEST_CANONICALIZE[0]); i++) { test_url_canonicalize(i, TEST_CANONICALIZE[i].url, TEST_CANONICALIZE[i].flags, - TEST_CANONICALIZE[i].expectret, TEST_CANONICALIZE[i].expecturl, + TEST_CANONICALIZE[i].expectret, TEST_CANONICALIZE[i].expectret, TEST_CANONICALIZE[i].expecturl, TEST_CANONICALIZE[i].todo); } } @@ -636,7 +746,7 @@ BOOL choped; int pos;
- MultiByteToWideChar(CP_UTF8, 0, "http://www.winehq.org/X", -1, szUrl, 128); + MultiByteToWideChar(CP_ACP, 0, "http://www.winehq.org/X", -1, szUrl, 128); pos = lstrlenW(szUrl) - 1; szUrl[pos] = i; urllen = INTERNET_MAX_URL_LENGTH; @@ -801,13 +911,20 @@ DWORD dwEscaped; size_t i; static char inplace[] = "file:///C:/Program%20Files"; + static char another_inplace[] = "file:///C:/Program%20Files"; static const char expected[] = "file:///C:/Program Files"; static WCHAR inplaceW[] = {'f','i','l','e',':','/','/','/','C',':','/','P','r','o','g','r','a','m',' ','F','i','l','e','s',0}; + static WCHAR another_inplaceW[] = {'f','i','l','e',':','/','/','/','C',':','/','P','r','o','g','r','a','m','%','2','0','F','i','l','e','s',0};
for(i=0; i<sizeof(TEST_URL_UNESCAPE)/sizeof(TEST_URL_UNESCAPE[0]); i++) { dwEscaped=INTERNET_MAX_URL_LENGTH; ok(UrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, &dwEscaped, 0) == S_OK, "UrlUnescapeA didn't return 0x%08x from "%s"\n", S_OK, TEST_URL_UNESCAPE[i].url); ok(strcmp(szReturnUrl,TEST_URL_UNESCAPE[i].expect)==0, "Expected "%s", but got "%s" from "%s"\n", TEST_URL_UNESCAPE[i].expect, szReturnUrl, TEST_URL_UNESCAPE[i].url); + + ZeroMemory(szReturnUrl, sizeof(szReturnUrl)); + /* if we set the bufferpointer to NULL here UrlUnescape fails and string gets not converted */ + ok(UrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, NULL, 0) == E_INVALIDARG, "UrlUnescapeA didn't return 0x%08x from "%s"\n", E_INVALIDARG ,TEST_URL_UNESCAPE[i].url); + ok(strcmp(szReturnUrl,"")==0, "Expected empty string\n");
dwEscaped = INTERNET_MAX_URL_LENGTH; urlW = GetWideString(TEST_URL_UNESCAPE[i].url); @@ -824,9 +941,18 @@ ok(!strcmp(inplace, expected), "got %s expected %s\n", inplace, expected); ok(dwEscaped == 27, "got %d expected 27\n", dwEscaped);
+ /* if we set the bufferpointer to NULL, the string apparently still gets converted (Google Lively does this)) */ + ok(UrlUnescapeA(another_inplace, NULL, NULL, URL_UNESCAPE_INPLACE) == S_OK, "UrlUnescapeA failed unexpectedly\n"); + ok(!strcmp(another_inplace, expected), "got %s expected %s\n", another_inplace, expected); + dwEscaped = sizeof(inplaceW); ok(UrlUnescapeW(inplaceW, NULL, &dwEscaped, URL_UNESCAPE_INPLACE) == S_OK, "UrlUnescapeW failed unexpectedly\n"); ok(dwEscaped == 50, "got %d expected 50\n", dwEscaped); + + /* if we set the bufferpointer to NULL, the string apparently still gets converted (Google Lively does this)) */ + ok(UrlUnescapeW(another_inplaceW, NULL, NULL, URL_UNESCAPE_INPLACE) == S_OK, "UrlUnescapeW failed unexpectedly\n"); + ok(lstrlenW(another_inplaceW) == 24, "got %d expected 24\n", lstrlenW(another_inplaceW)); + }
/* ########################### */ @@ -837,6 +963,7 @@ hShlwapi = GetModuleHandleA("shlwapi.dll"); pUrlCanonicalizeW = (void *) GetProcAddress(hShlwapi, "UrlCanonicalizeW");
+ test_UrlApplyScheme(); test_UrlHash(); test_UrlGetPart(); test_UrlCanonicalizeA();