Module: wine Branch: master Commit: 2858f1ee635b96d39a707c2bcbb66648f8305a78 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2858f1ee635b96d39a707c2bcb...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Apr 25 14:04:34 2014 +0200
oleacc: Add initial LresultFromObject tests.
---
dlls/oleacc/tests/Makefile.in | 2 +- dlls/oleacc/tests/main.c | 101 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 2 deletions(-)
diff --git a/dlls/oleacc/tests/Makefile.in b/dlls/oleacc/tests/Makefile.in index 47f3e57..374f15d 100644 --- a/dlls/oleacc/tests/Makefile.in +++ b/dlls/oleacc/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = oleacc.dll -IMPORTS = oleacc +IMPORTS = ole32 oleacc
C_SRCS = \ main.c diff --git a/dlls/oleacc/tests/main.c b/dlls/oleacc/tests/main.c index db7ee9e..e3daefe 100644 --- a/dlls/oleacc/tests/main.c +++ b/dlls/oleacc/tests/main.c @@ -18,8 +18,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <oleacc.h> +#define COBJMACROS + #include "wine/test.h" +#include <stdio.h> + +#include "initguid.h" +#include <oleacc.h>
static void test_getroletext(void) { @@ -135,7 +140,101 @@ static void test_getroletext(void) } }
+static int Object_ref = 1; +static HRESULT WINAPI Object_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) +{ + if(IsEqualIID(riid, &IID_IUnknown)) { + *ppv = iface; + IUnknown_AddRef(iface); + return S_OK; + } + return E_NOINTERFACE; +} + +static ULONG WINAPI Object_AddRef(IUnknown *iface) +{ + return InterlockedIncrement(&Object_ref); +} + +static ULONG WINAPI Object_Release(IUnknown *iface) +{ + return InterlockedDecrement(&Object_ref); +} + +static IUnknownVtbl ObjectVtbl = { + Object_QueryInterface, + Object_AddRef, + Object_Release +}; + +static IUnknown Object = {&ObjectVtbl}; + +static void test_LresultFromObject(const char *name) +{ + PROCESS_INFORMATION proc; + STARTUPINFOA startup; + char cmdline[MAX_PATH]; + IUnknown *unk; + HRESULT hres; + LRESULT lres; + + lres = LresultFromObject(NULL, 0, 0); + ok(lres == E_INVALIDARG, "got %lx\n", lres); + + hres = ObjectFromLresult(0, &IID_IUnknown, 0, (void**)&unk); + ok(hres==MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,ERROR_INVALID_ADDRESS) + || hres==E_FAIL, "got %x\n", hres); + hres = ObjectFromLresult(0x10000, &IID_IUnknown, 0, (void**)&unk); + ok(hres==MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,ERROR_INVALID_ADDRESS) + || hres==E_FAIL, "got %x\n", hres); + + ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); + lres = LresultFromObject(&IID_IUnknown, 0, &Object); + ok(SUCCEEDED(lres), "got %lx\n", lres); + ok(Object_ref > 1, "Object_ref = %d\n", Object_ref); + + hres = ObjectFromLresult(lres, &IID_IUnknown, 0, (void**)&unk); + ok(hres == S_OK, "hres = %x\n", hres); + ok(unk == &Object, "unk != &Object\n"); + IUnknown_Release(unk); + ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); + + lres = LresultFromObject(&IID_IUnknown, 0, &Object); + ok(SUCCEEDED(lres), "got %lx\n", lres); + ok(Object_ref > 1, "Object_ref = %d\n", Object_ref); + + sprintf(cmdline, ""%s" main ObjectFromLresult %lx", name, lres); + memset(&startup, 0, sizeof(startup)); + startup.cb = sizeof(startup); + CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &proc); + winetest_wait_child_process(proc.hProcess); + ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); +} + START_TEST(main) { + int argc; + char **argv; + + CoInitializeEx(NULL, COINIT_MULTITHREADED); + + argc = winetest_get_mainargs(&argv); + if(argc == 4 && !strcmp(argv[2], "ObjectFromLresult")) { + IUnknown *unk; + HRESULT hres; + LRESULT lres; + + sscanf(argv[3], "%lx", &lres); + hres = ObjectFromLresult(lres, &IID_IUnknown, 0, (void**)&unk); + ok(hres == S_OK, "hres = %x\n", hres); + IUnknown_Release(unk); + + CoUninitialize(); + return; + } + test_getroletext(); + test_LresultFromObject(argv[0]); + + CoUninitialize(); }