mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:12:57 +00:00
[SHELL32_WINETEST] Sync with Wine Staging 1.9.11. CORE-11368
svn path=/trunk/; revision=71781
This commit is contained in:
parent
2e960e0505
commit
6b4d3c57da
11 changed files with 356 additions and 129 deletions
|
@ -232,10 +232,7 @@ static void test_setpos(void)
|
||||||
windows[0].registered = TRUE;
|
windows[0].registered = TRUE;
|
||||||
windows[0].to_be_deleted = FALSE;
|
windows[0].to_be_deleted = FALSE;
|
||||||
windows[0].edge = ABE_BOTTOM;
|
windows[0].edge = ABE_BOTTOM;
|
||||||
windows[0].desired_rect.left = 0;
|
SetRect(&windows[0].desired_rect, 0, screen_height - 15, screen_width, screen_height);
|
||||||
windows[0].desired_rect.right = screen_width;
|
|
||||||
windows[0].desired_rect.top = screen_height - 15;
|
|
||||||
windows[0].desired_rect.bottom = screen_height;
|
|
||||||
SetWindowLongPtrA(windows[0].hwnd, GWLP_USERDATA, (LONG_PTR)&windows[0]);
|
SetWindowLongPtrA(windows[0].hwnd, GWLP_USERDATA, (LONG_PTR)&windows[0]);
|
||||||
testwindow_setpos(windows[0].hwnd);
|
testwindow_setpos(windows[0].hwnd);
|
||||||
do_events();
|
do_events();
|
||||||
|
@ -253,10 +250,7 @@ static void test_setpos(void)
|
||||||
windows[1].registered = TRUE;
|
windows[1].registered = TRUE;
|
||||||
windows[1].to_be_deleted = FALSE;
|
windows[1].to_be_deleted = FALSE;
|
||||||
windows[1].edge = ABE_BOTTOM;
|
windows[1].edge = ABE_BOTTOM;
|
||||||
windows[1].desired_rect.left = 0;
|
SetRect(&windows[1].desired_rect, 0, screen_height - 10, screen_width, screen_height);
|
||||||
windows[1].desired_rect.right = screen_width;
|
|
||||||
windows[1].desired_rect.top = screen_height - 10;
|
|
||||||
windows[1].desired_rect.bottom = screen_height;
|
|
||||||
SetWindowLongPtrA(windows[1].hwnd, GWLP_USERDATA, (LONG_PTR)&windows[1]);
|
SetWindowLongPtrA(windows[1].hwnd, GWLP_USERDATA, (LONG_PTR)&windows[1]);
|
||||||
testwindow_setpos(windows[1].hwnd);
|
testwindow_setpos(windows[1].hwnd);
|
||||||
|
|
||||||
|
@ -285,10 +279,7 @@ static void test_setpos(void)
|
||||||
windows[2].registered = TRUE;
|
windows[2].registered = TRUE;
|
||||||
windows[2].to_be_deleted = FALSE;
|
windows[2].to_be_deleted = FALSE;
|
||||||
windows[2].edge = ABE_BOTTOM;
|
windows[2].edge = ABE_BOTTOM;
|
||||||
windows[2].desired_rect.left = 0;
|
SetRect(&windows[2].desired_rect, 0, screen_height - 10, screen_width, screen_height);
|
||||||
windows[2].desired_rect.right = screen_width;
|
|
||||||
windows[2].desired_rect.top = screen_height - 10;
|
|
||||||
windows[2].desired_rect.bottom = screen_height;
|
|
||||||
SetWindowLongPtrA(windows[2].hwnd, GWLP_USERDATA, (LONG_PTR)&windows[2]);
|
SetWindowLongPtrA(windows[2].hwnd, GWLP_USERDATA, (LONG_PTR)&windows[2]);
|
||||||
testwindow_setpos(windows[2].hwnd);
|
testwindow_setpos(windows[2].hwnd);
|
||||||
|
|
||||||
|
@ -299,10 +290,7 @@ static void test_setpos(void)
|
||||||
|
|
||||||
/* move windows[2] to the right side of the screen */
|
/* move windows[2] to the right side of the screen */
|
||||||
windows[2].edge = ABE_RIGHT;
|
windows[2].edge = ABE_RIGHT;
|
||||||
windows[2].desired_rect.left = screen_width - 15;
|
SetRect(&windows[2].desired_rect, screen_width - 15, 0, screen_width, screen_height);
|
||||||
windows[2].desired_rect.right = screen_width;
|
|
||||||
windows[2].desired_rect.top = 0;
|
|
||||||
windows[2].desired_rect.bottom = screen_height;
|
|
||||||
testwindow_setpos(windows[2].hwnd);
|
testwindow_setpos(windows[2].hwnd);
|
||||||
|
|
||||||
do_events_until(no_appbars_intersect);
|
do_events_until(no_appbars_intersect);
|
||||||
|
@ -312,10 +300,7 @@ static void test_setpos(void)
|
||||||
|
|
||||||
/* move windows[1] to the top of the screen */
|
/* move windows[1] to the top of the screen */
|
||||||
windows[1].edge = ABE_TOP;
|
windows[1].edge = ABE_TOP;
|
||||||
windows[1].desired_rect.left = 0;
|
SetRect(&windows[1].desired_rect, 0, 0, screen_width, 15);
|
||||||
windows[1].desired_rect.right = screen_width;
|
|
||||||
windows[1].desired_rect.top = 0;
|
|
||||||
windows[1].desired_rect.bottom = 15;
|
|
||||||
testwindow_setpos(windows[1].hwnd);
|
testwindow_setpos(windows[1].hwnd);
|
||||||
|
|
||||||
do_events_until(no_appbars_intersect);
|
do_events_until(no_appbars_intersect);
|
||||||
|
@ -325,10 +310,7 @@ static void test_setpos(void)
|
||||||
|
|
||||||
/* move windows[1] back to the bottom of the screen */
|
/* move windows[1] back to the bottom of the screen */
|
||||||
windows[1].edge = ABE_BOTTOM;
|
windows[1].edge = ABE_BOTTOM;
|
||||||
windows[1].desired_rect.left = 0;
|
SetRect(&windows[1].desired_rect, 0, screen_height - 10, screen_width, screen_height);
|
||||||
windows[1].desired_rect.right = screen_width;
|
|
||||||
windows[1].desired_rect.top = screen_height - 10;
|
|
||||||
windows[1].desired_rect.bottom = screen_height;
|
|
||||||
testwindow_setpos(windows[1].hwnd);
|
testwindow_setpos(windows[1].hwnd);
|
||||||
|
|
||||||
do_events_until(no_appbars_intersect);
|
do_events_until(no_appbars_intersect);
|
||||||
|
|
|
@ -100,14 +100,85 @@ static struct assoc_getstring_test getstring_tests[] =
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void getstring_test(LPCWSTR assocName, HKEY progIdKey, ASSOCSTR str, LPCWSTR expected_string, int line)
|
||||||
|
{
|
||||||
|
IQueryAssociations *assoc;
|
||||||
|
HRESULT hr;
|
||||||
|
WCHAR *buffer;
|
||||||
|
DWORD len;
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_QueryAssociations, NULL, CLSCTX_INPROC_SERVER, &IID_IQueryAssociations, (void*)&assoc);
|
||||||
|
ok_(__FILE__, line)(hr == S_OK, "failed to create IQueryAssociations, 0x%x\n", hr);
|
||||||
|
hr = IQueryAssociations_Init(assoc, 0, assocName, progIdKey, NULL);
|
||||||
|
ok_(__FILE__, line)(hr == S_OK, "IQueryAssociations::Init failed, 0x%x\n", hr);
|
||||||
|
|
||||||
|
hr = IQueryAssociations_GetString(assoc, 0, str, NULL, NULL, &len);
|
||||||
|
if (hr != S_FALSE) {
|
||||||
|
if (expected_string) {
|
||||||
|
ok_(__FILE__, line)(SUCCEEDED(hr), "GetString returned 0x%x, expected success\n", hr);
|
||||||
|
} else {
|
||||||
|
ok_(__FILE__, line)(FAILED(hr), "GetString returned 0x%x, expected failure\n", hr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
||||||
|
ok_(__FILE__, line)(buffer != NULL, "out of memory\n");
|
||||||
|
hr = IQueryAssociations_GetString(assoc, 0, str, NULL, buffer, &len);
|
||||||
|
|
||||||
|
if (expected_string) {
|
||||||
|
ok_(__FILE__, line)(lstrcmpW(buffer, expected_string) == 0, "GetString returned %s, expected %s\n",
|
||||||
|
wine_dbgstr_w(buffer), wine_dbgstr_w(expected_string));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void test_IQueryAssociations_GetString(void)
|
static void test_IQueryAssociations_GetString(void)
|
||||||
{
|
{
|
||||||
|
static WCHAR test_extensionW[] = {'.','t','e','s','t',0};
|
||||||
|
static WCHAR test_progidW[] = {'t','e','s','t','f','i','l','e',0};
|
||||||
|
static WCHAR DefaultIconW[] = {'D','e','f','a','u','l','t','I','c','o','n',0};
|
||||||
|
/* folder.ico, why not */
|
||||||
|
static WCHAR test_iconW[] = {'s','h','e','l','l','3','2','.','d','l','l',',','1',0};
|
||||||
|
HKEY test_extension_key;
|
||||||
|
HKEY test_progid_key;
|
||||||
|
HKEY test_defaulticon_key;
|
||||||
|
LRESULT r;
|
||||||
|
|
||||||
struct assoc_getstring_test *ptr = getstring_tests;
|
struct assoc_getstring_test *ptr = getstring_tests;
|
||||||
IQueryAssociations *assoc;
|
IQueryAssociations *assoc;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
r = RegCreateKeyExW(HKEY_CLASSES_ROOT, test_extensionW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &test_extension_key, NULL);
|
||||||
|
if (r == ERROR_ACCESS_DENIED)
|
||||||
|
{
|
||||||
|
win_skip("Not enough permissions to create a test key.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok(r == ERROR_SUCCESS, "RegCreateKeyExW(HKCR, \".test\") failed: 0x%lx\n", r);
|
||||||
|
r = RegSetValueExW(test_extension_key, NULL, 0, REG_SZ, (PBYTE)test_progidW, sizeof(test_progidW));
|
||||||
|
ok(r == ERROR_SUCCESS, "RegSetValueExW(HKCR\\.test, NULL, \"testfile\") failed: 0x%lx\n", r);
|
||||||
|
|
||||||
|
/* adding progid key with no information should fail to return information */
|
||||||
|
r = RegCreateKeyExW(HKEY_CLASSES_ROOT, test_progidW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &test_progid_key, NULL);
|
||||||
|
ok(r == ERROR_SUCCESS, "RegCreateKeyExW(HKCR, \"testfile\") failed: 0x%lx\n", r);
|
||||||
|
getstring_test(test_extensionW, NULL, ASSOCSTR_DEFAULTICON, NULL, __LINE__);
|
||||||
|
getstring_test(test_progidW, NULL, ASSOCSTR_DEFAULTICON, NULL, __LINE__);
|
||||||
|
getstring_test(NULL, test_progid_key, ASSOCSTR_DEFAULTICON, NULL, __LINE__);
|
||||||
|
|
||||||
|
/* adding information to the progid should return that information */
|
||||||
|
r = RegCreateKeyExW(test_progid_key, DefaultIconW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &test_defaulticon_key, NULL);
|
||||||
|
ok(r == ERROR_SUCCESS, "RegCreateKeyExW(HKCR\\testfile\\DefaultIcon) failed: 0x%lx\n", r);
|
||||||
|
r = RegSetValueExW(test_defaulticon_key, NULL, 0, REG_SZ, (PBYTE)test_iconW, sizeof(test_iconW));
|
||||||
|
ok(r == ERROR_SUCCESS, "RegSetValueExW(HKCR\\testfile\\DefaultIcon, NULL, \"folder.ico\") failed: 0x%lx\n", r);
|
||||||
|
getstring_test(test_extensionW, NULL, ASSOCSTR_DEFAULTICON, test_iconW, __LINE__);
|
||||||
|
getstring_test(test_progidW, NULL, ASSOCSTR_DEFAULTICON, test_iconW, __LINE__);
|
||||||
|
getstring_test(NULL, test_progid_key, ASSOCSTR_DEFAULTICON, test_iconW, __LINE__);
|
||||||
|
|
||||||
|
RegDeleteKeyW(HKEY_CLASSES_ROOT, test_extensionW);
|
||||||
|
RegDeleteKeyW(HKEY_CLASSES_ROOT, test_progidW);
|
||||||
|
|
||||||
hr = CoCreateInstance(&CLSID_QueryAssociations, NULL, CLSCTX_INPROC_SERVER, &IID_IQueryAssociations, (void*)&assoc);
|
hr = CoCreateInstance(&CLSID_QueryAssociations, NULL, CLSCTX_INPROC_SERVER, &IID_IQueryAssociations, (void*)&assoc);
|
||||||
ok(hr == S_OK, "failed to create object, 0x%x\n", hr);
|
ok(hr == S_OK, "failed to create object, 0x%x\n", hr);
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@ static HRESULT ebrowser_instantiate(IExplorerBrowser **peb)
|
||||||
static HRESULT ebrowser_initialize(IExplorerBrowser *peb)
|
static HRESULT ebrowser_initialize(IExplorerBrowser *peb)
|
||||||
{
|
{
|
||||||
RECT rc;
|
RECT rc;
|
||||||
rc.top = rc.left = 0; rc.bottom = rc.right = 500;
|
SetRect(&rc, 0, 0, 500, 500);
|
||||||
return IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
return IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -802,7 +802,7 @@ static void test_initialization(void)
|
||||||
/* Initialize with a few different rectangles */
|
/* Initialize with a few different rectangles */
|
||||||
peb = NULL;
|
peb = NULL;
|
||||||
ebrowser_instantiate(&peb);
|
ebrowser_instantiate(&peb);
|
||||||
rc.left = 50; rc.top = 20; rc.right = 100; rc.bottom = 80;
|
SetRect(&rc, 50, 20, 100, 80);
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
|
hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
|
||||||
|
@ -861,7 +861,7 @@ static void test_initialization(void)
|
||||||
ebrowser_instantiate(&peb);
|
ebrowser_instantiate(&peb);
|
||||||
hr = IExplorerBrowser_SetOptions(peb, EBO_NOBORDER);
|
hr = IExplorerBrowser_SetOptions(peb, EBO_NOBORDER);
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
rc.left = 50; rc.top = 20; rc.right = 100; rc.bottom = 80;
|
SetRect(&rc, 50, 20, 100, 80);
|
||||||
|
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
|
@ -881,7 +881,7 @@ static void test_initialization(void)
|
||||||
|
|
||||||
/* empty rectangle */
|
/* empty rectangle */
|
||||||
ebrowser_instantiate(&peb);
|
ebrowser_instantiate(&peb);
|
||||||
rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0;
|
SetRectEmpty(&rc);
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
IExplorerBrowser_Destroy(peb);
|
IExplorerBrowser_Destroy(peb);
|
||||||
|
@ -889,7 +889,7 @@ static void test_initialization(void)
|
||||||
ok(lres == 0, "Got refcount %d\n", lres);
|
ok(lres == 0, "Got refcount %d\n", lres);
|
||||||
|
|
||||||
ebrowser_instantiate(&peb);
|
ebrowser_instantiate(&peb);
|
||||||
rc.left = -1; rc.top = -1; rc.right = 1; rc.bottom = 1;
|
SetRect(&rc, -1, -1, 1, 1);
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
IExplorerBrowser_Destroy(peb);
|
IExplorerBrowser_Destroy(peb);
|
||||||
|
@ -897,7 +897,7 @@ static void test_initialization(void)
|
||||||
ok(lres == 0, "Got refcount %d\n", lres);
|
ok(lres == 0, "Got refcount %d\n", lres);
|
||||||
|
|
||||||
ebrowser_instantiate(&peb);
|
ebrowser_instantiate(&peb);
|
||||||
rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5;
|
SetRect(&rc, 10, 10, 5, 5);
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
IExplorerBrowser_Destroy(peb);
|
IExplorerBrowser_Destroy(peb);
|
||||||
|
@ -905,7 +905,7 @@ static void test_initialization(void)
|
||||||
ok(lres == 0, "Got refcount %d\n", lres);
|
ok(lres == 0, "Got refcount %d\n", lres);
|
||||||
|
|
||||||
ebrowser_instantiate(&peb);
|
ebrowser_instantiate(&peb);
|
||||||
rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5;
|
SetRect(&rc, 10, 10, 5, 5);
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
IExplorerBrowser_Destroy(peb);
|
IExplorerBrowser_Destroy(peb);
|
||||||
|
@ -1101,16 +1101,16 @@ static void test_basics(void)
|
||||||
ebrowser_initialize(peb);
|
ebrowser_initialize(peb);
|
||||||
|
|
||||||
/* SetRect */
|
/* SetRect */
|
||||||
rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0;
|
SetRectEmpty(&rc);
|
||||||
hr = IExplorerBrowser_SetRect(peb, NULL, rc);
|
hr = IExplorerBrowser_SetRect(peb, NULL, rc);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
|
|
||||||
rc.left = 100; rc.top = 100; rc.right = 10; rc.bottom = 10;
|
SetRect(&rc, 100, 100, 10, 10);
|
||||||
hr = IExplorerBrowser_SetRect(peb, NULL, rc);
|
hr = IExplorerBrowser_SetRect(peb, NULL, rc);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
|
|
||||||
/* SetRect with DeferWindowPos */
|
/* SetRect with DeferWindowPos */
|
||||||
rc.left = rc.top = 0; rc.right = rc.bottom = 10;
|
SetRect(&rc, 0, 0, 10, 10);
|
||||||
hdwp = BeginDeferWindowPos(1);
|
hdwp = BeginDeferWindowPos(1);
|
||||||
hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
|
hr = IExplorerBrowser_SetRect(peb, &hdwp, rc);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
|
@ -1125,7 +1125,7 @@ static void test_basics(void)
|
||||||
ok(!lres, "EndDeferWindowPos succeeded unexpectedly.\n");
|
ok(!lres, "EndDeferWindowPos succeeded unexpectedly.\n");
|
||||||
|
|
||||||
/* Test positioning */
|
/* Test positioning */
|
||||||
rc.left = 10; rc.top = 20; rc.right = 50; rc.bottom = 50;
|
SetRect(&rc, 10, 20, 50, 50);
|
||||||
hr = IExplorerBrowser_SetRect(peb, NULL, rc);
|
hr = IExplorerBrowser_SetRect(peb, NULL, rc);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
|
hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb);
|
||||||
|
@ -1715,7 +1715,7 @@ static void test_InputObject(void)
|
||||||
hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
|
hr = IInputObject_TranslateAcceleratorIO(pio, &msg_a);
|
||||||
todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
|
todo_wine ok(hr == E_FAIL, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
rc.left = 0; rc.top = 0; rc.right = 100; rc.bottom = 100;
|
SetRect(&rc, 0, 0, 100, 100);
|
||||||
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL);
|
||||||
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
ok(hr == S_OK, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
|
|
@ -486,19 +486,10 @@ static HWND ShowGroupTest(DWORD instance, HCONV hConv, const char *command, UINT
|
||||||
DdeExecuteCommand(instance, hConv, command, &hData, &error, testParams);
|
DdeExecuteCommand(instance, hConv, command, &hData, &error, testParams);
|
||||||
/* todo_wine... Is expected to fail, wine stubbed functions DO fail */
|
/* todo_wine... Is expected to fail, wine stubbed functions DO fail */
|
||||||
/* TODO REMOVE THIS CODE!!! */
|
/* TODO REMOVE THIS CODE!!! */
|
||||||
if (expected_result == DMLERR_NOTPROCESSED)
|
todo_wine_if (expected_result != DMLERR_NOTPROCESSED)
|
||||||
{
|
|
||||||
ok (expected_result == error, "ShowGroup %s: Expected Error %s, received %s.%s\n",
|
ok (expected_result == error, "ShowGroup %s: Expected Error %s, received %s.%s\n",
|
||||||
groupName, GetStringFromError(expected_result), GetStringFromError(error),
|
groupName, GetStringFromError(expected_result), GetStringFromError(error),
|
||||||
GetStringFromTestParams(testParams));
|
GetStringFromTestParams(testParams));
|
||||||
} else {
|
|
||||||
todo_wine
|
|
||||||
{
|
|
||||||
ok (expected_result == error, "ShowGroup %s: Expected Error %s, received %s.%s\n",
|
|
||||||
groupName, GetStringFromError(expected_result), GetStringFromError(error),
|
|
||||||
GetStringFromTestParams(testParams));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error == DMLERR_NO_ERROR)
|
if (error == DMLERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
|
|
|
@ -884,7 +884,6 @@ START_TEST(shelldispatch)
|
||||||
test_ShellWindows();
|
test_ShellWindows();
|
||||||
test_ParseName();
|
test_ParseName();
|
||||||
test_Verbs();
|
test_Verbs();
|
||||||
|
|
||||||
test_ShellExecute();
|
test_ShellExecute();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
|
|
|
@ -351,12 +351,6 @@ static void test_get_set(void)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define lok ok_(__FILE__, line)
|
#define lok ok_(__FILE__, line)
|
||||||
#define lok_todo_4(todo_flag,a,b,c,d) \
|
|
||||||
if ((todo & todo_flag) == 0) lok((a), (b), (c), (d)); \
|
|
||||||
else todo_wine lok((a), (b), (c), (d));
|
|
||||||
#define lok_todo_2(todo_flag,a,b) \
|
|
||||||
if ((todo & todo_flag) == 0) lok((a), (b)); \
|
|
||||||
else todo_wine lok((a), (b));
|
|
||||||
#define check_lnk(a,b,c) check_lnk_(__LINE__, (a), (b), (c))
|
#define check_lnk(a,b,c) check_lnk_(__LINE__, (a), (b), (c))
|
||||||
|
|
||||||
void create_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int save_fails)
|
void create_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int save_fails)
|
||||||
|
@ -433,16 +427,8 @@ void create_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int save_fails)
|
||||||
lok(str == NULL, "got %p\n", str);
|
lok(str == NULL, "got %p\n", str);
|
||||||
|
|
||||||
r = IPersistFile_Save(pf, path, TRUE);
|
r = IPersistFile_Save(pf, path, TRUE);
|
||||||
if (save_fails)
|
todo_wine_if (save_fails)
|
||||||
{
|
|
||||||
todo_wine {
|
|
||||||
lok(r == S_OK, "save failed (0x%08x)\n", r);
|
lok(r == S_OK, "save failed (0x%08x)\n", r);
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lok(r == S_OK, "save failed (0x%08x)\n", r);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* test GetCurFile after ::Save */
|
/* test GetCurFile after ::Save */
|
||||||
r = IPersistFile_GetCurFile(pf, &str);
|
r = IPersistFile_GetCurFile(pf, &str);
|
||||||
|
@ -533,44 +519,44 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo)
|
||||||
strcpy(buffer,"garbage");
|
strcpy(buffer,"garbage");
|
||||||
r = IShellLinkA_GetDescription(sl, buffer, sizeof(buffer));
|
r = IShellLinkA_GetDescription(sl, buffer, sizeof(buffer));
|
||||||
lok(r == S_OK, "GetDescription failed (0x%08x)\n", r);
|
lok(r == S_OK, "GetDescription failed (0x%08x)\n", r);
|
||||||
lok_todo_4(0x1, strcmp(buffer, desc->description)==0,
|
todo_wine_if ((todo & 0x1) != 0)
|
||||||
"GetDescription returned '%s' instead of '%s'\n",
|
lok(strcmp(buffer, desc->description)==0, "GetDescription returned '%s' instead of '%s'\n",
|
||||||
buffer, desc->description);
|
buffer, desc->description);
|
||||||
}
|
}
|
||||||
if (desc->workdir)
|
if (desc->workdir)
|
||||||
{
|
{
|
||||||
strcpy(buffer,"garbage");
|
strcpy(buffer,"garbage");
|
||||||
r = IShellLinkA_GetWorkingDirectory(sl, buffer, sizeof(buffer));
|
r = IShellLinkA_GetWorkingDirectory(sl, buffer, sizeof(buffer));
|
||||||
lok(r == S_OK, "GetWorkingDirectory failed (0x%08x)\n", r);
|
lok(r == S_OK, "GetWorkingDirectory failed (0x%08x)\n", r);
|
||||||
lok_todo_4(0x2, lstrcmpiA(buffer, desc->workdir)==0,
|
todo_wine_if ((todo & 0x2) != 0)
|
||||||
"GetWorkingDirectory returned '%s' instead of '%s'\n",
|
lok(lstrcmpiA(buffer, desc->workdir)==0, "GetWorkingDirectory returned '%s' instead of '%s'\n",
|
||||||
buffer, desc->workdir);
|
buffer, desc->workdir);
|
||||||
}
|
}
|
||||||
if (desc->path)
|
if (desc->path)
|
||||||
{
|
{
|
||||||
strcpy(buffer,"garbage");
|
strcpy(buffer,"garbage");
|
||||||
r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH);
|
r = IShellLinkA_GetPath(sl, buffer, sizeof(buffer), NULL, SLGP_RAWPATH);
|
||||||
lok(SUCCEEDED(r), "GetPath failed (0x%08x)\n", r);
|
lok(SUCCEEDED(r), "GetPath failed (0x%08x)\n", r);
|
||||||
lok_todo_4(0x4, lstrcmpiA(buffer, desc->path)==0,
|
todo_wine_if ((todo & 0x4) != 0)
|
||||||
"GetPath returned '%s' instead of '%s'\n",
|
lok(lstrcmpiA(buffer, desc->path)==0, "GetPath returned '%s' instead of '%s'\n",
|
||||||
buffer, desc->path);
|
buffer, desc->path);
|
||||||
}
|
}
|
||||||
if (desc->pidl)
|
if (desc->pidl)
|
||||||
{
|
{
|
||||||
LPITEMIDLIST pidl=NULL;
|
LPITEMIDLIST pidl=NULL;
|
||||||
r = IShellLinkA_GetIDList(sl, &pidl);
|
r = IShellLinkA_GetIDList(sl, &pidl);
|
||||||
lok(r == S_OK, "GetIDList failed (0x%08x)\n", r);
|
lok(r == S_OK, "GetIDList failed (0x%08x)\n", r);
|
||||||
lok_todo_2(0x8, pILIsEqual(pidl, desc->pidl),
|
todo_wine_if ((todo & 0x8) != 0)
|
||||||
"GetIDList returned an incorrect pidl\n");
|
lok(pILIsEqual(pidl, desc->pidl), "GetIDList returned an incorrect pidl\n");
|
||||||
}
|
}
|
||||||
if (desc->showcmd)
|
if (desc->showcmd)
|
||||||
{
|
{
|
||||||
int i=0xdeadbeef;
|
int i=0xdeadbeef;
|
||||||
r = IShellLinkA_GetShowCmd(sl, &i);
|
r = IShellLinkA_GetShowCmd(sl, &i);
|
||||||
lok(r == S_OK, "GetShowCmd failed (0x%08x)\n", r);
|
lok(r == S_OK, "GetShowCmd failed (0x%08x)\n", r);
|
||||||
lok_todo_4(0x10, i==desc->showcmd,
|
todo_wine_if ((todo & 0x10) != 0)
|
||||||
"GetShowCmd returned 0x%0x instead of 0x%0x\n",
|
lok(i==desc->showcmd, "GetShowCmd returned 0x%0x instead of 0x%0x\n",
|
||||||
i, desc->showcmd);
|
i, desc->showcmd);
|
||||||
}
|
}
|
||||||
if (desc->icon)
|
if (desc->icon)
|
||||||
{
|
{
|
||||||
|
@ -578,21 +564,21 @@ static void check_lnk_(int line, const WCHAR* path, lnk_desc_t* desc, int todo)
|
||||||
strcpy(buffer,"garbage");
|
strcpy(buffer,"garbage");
|
||||||
r = IShellLinkA_GetIconLocation(sl, buffer, sizeof(buffer), &i);
|
r = IShellLinkA_GetIconLocation(sl, buffer, sizeof(buffer), &i);
|
||||||
lok(r == S_OK, "GetIconLocation failed (0x%08x)\n", r);
|
lok(r == S_OK, "GetIconLocation failed (0x%08x)\n", r);
|
||||||
lok_todo_4(0x20, lstrcmpiA(buffer, desc->icon)==0,
|
todo_wine_if ((todo & 0x20) != 0) {
|
||||||
"GetIconLocation returned '%s' instead of '%s'\n",
|
lok(lstrcmpiA(buffer, desc->icon)==0, "GetIconLocation returned '%s' instead of '%s'\n",
|
||||||
buffer, desc->icon);
|
buffer, desc->icon);
|
||||||
lok_todo_4(0x20, i==desc->icon_id,
|
lok(i==desc->icon_id, "GetIconLocation returned 0x%0x instead of 0x%0x\n",
|
||||||
"GetIconLocation returned 0x%0x instead of 0x%0x\n",
|
i, desc->icon_id);
|
||||||
i, desc->icon_id);
|
}
|
||||||
}
|
}
|
||||||
if (desc->hotkey)
|
if (desc->hotkey)
|
||||||
{
|
{
|
||||||
WORD i=0xbeef;
|
WORD i=0xbeef;
|
||||||
r = IShellLinkA_GetHotkey(sl, &i);
|
r = IShellLinkA_GetHotkey(sl, &i);
|
||||||
lok(r == S_OK, "GetHotkey failed (0x%08x)\n", r);
|
lok(r == S_OK, "GetHotkey failed (0x%08x)\n", r);
|
||||||
lok_todo_4(0x40, i==desc->hotkey,
|
todo_wine_if ((todo & 0x40) != 0)
|
||||||
"GetHotkey returned 0x%04x instead of 0x%04x\n",
|
lok(i==desc->hotkey, "GetHotkey returned 0x%04x instead of 0x%04x\n",
|
||||||
i, desc->hotkey);
|
i, desc->hotkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
IShellLinkA_Release(sl);
|
IShellLinkA_Release(sl);
|
||||||
|
|
|
@ -2283,7 +2283,7 @@ static void test_knownFolders(void)
|
||||||
/* remove newly created directory */
|
/* remove newly created directory */
|
||||||
RemoveDirectoryW(sSubFolder2Path);
|
RemoveDirectoryW(sSubFolder2Path);
|
||||||
|
|
||||||
/* verify sub folder. It still succeedes, so Windows does not check folder presence each time */
|
/* verify subfolder. It still succeeds, so Windows does not check folder presence each time */
|
||||||
hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
|
hr = IKnownFolder_GetPath(subFolder, 0, &folderPath);
|
||||||
todo_wine
|
todo_wine
|
||||||
ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
|
ok(hr == S_OK, "failed to get known folder path: 0x%08x\n", hr);
|
||||||
|
|
|
@ -365,7 +365,7 @@ static void WINETEST_PRINTF_ATTR(2,3) _okShell(int condition, const char *msg, .
|
||||||
#define okShell okShell_(__FILE__, __LINE__)
|
#define okShell okShell_(__FILE__, __LINE__)
|
||||||
|
|
||||||
static char assoc_desc[2048];
|
static char assoc_desc[2048];
|
||||||
void reset_association_description(void)
|
static void reset_association_description(void)
|
||||||
{
|
{
|
||||||
*assoc_desc = '\0';
|
*assoc_desc = '\0';
|
||||||
}
|
}
|
||||||
|
@ -650,7 +650,7 @@ static INT_PTR shell_execute_ex_(const char* file, int line,
|
||||||
* functions know about it
|
* functions know about it
|
||||||
*/
|
*/
|
||||||
WritePrivateProfileStringA(NULL, NULL, NULL, child_file);
|
WritePrivateProfileStringA(NULL, NULL, NULL, child_file);
|
||||||
if (GetFileAttributesA(child_file) != INVALID_FILE_ATTRIBUTES)
|
if (rc > 32 && GetFileAttributesA(child_file) != INVALID_FILE_ATTRIBUTES)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
dump_child_(file, line);
|
dump_child_(file, line);
|
||||||
|
@ -684,9 +684,37 @@ static INT_PTR shell_execute_ex_(const char* file, int line,
|
||||||
*
|
*
|
||||||
***/
|
***/
|
||||||
|
|
||||||
static BOOL create_test_association(const char* extension)
|
static BOOL create_test_class(const char* class, BOOL protocol)
|
||||||
{
|
{
|
||||||
HKEY hkey, hkey_shell;
|
HKEY hkey, hkey_shell;
|
||||||
|
LONG rc;
|
||||||
|
|
||||||
|
rc = RegCreateKeyExA(HKEY_CLASSES_ROOT, class, 0, NULL, 0,
|
||||||
|
KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL,
|
||||||
|
&hkey, NULL);
|
||||||
|
ok(rc == ERROR_SUCCESS || rc == ERROR_ACCESS_DENIED,
|
||||||
|
"could not create class %s (rc=%d)\n", class, rc);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (protocol)
|
||||||
|
{
|
||||||
|
rc = RegSetValueExA(hkey, "URL Protocol", 0, REG_SZ, (LPBYTE)"", 1);
|
||||||
|
ok(rc == ERROR_SUCCESS, "RegSetValueEx '%s' failed, expected ERROR_SUCCESS, got %d\n", class, rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = RegCreateKeyExA(hkey, "shell", 0, NULL, 0,
|
||||||
|
KEY_CREATE_SUB_KEY, NULL, &hkey_shell, NULL);
|
||||||
|
ok(rc == ERROR_SUCCESS, "RegCreateKeyEx 'shell' failed, expected ERROR_SUCCESS, got %d\n", rc);
|
||||||
|
|
||||||
|
CloseHandle(hkey);
|
||||||
|
CloseHandle(hkey_shell);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL create_test_association(const char* extension)
|
||||||
|
{
|
||||||
|
HKEY hkey;
|
||||||
char class[MAX_PATH];
|
char class[MAX_PATH];
|
||||||
LONG rc;
|
LONG rc;
|
||||||
|
|
||||||
|
@ -702,18 +730,7 @@ static BOOL create_test_association(const char* extension)
|
||||||
ok(rc==ERROR_SUCCESS, "RegSetValueEx '%s' failed, expected ERROR_SUCCESS, got %d\n", class, rc);
|
ok(rc==ERROR_SUCCESS, "RegSetValueEx '%s' failed, expected ERROR_SUCCESS, got %d\n", class, rc);
|
||||||
CloseHandle(hkey);
|
CloseHandle(hkey);
|
||||||
|
|
||||||
rc=RegCreateKeyExA(HKEY_CLASSES_ROOT, class, 0, NULL, 0,
|
return create_test_class(class, FALSE);
|
||||||
KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS, NULL, &hkey, NULL);
|
|
||||||
ok(rc==ERROR_SUCCESS, "RegCreateKeyEx '%s' failed, expected ERROR_SUCCESS, got %d\n", class, rc);
|
|
||||||
|
|
||||||
rc=RegCreateKeyExA(hkey, "shell", 0, NULL, 0,
|
|
||||||
KEY_CREATE_SUB_KEY, NULL, &hkey_shell, NULL);
|
|
||||||
ok(rc==ERROR_SUCCESS, "RegCreateKeyEx 'shell' failed, expected ERROR_SUCCESS, got %d\n", rc);
|
|
||||||
|
|
||||||
CloseHandle(hkey);
|
|
||||||
CloseHandle(hkey_shell);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Based on RegDeleteTreeW from dlls/advapi32/registry.c */
|
/* Based on RegDeleteTreeW from dlls/advapi32/registry.c */
|
||||||
|
@ -783,16 +800,21 @@ cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void delete_test_class(const char* classname)
|
||||||
|
{
|
||||||
|
myRegDeleteTreeA(HKEY_CLASSES_ROOT, classname);
|
||||||
|
}
|
||||||
|
|
||||||
static void delete_test_association(const char* extension)
|
static void delete_test_association(const char* extension)
|
||||||
{
|
{
|
||||||
char class[MAX_PATH];
|
char classname[MAX_PATH];
|
||||||
|
|
||||||
sprintf(class, "shlexec%s", extension);
|
sprintf(classname, "shlexec%s", extension);
|
||||||
myRegDeleteTreeA(HKEY_CLASSES_ROOT, class);
|
delete_test_class(classname);
|
||||||
myRegDeleteTreeA(HKEY_CLASSES_ROOT, extension);
|
myRegDeleteTreeA(HKEY_CLASSES_ROOT, extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void create_test_verb_dde(const char* extension, const char* verb,
|
static void create_test_verb_dde(const char* classname, const char* verb,
|
||||||
int rawcmd, const char* cmdtail, const char *ddeexec,
|
int rawcmd, const char* cmdtail, const char *ddeexec,
|
||||||
const char *application, const char *topic,
|
const char *application, const char *topic,
|
||||||
const char *ifexec)
|
const char *ifexec)
|
||||||
|
@ -803,7 +825,7 @@ static void create_test_verb_dde(const char* extension, const char* verb,
|
||||||
LONG rc;
|
LONG rc;
|
||||||
|
|
||||||
strcpy(assoc_desc, " Assoc ");
|
strcpy(assoc_desc, " Assoc ");
|
||||||
strcat_param(assoc_desc, "ext", extension);
|
strcat_param(assoc_desc, "class", classname);
|
||||||
strcat_param(assoc_desc, "verb", verb);
|
strcat_param(assoc_desc, "verb", verb);
|
||||||
sprintf(shell, "%d", rawcmd);
|
sprintf(shell, "%d", rawcmd);
|
||||||
strcat_param(assoc_desc, "rawcmd", shell);
|
strcat_param(assoc_desc, "rawcmd", shell);
|
||||||
|
@ -813,7 +835,7 @@ static void create_test_verb_dde(const char* extension, const char* verb,
|
||||||
strcat_param(assoc_desc, "topic", topic);
|
strcat_param(assoc_desc, "topic", topic);
|
||||||
strcat_param(assoc_desc, "ifexec", ifexec);
|
strcat_param(assoc_desc, "ifexec", ifexec);
|
||||||
|
|
||||||
sprintf(shell, "shlexec%s\\shell", extension);
|
sprintf(shell, "%s\\shell", classname);
|
||||||
rc=RegOpenKeyExA(HKEY_CLASSES_ROOT, shell, 0,
|
rc=RegOpenKeyExA(HKEY_CLASSES_ROOT, shell, 0,
|
||||||
KEY_CREATE_SUB_KEY, &hkey_shell);
|
KEY_CREATE_SUB_KEY, &hkey_shell);
|
||||||
ok(rc == ERROR_SUCCESS, "%s key creation failed with %d\n", shell, rc);
|
ok(rc == ERROR_SUCCESS, "%s key creation failed with %d\n", shell, rc);
|
||||||
|
@ -893,10 +915,10 @@ static void create_test_verb_dde(const char* extension, const char* verb,
|
||||||
* This function is meant to be used to create long term test verbs and thus
|
* This function is meant to be used to create long term test verbs and thus
|
||||||
* does not trace them.
|
* does not trace them.
|
||||||
*/
|
*/
|
||||||
static void create_test_verb(const char* extension, const char* verb,
|
static void create_test_verb(const char* classname, const char* verb,
|
||||||
int rawcmd, const char* cmdtail)
|
int rawcmd, const char* cmdtail)
|
||||||
{
|
{
|
||||||
create_test_verb_dde(extension, verb, rawcmd, cmdtail, NULL, NULL,
|
create_test_verb_dde(classname, verb, rawcmd, cmdtail, NULL, NULL,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
reset_association_description();
|
reset_association_description();
|
||||||
}
|
}
|
||||||
|
@ -994,7 +1016,9 @@ static const char* testfiles[]=
|
||||||
"%s\\test_shortcut_exe.lnk",
|
"%s\\test_shortcut_exe.lnk",
|
||||||
"%s\\test file.shl",
|
"%s\\test file.shl",
|
||||||
"%s\\test file.shlfoo",
|
"%s\\test file.shlfoo",
|
||||||
|
"%s\\test file.sha",
|
||||||
"%s\\test file.sfe",
|
"%s\\test file.sfe",
|
||||||
|
"%s\\test file.shlproto",
|
||||||
"%s\\masked file.shlexec",
|
"%s\\masked file.shlexec",
|
||||||
"%s\\masked",
|
"%s\\masked",
|
||||||
"%s\\test file.sde",
|
"%s\\test file.sde",
|
||||||
|
@ -1043,6 +1067,8 @@ static filename_tests_t filename_tests[]=
|
||||||
|
|
||||||
{"notaverb", "%s\\test file.shlexec", 0x10, SE_ERR_NOASSOC},
|
{"notaverb", "%s\\test file.shlexec", 0x10, SE_ERR_NOASSOC},
|
||||||
|
|
||||||
|
{"averb", "%s\\test file.sha", 0x10, 33},
|
||||||
|
|
||||||
/* Test file masked due to space */
|
/* Test file masked due to space */
|
||||||
{NULL, "%s\\masked file.shlexec", 0x0, 33},
|
{NULL, "%s\\masked file.shlexec", 0x0, 33},
|
||||||
/* Test if quoting prevents the masking */
|
/* Test if quoting prevents the masking */
|
||||||
|
@ -1050,6 +1076,9 @@ static filename_tests_t filename_tests[]=
|
||||||
/* Test with incorrect quote */
|
/* Test with incorrect quote */
|
||||||
{NULL, "\"%s\\masked file.shlexec", 0x0, SE_ERR_FNF},
|
{NULL, "\"%s\\masked file.shlexec", 0x0, SE_ERR_FNF},
|
||||||
|
|
||||||
|
/* Test extension / URI protocol collision */
|
||||||
|
{NULL, "%s\\test file.shlproto", 0x0, SE_ERR_NOASSOC},
|
||||||
|
|
||||||
{NULL, NULL, 0}
|
{NULL, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1570,13 +1599,13 @@ static void test_argify(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
create_test_verb(".shlexec", "Params232S", 0, "Params232S %2 %3 \"%2\" \"%*\"");
|
create_test_verb("shlexec.shlexec", "Params232S", 0, "Params232S %2 %3 \"%2\" \"%*\"");
|
||||||
create_test_verb(".shlexec", "Params23456", 0, "Params23456 \"%2\" \"%3\" \"%4\" \"%5\" \"%6\"");
|
create_test_verb("shlexec.shlexec", "Params23456", 0, "Params23456 \"%2\" \"%3\" \"%4\" \"%5\" \"%6\"");
|
||||||
create_test_verb(".shlexec", "Params23456789", 0, "Params23456789 \"%2\" \"%3\" \"%4\" \"%5\" \"%6\" \"%7\" \"%8\" \"%9\"");
|
create_test_verb("shlexec.shlexec", "Params23456789", 0, "Params23456789 \"%2\" \"%3\" \"%4\" \"%5\" \"%6\" \"%7\" \"%8\" \"%9\"");
|
||||||
create_test_verb(".shlexec", "Params2345Etc", 0, "Params2345Etc ~2=\"%~2\" ~3=\"%~3\" ~4=\"%~4\" ~5=%~5");
|
create_test_verb("shlexec.shlexec", "Params2345Etc", 0, "Params2345Etc ~2=\"%~2\" ~3=\"%~3\" ~4=\"%~4\" ~5=%~5");
|
||||||
create_test_verb(".shlexec", "Params9Etc", 0, "Params9Etc ~9=\"%~9\"");
|
create_test_verb("shlexec.shlexec", "Params9Etc", 0, "Params9Etc ~9=\"%~9\"");
|
||||||
create_test_verb(".shlexec", "Params20", 0, "Params20 \"%20\"");
|
create_test_verb("shlexec.shlexec", "Params20", 0, "Params20 \"%20\"");
|
||||||
create_test_verb(".shlexec", "ParamsBad", 0, "ParamsBad \"%% %- %~ %~0 %~1 %~a %~* %a %b %c %TMPDIR%\"");
|
create_test_verb("shlexec.shlexec", "ParamsBad", 0, "ParamsBad \"%% %- %~ %~0 %~1 %~a %~* %a %b %c %TMPDIR%\"");
|
||||||
|
|
||||||
sprintf(fileA, "%s\\test file.shlexec", tmpdir);
|
sprintf(fileA, "%s\\test file.shlexec", tmpdir);
|
||||||
|
|
||||||
|
@ -1748,6 +1777,14 @@ static void test_filename(void)
|
||||||
sprintf(filename, "%s\\test file.shlexec", tmpdir);
|
sprintf(filename, "%s\\test file.shlexec", tmpdir);
|
||||||
okChildPath("argvA4", filename);
|
okChildPath("argvA4", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sprintf(filename, "\"%s\\test file.sha\"", tmpdir);
|
||||||
|
rc=shell_execute(NULL, filename, NULL, NULL);
|
||||||
|
todo_wine okShell(rc > 32, "failed: rc=%ld err=%u\n", rc, GetLastError());
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
todo_wine okChildString("argvA3", "averb");
|
||||||
|
sprintf(filename, "%s\\test file.sha", tmpdir);
|
||||||
|
todo_wine okChildPath("argvA4", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -1792,6 +1829,9 @@ static fileurl_tests_t fileurl_tests[]=
|
||||||
/* Test shortcuts vs. URLs */
|
/* Test shortcuts vs. URLs */
|
||||||
{"file://///", "%s\\test_shortcut_shlexec.lnk", 0, 0x1d},
|
{"file://///", "%s\\test_shortcut_shlexec.lnk", 0, 0x1d},
|
||||||
|
|
||||||
|
/* Confuse things by mixing protocols */
|
||||||
|
{"file://", "shlproto://foo/bar", USE_COLON, 0},
|
||||||
|
|
||||||
{NULL, NULL, 0, 0}
|
{NULL, NULL, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1878,6 +1918,100 @@ static void test_fileurls(void)
|
||||||
SetEnvironmentVariableA("urlprefix", NULL);
|
SetEnvironmentVariableA("urlprefix", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_urls(void)
|
||||||
|
{
|
||||||
|
char url[MAX_PATH];
|
||||||
|
INT_PTR rc;
|
||||||
|
|
||||||
|
if (!create_test_class("fakeproto", FALSE))
|
||||||
|
{
|
||||||
|
skip("Unable to create 'fakeproto' class for URL tests\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
create_test_verb("fakeproto", "open", 0, "URL %1");
|
||||||
|
|
||||||
|
create_test_class("shlpaverb", TRUE);
|
||||||
|
create_test_verb("shlpaverb", "averb", 0, "PAVerb \"%1\"");
|
||||||
|
|
||||||
|
/* Protocols must be properly declared */
|
||||||
|
rc = shell_execute(NULL, "notaproto://foo", NULL, NULL);
|
||||||
|
ok(rc == SE_ERR_NOASSOC || broken(rc == SE_ERR_ACCESSDENIED),
|
||||||
|
"%s returned %lu\n", shell_call, rc);
|
||||||
|
|
||||||
|
rc = shell_execute(NULL, "fakeproto://foo/bar", NULL, NULL);
|
||||||
|
todo_wine ok(rc == SE_ERR_NOASSOC || broken(rc == SE_ERR_ACCESSDENIED),
|
||||||
|
"%s returned %lu\n", shell_call, rc);
|
||||||
|
|
||||||
|
/* Here's a real live one */
|
||||||
|
rc = shell_execute(NULL, "shlproto://foo/bar", NULL, NULL);
|
||||||
|
ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
okChildString("argvA3", "URL");
|
||||||
|
okChildString("argvA4", "shlproto://foo/bar");
|
||||||
|
|
||||||
|
/* Check default verb detection */
|
||||||
|
rc = shell_execute(NULL, "shlpaverb://foo/bar", NULL, NULL);
|
||||||
|
todo_wine ok(rc > 32 || /* XP+IE7 - Win10 */
|
||||||
|
broken(rc == SE_ERR_NOASSOC), /* XP+IE6 */
|
||||||
|
"%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
if (rc > 32)
|
||||||
|
{
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
todo_wine okChildString("argvA3", "PAVerb");
|
||||||
|
todo_wine okChildString("argvA4", "shlpaverb://foo/bar");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* But alternative verbs are a recent feature! */
|
||||||
|
rc = shell_execute("averb", "shlproto://foo/bar", NULL, NULL);
|
||||||
|
ok(rc > 32 || /* Win8 - Win10 */
|
||||||
|
broken(rc == SE_ERR_ACCESSDENIED), /* XP - Win7 */
|
||||||
|
"%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
if (rc > 32)
|
||||||
|
{
|
||||||
|
okChildString("argvA3", "AVerb");
|
||||||
|
okChildString("argvA4", "shlproto://foo/bar");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A .lnk ending does not turn a URL into a shortcut */
|
||||||
|
todo_wait rc = shell_execute(NULL, "shlproto://foo/bar.lnk", NULL, NULL);
|
||||||
|
ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
todo_wine okChildString("argvA3", "URL");
|
||||||
|
todo_wine okChildString("argvA4", "shlproto://foo/bar.lnk");
|
||||||
|
|
||||||
|
/* Neither does a .exe extension */
|
||||||
|
rc = shell_execute(NULL, "shlproto://foo/bar.exe", NULL, NULL);
|
||||||
|
ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
okChildString("argvA3", "URL");
|
||||||
|
okChildString("argvA4", "shlproto://foo/bar.exe");
|
||||||
|
|
||||||
|
/* But a class name overrides it */
|
||||||
|
rc = shell_execute(NULL, "shlproto://foo/bar", "shlexec.shlexec", NULL);
|
||||||
|
ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
okChildString("argvA3", "URL");
|
||||||
|
okChildString("argvA4", "shlproto://foo/bar");
|
||||||
|
|
||||||
|
/* Environment variables are expanded in URLs (but not in file URLs!) */
|
||||||
|
rc = shell_execute_ex(SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI,
|
||||||
|
NULL, "shlproto://%TMPDIR%/bar", NULL, NULL, NULL);
|
||||||
|
okShell(rc > 32, "failed: rc=%lu\n", rc);
|
||||||
|
okChildInt("argcA", 5);
|
||||||
|
sprintf(url, "shlproto://%s/bar", tmpdir);
|
||||||
|
okChildString("argvA3", "URL");
|
||||||
|
okChildStringBroken("argvA4", url, "shlproto://%TMPDIR%/bar");
|
||||||
|
|
||||||
|
/* But only after the path has been identified as a URL */
|
||||||
|
SetEnvironmentVariableA("urlprefix", "shlproto:///");
|
||||||
|
rc = shell_execute(NULL, "%urlprefix%foo", NULL, NULL);
|
||||||
|
todo_wine ok(rc == SE_ERR_FNF, "%s returned %lu\n", shell_call, rc);
|
||||||
|
SetEnvironmentVariableA("urlprefix", NULL);
|
||||||
|
|
||||||
|
delete_test_class("fakeproto");
|
||||||
|
delete_test_class("shlpaverb");
|
||||||
|
}
|
||||||
|
|
||||||
static void test_find_executable(void)
|
static void test_find_executable(void)
|
||||||
{
|
{
|
||||||
char notepad_path[MAX_PATH];
|
char notepad_path[MAX_PATH];
|
||||||
|
@ -1891,7 +2025,7 @@ static void test_find_executable(void)
|
||||||
skip("Unable to create association for '.sfe'\n");
|
skip("Unable to create association for '.sfe'\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
create_test_verb(".sfe", "Open", 1, "%1");
|
create_test_verb("shlexec.sfe", "Open", 1, "%1");
|
||||||
|
|
||||||
/* Don't test FindExecutable(..., NULL), it always crashes */
|
/* Don't test FindExecutable(..., NULL), it always crashes */
|
||||||
|
|
||||||
|
@ -1941,7 +2075,7 @@ static void test_find_executable(void)
|
||||||
skip("Unable to create association for '.shl'\n");
|
skip("Unable to create association for '.shl'\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
create_test_verb(".shl", "Open", 0, "Open");
|
create_test_verb("shlexec.shl", "Open", 0, "Open");
|
||||||
|
|
||||||
sprintf(filename, "%s\\test file.shl", tmpdir);
|
sprintf(filename, "%s\\test file.shl", tmpdir);
|
||||||
rc=(INT_PTR)FindExecutableA(filename, NULL, command);
|
rc=(INT_PTR)FindExecutableA(filename, NULL, command);
|
||||||
|
@ -2328,7 +2462,7 @@ static void test_dde(void)
|
||||||
skip("Unable to create association for '.sde'\n");
|
skip("Unable to create association for '.sde'\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
create_test_verb_dde(".sde", "Open", 0, test->command, test->ddeexec,
|
create_test_verb_dde("shlexec.sde", "Open", 0, test->command, test->ddeexec,
|
||||||
test->application, test->topic, test->ifexec);
|
test->application, test->topic, test->ifexec);
|
||||||
|
|
||||||
if (test->application != NULL || test->topic != NULL)
|
if (test->application != NULL || test->topic != NULL)
|
||||||
|
@ -2506,7 +2640,7 @@ static void test_dde_default_app(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sprintf(params, test->command, tmpdir);
|
sprintf(params, test->command, tmpdir);
|
||||||
create_test_verb_dde(".sde", "Open", 1, params, "[test]", NULL,
|
create_test_verb_dde("shlexec.sde", "Open", 1, params, "[test]", NULL,
|
||||||
"shlexec", NULL);
|
"shlexec", NULL);
|
||||||
ddeApplication[0] = 0;
|
ddeApplication[0] = 0;
|
||||||
|
|
||||||
|
@ -2677,12 +2811,19 @@ static void init_test(void)
|
||||||
skip("Unable to create association for '.shlexec'\n");
|
skip("Unable to create association for '.shlexec'\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
create_test_verb(".shlexec", "Open", 0, "Open \"%1\"");
|
create_test_verb("shlexec.shlexec", "Open", 0, "Open \"%1\"");
|
||||||
create_test_verb(".shlexec", "NoQuotes", 0, "NoQuotes %1");
|
create_test_verb("shlexec.shlexec", "NoQuotes", 0, "NoQuotes %1");
|
||||||
create_test_verb(".shlexec", "LowerL", 0, "LowerL %l");
|
create_test_verb("shlexec.shlexec", "LowerL", 0, "LowerL %l");
|
||||||
create_test_verb(".shlexec", "QuotedLowerL", 0, "QuotedLowerL \"%l\"");
|
create_test_verb("shlexec.shlexec", "QuotedLowerL", 0, "QuotedLowerL \"%l\"");
|
||||||
create_test_verb(".shlexec", "UpperL", 0, "UpperL %L");
|
create_test_verb("shlexec.shlexec", "UpperL", 0, "UpperL %L");
|
||||||
create_test_verb(".shlexec", "QuotedUpperL", 0, "QuotedUpperL \"%L\"");
|
create_test_verb("shlexec.shlexec", "QuotedUpperL", 0, "QuotedUpperL \"%L\"");
|
||||||
|
|
||||||
|
create_test_association(".sha");
|
||||||
|
create_test_verb("shlexec.sha", "averb", 0, "AVerb \"%1\"");
|
||||||
|
|
||||||
|
create_test_class("shlproto", TRUE);
|
||||||
|
create_test_verb("shlproto", "open", 0, "URL \"%1\"");
|
||||||
|
create_test_verb("shlproto", "averb", 0, "AVerb \"%1\"");
|
||||||
|
|
||||||
/* Set an environment variable to see if it is inherited */
|
/* Set an environment variable to see if it is inherited */
|
||||||
SetEnvironmentVariableA("ShlexecVar", "Present");
|
SetEnvironmentVariableA("ShlexecVar", "Present");
|
||||||
|
@ -2708,6 +2849,8 @@ static void cleanup_test(void)
|
||||||
|
|
||||||
/* Delete the test association */
|
/* Delete the test association */
|
||||||
delete_test_association(".shlexec");
|
delete_test_association(".shlexec");
|
||||||
|
delete_test_association(".sha");
|
||||||
|
delete_test_class("shlproto");
|
||||||
|
|
||||||
CloseHandle(hEvent);
|
CloseHandle(hEvent);
|
||||||
|
|
||||||
|
@ -2785,6 +2928,7 @@ START_TEST(shlexec)
|
||||||
test_lpFile_parsed();
|
test_lpFile_parsed();
|
||||||
test_filename();
|
test_filename();
|
||||||
test_fileurls();
|
test_fileurls();
|
||||||
|
test_urls();
|
||||||
test_find_executable();
|
test_find_executable();
|
||||||
test_lnks();
|
test_lnks();
|
||||||
test_exes();
|
test_exes();
|
||||||
|
|
|
@ -1819,6 +1819,30 @@ static void test_copy(void)
|
||||||
ok(DeleteFileA("abcdefgh.abc"), "Expected file to exist\n");
|
ok(DeleteFileA("abcdefgh.abc"), "Expected file to exist\n");
|
||||||
ok(DeleteFileA("dir\\abcdefgh.abc"), "Expected file to exist\n");
|
ok(DeleteFileA("dir\\abcdefgh.abc"), "Expected file to exist\n");
|
||||||
ok(RemoveDirectoryA("dir"), "Expected dir to exist\n");
|
ok(RemoveDirectoryA("dir"), "Expected dir to exist\n");
|
||||||
|
|
||||||
|
/* Check last error after a successful file operation. */
|
||||||
|
clean_after_shfo_tests();
|
||||||
|
init_shfo_tests();
|
||||||
|
shfo.pFrom = "test1.txt\0";
|
||||||
|
shfo.pTo = "testdir2\0";
|
||||||
|
shfo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
retval = SHFileOperationA(&shfo);
|
||||||
|
ok(retval == ERROR_SUCCESS, "File copy failed with %d\n", retval);
|
||||||
|
ok(!shfo.fAnyOperationsAborted, "Didn't expect aborted operations\n");
|
||||||
|
ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
|
||||||
|
|
||||||
|
/* Check last error after a failed file operation. */
|
||||||
|
clean_after_shfo_tests();
|
||||||
|
init_shfo_tests();
|
||||||
|
shfo.pFrom = "nonexistent\0";
|
||||||
|
shfo.pTo = "testdir2\0";
|
||||||
|
shfo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
retval = SHFileOperationA(&shfo);
|
||||||
|
ok(retval != ERROR_SUCCESS, "Unexpected ERROR_SUCCESS\n");
|
||||||
|
ok(!shfo.fAnyOperationsAborted, "Didn't expect aborted operations\n");
|
||||||
|
ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tests the FO_MOVE action */
|
/* tests the FO_MOVE action */
|
||||||
|
@ -2464,6 +2488,7 @@ static void test_unicode(void)
|
||||||
SHFILEOPSTRUCTW shfoW;
|
SHFILEOPSTRUCTW shfoW;
|
||||||
int ret;
|
int ret;
|
||||||
HANDLE file;
|
HANDLE file;
|
||||||
|
static const WCHAR UNICODE_PATH_TO[] = {'c',':','\\',0x00ae,0x00ae,'\0'};
|
||||||
|
|
||||||
if (!pSHFileOperationW)
|
if (!pSHFileOperationW)
|
||||||
{
|
{
|
||||||
|
@ -2530,6 +2555,36 @@ static void test_unicode(void)
|
||||||
ret = pSHFileOperationW(&shfoW);
|
ret = pSHFileOperationW(&shfoW);
|
||||||
ok(!ret, "Directory is not removed, ErrorCode: %d\n", ret);
|
ok(!ret, "Directory is not removed, ErrorCode: %d\n", ret);
|
||||||
ok(!file_existsW(UNICODE_PATH), "The directory should have been removed\n");
|
ok(!file_existsW(UNICODE_PATH), "The directory should have been removed\n");
|
||||||
|
|
||||||
|
shfoW.hwnd = NULL;
|
||||||
|
shfoW.wFunc = FO_COPY;
|
||||||
|
shfoW.pFrom = UNICODE_PATH;
|
||||||
|
shfoW.pTo = UNICODE_PATH_TO;
|
||||||
|
shfoW.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;
|
||||||
|
shfoW.hNameMappings = NULL;
|
||||||
|
shfoW.lpszProgressTitle = NULL;
|
||||||
|
|
||||||
|
/* Check last error after a successful file operation. */
|
||||||
|
createTestFileW(UNICODE_PATH);
|
||||||
|
ok(file_existsW(UNICODE_PATH), "The file does not exist\n");
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = SHFileOperationW(&shfoW);
|
||||||
|
ok(ret == ERROR_SUCCESS, "File copy failed with %d\n", ret);
|
||||||
|
ok(!shfoW.fAnyOperationsAborted, "Didn't expect aborted operations\n");
|
||||||
|
ok(GetLastError() == ERROR_SUCCESS ||
|
||||||
|
broken(GetLastError() == ERROR_INVALID_HANDLE), /* WinXp, win2k3 */
|
||||||
|
"Expected ERROR_SUCCESS, got %d\n", GetLastError());
|
||||||
|
|
||||||
|
/* Check last error after a failed file operation. */
|
||||||
|
DeleteFileW(UNICODE_PATH);
|
||||||
|
ok(!file_existsW(UNICODE_PATH), "The file should have been removed\n");
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = SHFileOperationW(&shfoW);
|
||||||
|
ok(ret != ERROR_SUCCESS, "Unexpected ERROR_SUCCESS\n");
|
||||||
|
ok(!shfoW.fAnyOperationsAborted, "Didn't expect aborted operations\n");
|
||||||
|
ok(GetLastError() == ERROR_SUCCESS ||
|
||||||
|
broken(GetLastError() == ERROR_INVALID_HANDLE), /* WinXp, win2k3 */
|
||||||
|
"Expected ERROR_SUCCESS, got %d\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -1142,7 +1142,7 @@ static void test_GetAttributesOf(void)
|
||||||
todo_wine
|
todo_wine
|
||||||
ok (hr == E_INVALIDARG ||
|
ok (hr == E_INVALIDARG ||
|
||||||
broken(hr == S_OK), /* W2K and earlier */
|
broken(hr == S_OK), /* W2K and earlier */
|
||||||
"MyComputer->GetAttributesOf(emtpy pidl) should fail! hr = %08x\n", hr);
|
"MyComputer->GetAttributesOf(empty pidl) should fail! hr = %08x\n", hr);
|
||||||
|
|
||||||
dwFlags = 0xffffffff;
|
dwFlags = 0xffffffff;
|
||||||
hr = IShellFolder_GetAttributesOf(psfMyComputer, 0, NULL, &dwFlags);
|
hr = IShellFolder_GetAttributesOf(psfMyComputer, 0, NULL, &dwFlags);
|
||||||
|
|
|
@ -761,8 +761,7 @@ if (0)
|
||||||
settings.ViewMode = FVM_ICON;
|
settings.ViewMode = FVM_ICON;
|
||||||
settings.fFlags = 0;
|
settings.fFlags = 0;
|
||||||
hwnd_view = (HWND)0xdeadbeef;
|
hwnd_view = (HWND)0xdeadbeef;
|
||||||
r.left = r.top = 0;
|
SetRect(&r, 0, 0, 100, 100);
|
||||||
r.right = r.bottom = 100;
|
|
||||||
hr = IShellView_CreateViewWindow(view, NULL, &settings, browser, &r, &hwnd_view);
|
hr = IShellView_CreateViewWindow(view, NULL, &settings, browser, &r, &hwnd_view);
|
||||||
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
ok(hr == S_OK, "got (0x%08x)\n", hr);
|
||||||
ok(IsWindow(hwnd_view), "got %p\n", hwnd_view);
|
ok(IsWindow(hwnd_view), "got %p\n", hwnd_view);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue