Module: wine Branch: master Commit: 232f54aea2ff873305b437197f947da336b40038 URL: http://source.winehq.org/git/wine.git/?a=commit;h=232f54aea2ff873305b437197f...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Thu Sep 10 15:16:32 2015 +0800
oleaut32/tests: Add another test for calling a varargs method.
This time with passing SAFEARRAY as a reference.
---
dlls/oleaut32/tests/tmarshal.c | 55 +++++++++++++++++++++++++++++++++- dlls/oleaut32/tests/tmarshal.idl | 3 ++ dlls/oleaut32/tests/tmarshal_dispids.h | 1 + 3 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c index f18aecc..6b89774 100644 --- a/dlls/oleaut32/tests/tmarshal.c +++ b/dlls/oleaut32/tests/tmarshal.c @@ -874,6 +874,41 @@ static HRESULT WINAPI Widget_VarArg_Run( return S_OK; }
+static HRESULT WINAPI Widget_VarArg_Ref_Run( + IWidget *iface, BSTR name, SAFEARRAY **params, VARIANT *result) +{ + static const WCHAR catW[] = { 'C','a','t',0 }; + static const WCHAR supermanW[] = { 'S','u','p','e','r','m','a','n',0 }; + LONG bound; + VARIANT *var; + BSTR bstr; + HRESULT hr; + + trace("VarArg_Ref_Run(%p,%p,%p)\n", name, params, result); + + ok(!lstrcmpW(name, catW), "got %s\n", wine_dbgstr_w(name)); + + hr = SafeArrayGetLBound(*params, 1, &bound); + ok(hr == S_OK, "SafeArrayGetLBound error %#x\n", hr); + ok(bound == 0, "expected 0, got %d\n", bound); + + hr = SafeArrayGetUBound(*params, 1, &bound); + ok(hr == S_OK, "SafeArrayGetUBound error %#x\n", hr); + ok(bound == 0, "expected 0, got %d\n", bound); + + hr = SafeArrayAccessData(*params, (void **)&var); + ok(hr == S_OK, "SafeArrayAccessData error %#x\n", hr); + + ok(V_VT(&var[0]) == VT_BSTR, "expected VT_BSTR, got %d\n", V_VT(&var[0])); + bstr = V_BSTR(&var[0]); + ok(!lstrcmpW(bstr, supermanW), "got %s\n", wine_dbgstr_w(bstr)); + + hr = SafeArrayUnaccessData(*params); + ok(hr == S_OK, "SafeArrayUnaccessData error %#x\n", hr); + + return S_OK; +} + static const struct IWidgetVtbl Widget_VTable = { Widget_QueryInterface, @@ -912,7 +947,8 @@ static const struct IWidgetVtbl Widget_VTable = Widget_put_prop_req_arg, Widget_pos_restrict, Widget_neg_restrict, - Widget_VarArg_Run + Widget_VarArg_Run, + Widget_VarArg_Ref_Run };
static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject) @@ -1554,6 +1590,23 @@ static void test_typelibmarshal(void) SysFreeString(V_BSTR(&vararg[1])); SysFreeString(V_BSTR(&vararg[0]));
+ /* call VarArg_Ref_Run */ + VariantInit(&vararg[1]); + V_VT(&vararg[1]) = VT_BSTR; + V_BSTR(&vararg[1]) = SysAllocString(szCat); + VariantInit(&vararg[0]); + V_VT(&vararg[0]) = VT_BSTR; + V_BSTR(&vararg[0]) = SysAllocString(szSuperman); + dispparams.cNamedArgs = 0; + dispparams.cArgs = 2; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = vararg; + hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG_REF_RUN, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); +todo_wine + ok_ole_success(hr, IDispatch_Invoke); + SysFreeString(V_BSTR(&vararg[1])); + SysFreeString(V_BSTR(&vararg[0])); + /* call Error */ dispparams.cNamedArgs = 0; dispparams.cArgs = 0; diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl index ff9cac3..680f4b4 100644 --- a/dlls/oleaut32/tests/tmarshal.idl +++ b/dlls/oleaut32/tests/tmarshal.idl @@ -182,6 +182,9 @@ library TestTypelib
[id(DISPID_TM_VARARG_RUN), vararg] HRESULT VarArg_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) params, [out, retval] VARIANT *result); + + [id(DISPID_TM_VARARG_REF_RUN), vararg] + HRESULT VarArg_Ref_Run([in] BSTR name, [in] SAFEARRAY(VARIANT) *params, [out, retval] VARIANT *result); }
[ diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h index d603a56..dfca216 100644 --- a/dlls/oleaut32/tests/tmarshal_dispids.h +++ b/dlls/oleaut32/tests/tmarshal_dispids.h @@ -45,6 +45,7 @@ #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_NOA_BSTRRET 1 #define DISPID_NOA_ERROR 2