Misha Koshelev : oleaut32/tests: Add tests for IDispatch:: Invoke of vararg function.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 7 07:20:20 CDT 2007


Module: wine
Branch: master
Commit: 127385e7186370b0068553cb97f055c387b8aa19
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=127385e7186370b0068553cb97f055c387b8aa19

Author: Misha Koshelev <mk144210 at bcm.edu>
Date:   Wed Jun  6 15:50:29 2007 -0500

oleaut32/tests: Add tests for IDispatch::Invoke of vararg function.

---

 dlls/oleaut32/tests/tmarshal.c         |   61 ++++++++++++++++++++++++++++++++
 dlls/oleaut32/tests/tmarshal.idl       |    3 ++
 dlls/oleaut32/tests/tmarshal_dispids.h |    3 +-
 3 files changed, 66 insertions(+), 1 deletions(-)

diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index 22d2245..05624e9 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -476,6 +476,38 @@ void WINAPI Widget_Variant(
     ok(S(V_CY(&var)).Lo == 0xdeadbeef, "V_CY(&var).Lo was 0x%x\n", S(V_CY(&var)).Lo);
 }
 
+void WINAPI Widget_VarArg(
+    IWidget * iface,
+    int numexpect,
+    SAFEARRAY * values)
+{
+    LONG lbound, ubound, i;
+    VARIANT * data;
+    HRESULT hr;
+
+    trace("VarArg(%p)\n", values);
+
+    hr = SafeArrayGetLBound(values, 1, &lbound);
+    ok(hr == S_OK, "SafeArrayGetLBound failed with %x\n", hr);
+    ok(lbound == 0, "SafeArrayGetLBound returned %d\n", lbound);
+
+    hr = SafeArrayGetUBound(values, 1, &ubound);
+    ok(hr == S_OK, "SafeArrayGetUBound failed with %x\n", hr);
+    ok(ubound == numexpect-1, "SafeArrayGetUBound returned %d, but expected %d\n", ubound, numexpect-1);
+
+    hr = SafeArrayAccessData(values, (LPVOID)&data);
+    ok(hr == S_OK, "SafeArrayAccessData failed with %x\n", hr);
+
+    for (i=0; i<=ubound-lbound; i++)
+    {
+        ok(V_VT(&data[i]) == VT_I4, "V_VT(&data[%d]) was %d\n", i, V_VT(&data[i]));
+        ok(V_I4(&data[i]) == i, "V_I4(&data[%d]) was %d\n", i, V_I4(&data[i]));
+    }
+
+    hr = SafeArrayUnaccessData(values);
+    ok(hr == S_OK, "SafeArrayUnaccessData failed with %x\n", hr);
+}
+
 HRESULT WINAPI Widget_Error(
     IWidget __RPC_FAR * iface)
 {
@@ -507,6 +539,7 @@ static const struct IWidgetVtbl Widget_VTable =
     Widget_Array,
     Widget_VariantArrayPtr,
     Widget_Variant,
+    Widget_VarArg,
     Widget_Error
 };
 
@@ -956,6 +989,34 @@ static void test_typelibmarshal(void)
     ok_ole_success(hr, IDispatch_Invoke);
     VariantClear(&varresult);
 
+    /* call VarArg */
+    VariantInit(&vararg[3]);
+    V_VT(&vararg[3]) = VT_I4;
+    V_I4(&vararg[3]) = 3;
+    VariantInit(&vararg[2]);
+    V_VT(&vararg[2]) = VT_I4;
+    V_I4(&vararg[2]) = 0;
+    VariantInit(&vararg[1]);
+    V_VT(&vararg[1]) = VT_I4;
+    V_I4(&vararg[1]) = 1;
+    VariantInit(&vararg[0]);
+    V_VT(&vararg[0]) = VT_I4;
+    V_I4(&vararg[0]) = 2;
+    dispparams.cNamedArgs = 0;
+    dispparams.cArgs = 4;
+    dispparams.rgdispidNamedArgs = NULL;
+    dispparams.rgvarg = vararg;
+    hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+    todo_wine ok_ole_success(hr, ITypeInfo_Invoke);
+
+    /* call VarArg, even one (non-optional, non-safearray) named argument is not allowed */
+    dispidNamed = 0;
+    dispparams.cNamedArgs = 1;
+    dispparams.rgdispidNamedArgs = &dispidNamed;
+    hr = IDispatch_Invoke(pDispatch, DISPID_TM_VARARG, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
+    todo_wine ok(hr == DISP_E_NONAMEDARGS, "IDispatch_Invoke should have returned DISP_E_NONAMEDARGS instead of 0x%08x\n", hr);
+    dispidNamed = DISPID_PROPERTYPUT;
+
     /* call Error */
     dispparams.cNamedArgs = 0;
     dispparams.cArgs = 0;
diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl
index 2d1a9bc..ff7a00a 100644
--- a/dlls/oleaut32/tests/tmarshal.idl
+++ b/dlls/oleaut32/tests/tmarshal.idl
@@ -88,6 +88,9 @@ library TestTypelib
         [id(DISPID_TM_VARIANT)]
         void Variant([in] VARIANT var);
 
+        [vararg, id(DISPID_TM_VARARG)]
+        void VarArg([in] int numexpect, [in] SAFEARRAY(VARIANT) values);
+
         [id(DISPID_TM_ERROR)]
         HRESULT Error();
     }
diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h
index 46523c7..bfeca29 100644
--- a/dlls/oleaut32/tests/tmarshal_dispids.h
+++ b/dlls/oleaut32/tests/tmarshal_dispids.h
@@ -29,6 +29,7 @@
 #define DISPID_TM_ARRAY 10
 #define DISPID_TM_VARARRAYPTR 11
 #define DISPID_TM_VARIANT 12
-#define DISPID_TM_ERROR 13
+#define DISPID_TM_VARARG 13
+#define DISPID_TM_ERROR 14
 
 #define DISPID_NOA_BSTRRET 1




More information about the wine-cvs mailing list