oleaut32/tests: add tests for OleLoadPictureFile(Ex) and OleLoadPicurePath (resend) [3/3]

Jeremy Drake wine at jdrake.com
Tue Dec 16 01:42:15 CST 2008


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();
 }

-- 
1.5.6.4





More information about the wine-patches mailing list