Jeremy Drake wrote:
This integrates the scenarios that I wasn't testing from Nikolay Sivov's patch to the tests of 12/7. Also works around some issues I was running into trying to write wide strings as L"foo".
--- dlls/oleaut32/tests/olepicture.c | 311 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 311 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c index 2b5b8bb..2929bd7 100644 --- a/dlls/oleaut32/tests/olepicture.c +++ b/dlls/oleaut32/tests/olepicture.c @@ -489,6 +489,315 @@ static void test_OleCreatePictureIndirect(void) IPicture_Release(pict); }
+static void test_VerifyPictureType(IDispatch *pdisp, short expectedtype, int caller_line) +{ + IPicture *pict; + HRESULT hr; + short type; + pict = (void*)0xdeadbeef; + hr = IDispatch_QueryInterface(pdisp, &IID_IPicture, (LPVOID*)&pict); + ok(hr == S_OK, "hr %08x\n", hr); + ok(pict != (void*)0xdeadbeef && pict != NULL, "pict ptr, caller line %d\n", caller_line); + + if (SUCCEEDED(hr)) + { + type = 0xdead; + hr = IPicture_get_Type(pict, &type); + ok(hr == S_OK, "hr %08x, caller line %d\n", hr, caller_line); + ok(type == expectedtype, "type %hd, expected %hd, caller line %d\n", type, expectedtype, caller_line); + + IPicture_Release(pict); + } +} + +static const WCHAR nopath[] = { '\\', 'n', 'o', 'p', 'a', 't', 'h', 0 }; +static void test_OleLoadPictureFile(void) +{ + IDispatch *disp; + HRESULT hr; + char filename[MAX_PATH]; + VARIANT varFilename; + HANDLE file; + DWORD written; + DWORD widestringlen; + BSTR tmp = NULL, tmp2 = NULL; + + GetTempFileNameA(".", "gif", 0, filename); + file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "file creation error %u\n", GetLastError()); + if (file == INVALID_HANDLE_VALUE) return; + WriteFile(file, gif4pixel, sizeof(gif4pixel), &written, NULL); + ok(written == sizeof(gif4pixel), "write\n"); + + VariantInit(&varFilename); + V_VT(&varFilename) = VT_ERROR; + V_ERROR(&varFilename) = DISP_E_PARAMNOTFOUND; + + todo_wine + { + disp = (void*)0xdeadbeef; + hr = OleLoadPictureFileEx(varFilename, 2, 2, LP_DEFAULT, &disp); + ok(hr == S_OK, "hr %08x\n", hr); + ok(disp != (void*)0xdeadbeef, "dispatch ptr\n"); + + if (disp != (void*)0xdeadbeef) + { + test_VerifyPictureType(disp, PICTYPE_NONE, __LINE__); + IDispatch_Release(disp); + } + } + + + widestringlen = MultiByteToWideChar(CP_ACP, 0, filename, -1, NULL, 0); + ok(widestringlen != 0, "determining wide string length error %u\n", GetLastError()); + if (widestringlen == 0) return; + V_VT(&varFilename) = VT_BSTR; + V_BSTR(&varFilename) = SysAllocStringLen(NULL, widestringlen - 1); + ok(MultiByteToWideChar(CP_ACP, 0, filename, -1, V_BSTR(&varFilename), widestringlen), + "filename to wide string conversion error %u\n", GetLastError()); + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPictureFile(varFilename, &disp); + ok(hr == CTL_E_PERMISSIONDENIED, "hr %08x\n", hr); + } + ok(disp == (void*)0xdeadbeef, "dispatch ptr\n"); + + CloseHandle(file); + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPictureFileEx(varFilename, 2, 2, LP_DEFAULT, &disp); + ok(hr == S_OK, "hr %08x\n", hr); + ok(disp != (void*)0xdeadbeef && disp != NULL, "dispatch ptr\n"); + + if (SUCCEEDED(hr)) + { + test_VerifyPictureType(disp, PICTYPE_BITMAP, __LINE__); + IDispatch_Release(disp); + } + } + + todo_wine + { + disp = (void*)0xdeadbeef; + hr = OleLoadPictureFile(varFilename, &disp); + ok(hr == S_OK, "hr %08x\n", hr); + ok(disp != (void*)0xdeadbeef && disp != NULL, "dispatch ptr\n"); + + if (SUCCEEDED(hr)) + { + test_VerifyPictureType(disp, PICTYPE_BITMAP, __LINE__); + IDispatch_Release(disp); + } + } + + ok(MoveFileA(filename, "33"), "move file\n"); + + file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "file creation error %u\n", GetLastError()); + if (file != INVALID_HANDLE_VALUE) + { + WriteFile(file, "this is not a valid picture", 28, &written, NULL); + ok(written == 28, "write\n"); + CloseHandle(file); + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPictureFile(varFilename, &disp); + ok(hr == CTL_E_INVALIDPICTURE, "hr %08x\n", hr); + ok(disp == NULL, "dispatch ptr\n"); /* XXX this one is not unmodified!! */ + } + DeleteFileA(filename); + } + + tmp = SysAllocString(nopath); + ok(tmp != NULL, "SysAllocString\n"); + if (tmp != NULL) + { + hr = VarBstrCat(V_BSTR(&varFilename), tmp, &tmp2); + if (SUCCEEDED(hr)) + { + SysFreeString(V_BSTR(&varFilename)); + V_BSTR(&varFilename) = tmp2; + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPictureFile(varFilename, &disp); + ok(hr == CTL_E_PATHNOTFOUND, "hr %08x\n", hr); + } + ok(disp == (void*)0xdeadbeef, "dispatch ptr\n"); + } + + SysFreeString(tmp); + } + + VariantClear(&varFilename); + VariantInit(&varFilename); + V_VT(&varFilename) = VT_I4; + V_I4(&varFilename) = 33; + + todo_wine + { + disp = (void*)0xdeadbeef; + hr = OleLoadPictureFile(varFilename, &disp); + ok(hr == S_OK, "hr %08x\n", hr); + ok(disp != (void*)0xdeadbeef && disp != NULL, "dispatch ptr\n"); + + if (SUCCEEDED(hr)) + { + test_VerifyPictureType(disp, PICTYPE_BITMAP, __LINE__); + IDispatch_Release(disp); + } + } + ok(V_VT(&varFilename) == VT_I4 && V_I4(&varFilename) == 33, "variant unmodified\n"); + + DeleteFileA("33"); + + VariantClear(&varFilename); +} + +static void test_OleLoadPicturePath(void) +{ + static const WCHAR fileproto[] = { 'f','i','l','e',':','/','/',0 }; + IDispatch *disp; + HRESULT hr; + char filename[MAX_PATH]; + char absfile[MAX_PATH]; + HANDLE file; + DWORD written; + DWORD widestringlen; + BSTR bstrname = NULL; + BSTR tmp = NULL, tmp2 = NULL; + + GetTempFileNameA(".", "gif", 0, filename); + GetFullPathNameA(filename, MAX_PATH, absfile, NULL); + file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "file creation error %u\n", GetLastError()); + if (file == INVALID_HANDLE_VALUE) return; + WriteFile(file, gif4pixel, sizeof(gif4pixel), &written, NULL); + ok(written == sizeof(gif4pixel), "write\n"); + + widestringlen = MultiByteToWideChar(CP_ACP, 0, absfile, -1, NULL, 0); + ok(widestringlen != 0, "determining wide string length error %u\n", GetLastError()); + if (widestringlen == 0) return; + bstrname = SysAllocStringLen(NULL, widestringlen - 1); + ok(MultiByteToWideChar(CP_ACP, 0, absfile, -1, bstrname, widestringlen), + "filename to wide string conversion error %u\n", GetLastError()); + + disp = (void*)0xdeadbeef; + hr = OleLoadPicturePath(bstrname, NULL, 0, 0, &IID_IDispatch, (LPVOID*)&disp); + if (hr == E_UNEXPECTED) + { + /* E_UNEXPECTED is returned from OleLoadPicturePath on win95 without IE installed */ + win_skip("OleLoadPicturePath seems to not work on this platform. No IE?\n"); + CloseHandle(file); + DeleteFileA(filename); + return; + } + ok(hr == INET_E_DATA_NOT_AVAILABLE /*>=XP*/ || + hr == E_FAIL /*<=2k*/, "hr %08x\n", hr); + todo_wine ok(disp == NULL, "dispatch ptr\n"); + + CloseHandle(file); + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPicturePath(bstrname, NULL, 0, 0, &IID_IDispatch, (LPVOID*)&disp); + ok(hr == S_OK, "hr %08x\n", hr); + ok(disp != NULL && disp != (void*)0xdeadbeef, "dispatch ptr\n"); + + if (SUCCEEDED(hr)) + { + test_VerifyPictureType(disp, PICTYPE_BITMAP, __LINE__); + IDispatch_Release(disp); + } + } + + disp = (void*)0xdeadbeef; + todo_wine + { + tmp = SysAllocString(fileproto); + hr = VarBstrCat(tmp, bstrname, &tmp2); + SysFreeString(tmp); + tmp = NULL; + + + hr = OleLoadPicturePath(tmp2, NULL, 0, 0, &IID_IDispatch, (LPVOID*)&disp); + ok(hr == S_OK, "hr %08x\n", hr); + ok(disp != NULL && disp != (void*)0xdeadbeef, "dispatch ptr\n"); + + if (SUCCEEDED(hr)) + { + test_VerifyPictureType(disp, PICTYPE_BITMAP, __LINE__); + IDispatch_Release(disp); + } + SysFreeString(tmp2); + tmp2 = NULL; + } + + + widestringlen = MultiByteToWideChar(CP_ACP, 0, filename, -1, NULL, 0); + ok(widestringlen != 0, "determining wide string length error %u\n", GetLastError()); + if (widestringlen == 0) return; + tmp = SysAllocStringLen(NULL, widestringlen - 1); + ok(MultiByteToWideChar(CP_ACP, 0, filename, -1, tmp, widestringlen), + "filename to wide string conversion error %u\n", GetLastError()); + + disp = (void*)0xdeadbeef; + + todo_wine + { + hr = OleLoadPicturePath(tmp, NULL, 0, 0, &IID_IDispatch, (LPVOID*)&disp); + ok(hr == INET_E_UNKNOWN_PROTOCOL /*>= XP*/ || + hr == E_FAIL /*<= 2k*/, "hr %08x\n", hr); + ok(disp == NULL, "dispatch ptr\n"); + SysFreeString(tmp); + tmp = NULL; + } + + file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "file creation error %u\n", GetLastError()); + if (file != INVALID_HANDLE_VALUE) + { + WriteFile(file, "this is not a valid picture", 28, &written, NULL); + ok(written == 28, "write\n"); + CloseHandle(file); + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPicturePath(bstrname, NULL, 0, 0, &IID_IDispatch, (LPVOID*)&disp); + ok(hr == E_FAIL, "hr %08x\n", hr); + ok(disp == NULL, "dispatch ptr\n"); + } + } + + DeleteFileA(filename); + + tmp = SysAllocString(nopath); + hr = VarBstrCat(bstrname, tmp, &tmp2); + SysFreeString(bstrname); + bstrname = tmp2; + + disp = (void*)0xdeadbeef; + todo_wine + { + hr = OleLoadPicturePath(bstrname, NULL, 0, 0, &IID_IDispatch, (LPVOID*)&disp); + ok(hr == INET_E_RESOURCE_NOT_FOUND /*>=XP*/ || + hr == E_FAIL /*<=2k*/, "hr %08x\n", hr); + ok(disp == NULL, "dispatch ptr\n"); + } + + SysFreeString(tmp); + SysFreeString(bstrname); +} + static void test_apm() { OLE_HANDLE handle; @@ -671,6 +980,8 @@ START_TEST(olepicture)
test_Invoke(); test_OleCreatePictureIndirect(); + test_OleLoadPictureFile(); + test_OleLoadPicturePath(); test_Render(); }
Hi Jeremy, Could you please use spaces instead of tabs. I know that this file already has some tabs but please don't add more. -- Cheers, Paul.