[PATCH 2/5] oleaut32/tests: Add some tests for marshalling base types.

Zebediah Figura z.figura12 at gmail.com
Sun Oct 14 22:41:03 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 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 b48b785..68547f7 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -17,6 +17,8 @@
  *
  */
 
+#include <math.h>
+
 #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 996e948..2452f2d 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 26f4027..0000000
--- 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
-- 
2.7.4




More information about the wine-devel mailing list