From: Tarcísio Ladeia de Oliveirawyrquill@gmail.com
Add tests for many possible situations in which the functions defined by helper interfaces may be used. No tests for rendering the drag image itself are currently being done. The objective is to allow for a minimal implementation which could allow dragging to succeed, as there are situations in which the application tests for success from the drag and drop helpers before attempting the dragging operation.
Signed-off-by: Tarcísio Ladeia de Oliveira wyrquill@gmail.com --- dlls/shell32/tests/shellole.c | 285 +++++++++++++++++++++++++++++++++- 1 file changed, 280 insertions(+), 5 deletions(-)
diff --git a/dlls/shell32/tests/shellole.c b/dlls/shell32/tests/shellole.c index a83ddbd8f5d..d25643c25b7 100644 --- a/dlls/shell32/tests/shellole.c +++ b/dlls/shell32/tests/shellole.c @@ -1209,9 +1209,13 @@ static void test_dragdrophelper(void) HBITMAP bitmap, b_old; HBRUSH brush; SHDRAGIMAGE di_empty; + POINT pt; + DWORD i; HRESULT hr;
/* Initialize variables and window */ + pt.x = 50; + pt.y = 50;
memset(&cls, 0, sizeof(cls)); cls.lpfnWndProc = drag_helper_proc; @@ -1275,13 +1279,284 @@ static void test_dragdrophelper(void) hr = IDropTargetHelper_QueryInterface(target, &IID_IDragSourceHelper, (void **)&dragsource2); ok(hr == S_OK, "QI 2 failed, 0x%lx\n", hr);
- /* Temporary (remove warnings from commit) */ + /* No initialization */
- hr = data_object.lpVtbl->GetData(&data_object, NULL, NULL); - ok(hr == S_OK, "GetData failed, %lx\n", hr); + todo_wine + { + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == E_FAIL, + "Drag enter should have failed with 0x%lx, returned 0x%lx\n", + E_FAIL, hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, NULL, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + /* Inverse process */ + + hr = IDropTargetHelper_Drop(target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drop failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == E_FAIL, + "Drag enter should have failed with 0x%lx, returned 0x%lx\n", + E_FAIL, hr); + } + + /* Test arguments */ + + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object_notimpl); + ok(hr == E_NOTIMPL, + "Initialization from bitmap should have failed with 0x%lx, returned 0x%lx\n", + E_NOTIMPL, hr); + + todo_wine + { + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, NULL, &data_object); + ok(hr == E_INVALIDARG, + "Initialization from bitmap should have failed with 0x%lx, returned 0x%lx\n", + E_INVALIDARG, hr); + + drag_image.hbmpDragImage = bitmap; + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, NULL); + ok(hr == E_INVALIDARG, + "Initialization from bitmap should have failed with 0x%lx, returned 0x%lx\n", + E_INVALIDARG, hr); + + drag_image.hbmpDragImage = 0; + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + drag_image.hbmpDragImage = bitmap; + } + + todo_wine + { + hr = IDragSourceHelper2_InitializeFromWindow(dragsource2, hwnd_target, &pt, &data_object_notimpl); + ok(hr == S_OK, "Initialization from window failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + hr = IDragSourceHelper2_InitializeFromWindow(dragsource2, NULL, &pt, &data_object); + ok(hr == S_OK, "Initialization from window failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + hr = IDragSourceHelper2_InitializeFromWindow(dragsource2, hwnd_target, NULL, &data_object); + ok(hr == S_OK, "Initialization from window failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + hr = IDragSourceHelper2_InitializeFromWindow(dragsource2, hwnd_target, &pt, NULL); + ok(hr == E_INVALIDARG, + "Initialization from window should have failed with 0x%lx, returned 0x%lx\n", + E_INVALIDARG, hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + drag_image.hbmpDragImage = 0; + hr = IDragSourceHelper2_InitializeFromWindow(dragsource2, hwnd_target, &pt, &data_object); + ok(hr == S_OK, "Initialization from window failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + drag_image.hbmpDragImage = bitmap; + } + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object_notimpl, &pt, DROPEFFECT_MOVE); + ok(hr == E_NOTIMPL, "Drag enter failed, 0x%lx\n", hr); + + todo_wine + { + hr = IDropTargetHelper_DragEnter(target, NULL, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == E_FAIL, + "Drag enter should have failed with 0x%lx, returned 0x%lx\n", + E_FAIL, hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, NULL, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, NULL, DROPEFFECT_MOVE); + ok(hr == E_INVALIDARG, + "Drag enter should have failed with 0x%lx, returned 0x%lx\n", + E_INVALIDARG, hr); + + hr = IDropTargetHelper_DragOver(target, NULL, DROPEFFECT_MOVE); + ok(hr == E_INVALIDARG, + "Drag over should have failed with 0x%lx, returned 0x%lx\n", + E_INVALIDARG, hr); + + hr = IDropTargetHelper_Drop(target, NULL, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drop failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_Drop(target, &data_object, NULL, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drop failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &di_empty, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + } + + + /* Test dragging bitmap. */ + + hr = IDragSourceHelper2_SetFlags(dragsource2, DSH_ALLOWDROPDESCRIPTIONTEXT); + ok(hr == S_OK, "Flag setting failed, 0x%lx\n", hr); + + drag_image.hbmpDragImage = bitmap; + + todo_wine + { + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_Drop(target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drop failed, 0x%lx\n", hr); + + /* Try again, without reinitializing */
- hr = data_object_notimpl.lpVtbl->GetData(&data_object_notimpl, NULL, NULL); - ok(hr == E_NOTIMPL, "GetData should not be implemented, but got %lx\n", hr); + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == E_FAIL, + "Drag enter should have failed with 0x%lx, returned 0x%lx\n", + E_FAIL, hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_Drop(target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drop failed, 0x%lx\n", hr); + + /* Test dragging bitmap from window. */ + + hr = IDragSourceHelper2_InitializeFromWindow(dragsource2, hwnd_target, &pt, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_Drop(target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drop failed, 0x%lx\n", hr); + + /* Test cancelling drag. */ + + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + } + + /* No description text. */ + + hr = IDragSourceHelper2_SetFlags(dragsource2, 0x0); + ok(hr == S_OK, "Flag setting failed, 0x%lx\n", hr); + + todo_wine + { + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + } + + /* Not visible. */ + + hr = IDragSourceHelper2_SetFlags(dragsource2, 0x0); + ok(hr == S_OK, "Flag setting failed, 0x%lx\n", hr); + + todo_wine + { + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + } + + hr = IDropTargetHelper_Show(target, 0); + ok(hr == S_OK, "Hide failed.\n"); + + todo_wine + { + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, DROPEFFECT_MOVE); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + + /* Test invalid effects */ + for (i = 0; i < 20; ++i) + { + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, i); + ok(hr == S_OK, "Drag enter failed, effect: 0x%lx, error 0x%lx\n", i, hr); + + hr = IDropTargetHelper_DragOver(target, &pt, i); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + } + for (i = 0; i < 20; ++i) + { + hr = IDragSourceHelper2_InitializeFromBitmap(dragsource2, &drag_image, &data_object); + ok(hr == S_OK, "Initialization from bitmap failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragEnter(target, hwnd_target, &data_object, &pt, i | DROPEFFECT_SCROLL); + ok(hr == S_OK, "Drag enter failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragOver(target, &pt, i | DROPEFFECT_SCROLL); + ok(hr == S_OK, "Drag over failed, 0x%lx\n", hr); + + hr = IDropTargetHelper_DragLeave(target); + ok(hr == S_OK, "Leave failed, 0x%lx\n", hr); + } + } + + /* Test invalid flags */ + for (i = 0; i < 20; ++i) + { + hr = IDragSourceHelper2_SetFlags(dragsource2, i); + ok(hr == S_OK, "Flag setting failed, flag: 0x%lx, error: 0x%lx\n", i, hr); + }
/* Clean up */