From 55e3a4d82f98e37d4cb11657f759f1d772257b04 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Sun, 14 Oct 2018 22:41:03 -0500 Subject: [PATCH] oleaut32/tests: Add some tests for marshalling base types. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/oleaut32/tests/tmarshal.c | 129 ++++++++++++++++++++++++- dlls/oleaut32/tests/tmarshal.idl | 56 ++++++++++- dlls/oleaut32/tests/tmarshal_dispids.h | 52 ---------- 3 files changed, 183 insertions(+), 54 deletions(-) delete mode 100644 dlls/oleaut32/tests/tmarshal_dispids.h diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index b48b7855db0..68547f7e98c 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -17,6 +17,8 @@ * */ +#include + #define COBJMACROS #define CONST_VTABLE @@ -27,7 +29,6 @@ #include "wine/test.h" #include "tmarshal.h" -#include "tmarshal_dispids.h" static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT); @@ -923,6 +924,44 @@ static HRESULT WINAPI Widget_Coclass( return S_OK; } +static HRESULT WINAPI Widget_basetypes_in(IWidget *iface, signed char c, short s, int i, hyper h, + unsigned char uc, unsigned short us, unsigned int ui, MIDL_uhyper uh, + float f, double d, STATE st) +{ + ok(c == 5, "Got char %d.\n", c); + ok(s == -123, "Got short %d.\n", s); + ok(i == -100000, "Got int %d.\n", i); + ok(h == (LONGLONG)-100000 * 1000000, "Got hyper %s.\n", wine_dbgstr_longlong(h)); + ok(uc == 0, "Got unsigned char %u.\n", uc); + ok(us == 456, "Got unsigned short %u.\n", us); + ok(ui == 0xdeadbeef, "Got unsigned int %i.\n", ui); + ok(uh == (ULONGLONG)1234567890 * 9876543210, "Got unsigned hyper %s.\n", wine_dbgstr_longlong(uh)); + ok(f == (float)M_PI, "Got float %f.\n", f); + ok(d == M_E, "Got double %f.\n", d); + ok(st == STATE_WIDGETIFIED, "Got state %u.\n", st); + + return S_OK; +} + +static HRESULT WINAPI Widget_basetypes_out(IWidget *iface, signed char *c, short *s, int *i, hyper *h, + unsigned char *uc, unsigned short *us, unsigned int *ui, MIDL_uhyper *uh, + float *f, double *d, STATE *st) +{ + *c = 10; + *s = -321; + *i = -200000; + *h = (LONGLONG)-200000 * 1000000; + *uc = 254; + *us = 256; + *ui = 0xf00dfade; + *uh = (((ULONGLONG)0xabcdef01) << 32) | (ULONGLONG)0x23456789; + *f = M_LN2; + *d = M_LN10; + *st = STATE_UNWIDGETIFIED; + + return S_OK; +} + static const struct IWidgetVtbl Widget_VTable = { Widget_QueryInterface, @@ -964,6 +1003,8 @@ static const struct IWidgetVtbl Widget_VTable = Widget_VarArg_Run, Widget_VarArg_Ref_Run, Widget_Coclass, + Widget_basetypes_in, + Widget_basetypes_out, }; static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject) @@ -1277,6 +1318,90 @@ static ITypeInfo *NonOleAutomation_GetTypeInfo(void) return NULL; } +static void test_marshal_basetypes(IWidget *widget, IDispatch *disp) +{ + VARIANTARG arg[11]; + DISPPARAMS dispparams = {arg, NULL, ARRAY_SIZE(arg), 0}; + HRESULT hr; + + signed char c; + short s; + int i; + hyper h; + unsigned char uc; + unsigned short us; + unsigned int ui; + MIDL_uhyper uh; + float f; + double d; + STATE st; + + V_VT(&arg[10]) = VT_I1; V_I1(&arg[10]) = 5; + V_VT(&arg[9]) = VT_I2; V_I2(&arg[9]) = -123; + V_VT(&arg[8]) = VT_I4; V_I4(&arg[8]) = -100000; + V_VT(&arg[7]) = VT_I8; V_I8(&arg[7]) = (LONGLONG)-100000 * 1000000; + V_VT(&arg[6]) = VT_UI1; V_UI1(&arg[6]) = 0; + V_VT(&arg[5]) = VT_UI2; V_UI2(&arg[5]) = 456; + V_VT(&arg[4]) = VT_UI4; V_UI4(&arg[4]) = 0xdeadbeef; + V_VT(&arg[3]) = VT_UI8; V_UI8(&arg[3]) = (ULONGLONG)1234567890 * 9876543210; + V_VT(&arg[2]) = VT_R4; V_R4(&arg[2]) = M_PI; + V_VT(&arg[1]) = VT_R8; V_R8(&arg[1]) = M_E; + V_VT(&arg[0]) = VT_I4; V_I4(&arg[0]) = STATE_WIDGETIFIED; + hr = IDispatch_Invoke(disp, DISPID_TM_BASETYPES_IN, &IID_NULL, LOCALE_NEUTRAL, + DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IWidget_basetypes_in(widget, 5, -123, -100000, (LONGLONG)-100000 * 1000000, 0, 456, + 0xdeadbeef, (ULONGLONG)1234567890 * 9876543210, M_PI, M_E, STATE_WIDGETIFIED); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + c = s = i = h = uc = us = ui = uh = f = d = st = 0; + + V_VT(&arg[10]) = VT_BYREF|VT_I1; V_I1REF(&arg[10]) = &c; + V_VT(&arg[9]) = VT_BYREF|VT_I2; V_I2REF(&arg[9]) = &s; + V_VT(&arg[8]) = VT_BYREF|VT_I4; V_I4REF(&arg[8]) = &i; + V_VT(&arg[7]) = VT_BYREF|VT_I8; V_I8REF(&arg[7]) = &h; + V_VT(&arg[6]) = VT_BYREF|VT_UI1; V_UI1REF(&arg[6]) = &uc; + V_VT(&arg[5]) = VT_BYREF|VT_UI2; V_UI2REF(&arg[5]) = &us; + V_VT(&arg[4]) = VT_BYREF|VT_UI4; V_UI4REF(&arg[4]) = &ui; + V_VT(&arg[3]) = VT_BYREF|VT_UI8; V_UI8REF(&arg[3]) = &uh; + V_VT(&arg[2]) = VT_BYREF|VT_R4; V_R4REF(&arg[2]) = &f; + V_VT(&arg[1]) = VT_BYREF|VT_R8; V_R8REF(&arg[1]) = &d; + V_VT(&arg[0]) = VT_BYREF|VT_I4; V_I4REF(&arg[0]) = (int *)&st; + hr = IDispatch_Invoke(disp, DISPID_TM_BASETYPES_OUT, &IID_NULL, LOCALE_NEUTRAL, + DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(c == 10, "Got char %d.\n", c); + ok(s == -321, "Got short %d.\n", s); + ok(i == -200000, "Got int %d.\n", i); + ok(h == (LONGLONG)-200000 * 1000000L, "Got hyper %s.\n", wine_dbgstr_longlong(h)); + ok(uc == 254, "Got unsigned char %u.\n", uc); + ok(us == 256, "Got unsigned short %u.\n", us); + ok(ui == 0xf00dfade, "Got unsigned int %i.\n", ui); + ok(uh == ((((ULONGLONG)0xabcdef01) << 32) | (ULONGLONG)0x23456789), + "Got unsigned hyper %s.\n", wine_dbgstr_longlong(uh)); + ok(f == (float)M_LN2, "Got float %f.\n", f); + ok(d == M_LN10, "Got double %f.\n", d); + ok(st == STATE_UNWIDGETIFIED, "Got state %u.\n", st); + + c = s = i = h = uc = us = ui = uh = f = d = st = 0; + + hr = IWidget_basetypes_out(widget, &c, &s, &i, &h, &uc, &us, &ui, &uh, &f, &d, &st); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(c == 10, "Got char %d.\n", c); + ok(s == -321, "Got short %d.\n", s); + ok(i == -200000, "Got int %d.\n", i); + ok(h == (LONGLONG)-200000 * 1000000L, "Got hyper %s.\n", wine_dbgstr_longlong(h)); + ok(uc == 254, "Got unsigned char %u.\n", uc); + ok(us == 256, "Got unsigned short %u.\n", us); + ok(ui == 0xf00dfade, "Got unsigned int %i.\n", ui); + ok(uh == ((((ULONGLONG)0xabcdef01) << 32) | (ULONGLONG)0x23456789), + "Got unsigned hyper %s.\n", wine_dbgstr_longlong(uh)); + ok(f == (float)M_LN2, "Got float %f.\n", f); + ok(d == M_LN10, "Got double %f.\n", d); + ok(st == STATE_UNWIDGETIFIED, "Got state %u.\n", st); +} + static void test_typelibmarshal(void) { static const WCHAR szCat[] = { 'C','a','t',0 }; @@ -1887,6 +2012,8 @@ static void test_typelibmarshal(void) ok(V_I4(&varresult) == DISPID_TM_NEG_RESTRICTED, "got %x\n", V_I4(&varresult)); VariantClear(&varresult); + test_marshal_basetypes(pWidget, pDispatch); + IDispatch_Release(pDispatch); IWidget_Release(pWidget); diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index 996e948b850..2452f2d185c 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -20,9 +20,53 @@ #pragma makedep ident #pragma makedep typelib -#include "tmarshal_dispids.h" import "ocidl.idl"; +enum IWidget_dispids +{ + DISPID_TM_NAME = 1, + DISPID_TM_DOSOMETHING, + DISPID_TM_STATE, + DISPID_TM_MAP, + DISPID_TM_SETOLECOLOR, + DISPID_TM_GETOLECOLOR, + DISPID_TM_CLONE, + DISPID_TM_CLONEDISPATCH, + DISPID_TM_CLONECOCLASS, + DISPID_TM_VALUE, + DISPID_TM_ARRAY, + DISPID_TM_VARARRAYPTR, + DISPID_TM_VARCARRAY, + DISPID_TM_VARIANT, + DISPID_TM_VARARG, + DISPID_TM_STRUCTARGS, + DISPID_TM_ERROR, + DISPID_TM_CLONEINTERFACE, + DISPID_TM_TESTDUAL, + DISPID_TM_PROP_WITH_LCID, + DISPID_TM_PROP_INT, + DISPID_TM_PROP_UINT, + DISPID_TM_BYREF_UINT, + DISPID_TM_PROP_OPT_ARG, + DISPID_TM_PROP_REQ_ARG, + DISPID_TM_RESTRICTED, + DISPID_TM_TESTSECONDIFACE, + DISPID_TM_VARARG_RUN, + DISPID_TM_VARARG_REF_RUN, + DISPID_TM_COCLASS, + + DISPID_TM_BASETYPES_IN, + DISPID_TM_BASETYPES_OUT, +}; + +static const int DISPID_TM_NEG_RESTRICTED = -26; + +enum INonOleAutomation_dispids +{ + DISPID_NOA_BSTRRET = 1, + DISPID_NOA_ERROR +}; + [ uuid(d96d8a3e-78b6-4c8d-8f27-059db959be8a), version(2.5), @@ -188,6 +232,16 @@ library TestTypelib [id(DISPID_TM_COCLASS)] HRESULT Coclass([in] ApplicationObject2 *param); + + [id(DISPID_TM_BASETYPES_IN)] + HRESULT basetypes_in([in] signed char c, [in] short s, [in] int i, [in] hyper h, + [in] unsigned char uc, [in] unsigned short us, [in] unsigned int ui, + [in] unsigned hyper uh, [in] float f, [in] double d, [in] STATE st); + + [id(DISPID_TM_BASETYPES_OUT)] + HRESULT basetypes_out([out] signed char *c, [out] short *s, [out] int *i, [out] hyper *h, + [out] unsigned char *uc, [out] unsigned short *us, [out] unsigned int *ui, + [out] unsigned hyper *uh, [out] float *f, [out] double *d, [out] STATE *st); } [ diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h deleted file mode 100644 index 26f40273bfb..00000000000 --- a/dlls/oleaut32/tests/tmarshal_dispids.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2005-2006 Robert Shearman for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - * - */ - -#define DISPID_TM_NAME 1 -#define DISPID_TM_DOSOMETHING 2 -#define DISPID_TM_STATE 3 -#define DISPID_TM_MAP 4 -#define DISPID_TM_SETOLECOLOR 5 -#define DISPID_TM_GETOLECOLOR 6 -#define DISPID_TM_CLONE 7 -#define DISPID_TM_CLONEDISPATCH 8 -#define DISPID_TM_CLONECOCLASS 9 -#define DISPID_TM_ARRAY 10 -#define DISPID_TM_VARARRAYPTR 11 -#define DISPID_TM_VARIANT 12 -#define DISPID_TM_VARARG 13 -#define DISPID_TM_ERROR 14 -#define DISPID_TM_CLONEINTERFACE 15 -#define DISPID_TM_TESTDUAL 16 -#define DISPID_TM_STRUCTARGS 17 -#define DISPID_TM_PROP_WITH_LCID 18 -#define DISPID_TM_PROP_INT 19 -#define DISPID_TM_PROP_UINT 20 -#define DISPID_TM_BYREF_UINT 21 -#define DISPID_TM_PROP_OPT_ARG 22 -#define DISPID_TM_PROP_REQ_ARG 23 -#define DISPID_TM_VARCARRAY 24 -#define DISPID_TM_RESTRICTED 25 -#define DISPID_TM_NEG_RESTRICTED -26 -#define DISPID_TM_TESTSECONDIFACE 27 -#define DISPID_TM_VARARG_RUN 28 -#define DISPID_TM_VARARG_REF_RUN 29 -#define DISPID_TM_COCLASS 30 - -#define DISPID_NOA_BSTRRET 1 -#define DISPID_NOA_ERROR 2