[PATCH 8/8] oleaut32/tests: Test marshalling of complex structs.

Zebediah Figura z.figura12 at gmail.com
Sun Mar 31 23:31:20 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/oleaut32/tests/tmarshal.c   | 45 ++++++++++++++++++++++++++++++++
 dlls/oleaut32/tests/tmarshal.idl | 21 ++++++++++++++-
 2 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index 9a7d995ca8..4f84442baf 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -1441,6 +1441,28 @@ static HRESULT WINAPI Widget_rect(IWidget *iface, RECT in, RECT *out, RECT *in_p
     return S_OK;
 }
 
+static HRESULT WINAPI Widget_complex_struct(IWidget *iface, struct complex in)
+{
+    HRESULT hr;
+
+    ok(in.c == 98, "Got char %d.\n", in.c);
+    ok(in.i == 76543, "Got int %d.\n", in.i);
+    ok(*in.pi == 2, "Got int pointer %d.\n", *in.pi);
+    ok(**in.ppi == 10, "Got int double pointer %d.\n", **in.ppi);
+    hr = ISomethingFromDispatch_anotherfn(in.iface);
+    ok(hr == 0x01234567, "Got wrong hr %#x.\n", hr);
+    hr = ISomethingFromDispatch_anotherfn(*in.iface_ptr);
+    ok(hr == 0x01234567, "Got wrong hr %#x.\n", hr);
+    ok(!lstrcmpW(in.bstr, test_bstr2), "Got string %s.\n", wine_dbgstr_w(in.bstr));
+    ok(V_VT(&in.var) == VT_I4, "Got wrong type %u.\n", V_VT(&in.var));
+    ok(V_I4(&in.var) == 123, "Got wrong value %d.\n", V_I4(&in.var));
+    ok(!memcmp(&in.mystruct, &test_mystruct1, sizeof(MYSTRUCT)), "Structs didn't match.\n");
+    ok(!memcmp(in.arr, test_array1, sizeof(array_t)), "Arrays didn't match.\n");
+    ok(in.myint == 456, "Got int %d.\n", in.myint);
+
+    return S_OK;
+}
+
 static HRESULT WINAPI Widget_array(IWidget *iface, array_t in, array_t out, array_t in_out)
 {
     static const array_t empty = {0};
@@ -1600,6 +1622,7 @@ static const struct IWidgetVtbl Widget_VTable =
     Widget_mystruct_ptr_ptr,
     Widget_thin_struct,
     Widget_rect,
+    Widget_complex_struct,
     Widget_array,
     Widget_variant_array,
     Widget_mystruct_array,
@@ -2500,6 +2523,9 @@ static void test_marshal_struct(IWidget *widget, IDispatch *disp)
 {
     MYSTRUCT out, in_ptr, in_out, *in_ptr_ptr;
     RECT rect_out, rect_in_ptr, rect_in_out;
+    ISomethingFromDispatch *sfd;
+    struct complex complex;
+    int i, i2, *pi = &i2;
     HRESULT hr;
 
     memcpy(&out, &test_mystruct2, sizeof(MYSTRUCT));
@@ -2531,6 +2557,25 @@ static void test_marshal_struct(IWidget *widget, IDispatch *disp)
     ok(EqualRect(&rect_out, &test_rect5), "Rects didn't match.\n");
     ok(EqualRect(&rect_in_ptr, &test_rect3), "Rects didn't match.\n");
     ok(EqualRect(&rect_in_out, &test_rect7), "Rects didn't match.\n");
+
+    /* Test complex structs. */
+    complex.c = 98;
+    complex.i = 76543;
+    i = 2;
+    complex.pi = &i;
+    i2 = 10;
+    complex.ppi = π
+    complex.iface = create_disp_obj();
+    sfd = create_disp_obj();
+    complex.iface_ptr = &sfd;
+    complex.bstr = SysAllocString(test_bstr2);
+    V_VT(&complex.var) = VT_I4;
+    V_I4(&complex.var) = 123;
+    memcpy(&complex.mystruct, &test_mystruct1, sizeof(MYSTRUCT));
+    memcpy(complex.arr, test_array1, sizeof(array_t));
+    complex.myint = 456;
+    hr = IWidget_complex_struct(widget, complex);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
 }
 
 static void test_marshal_array(IWidget *widget, IDispatch *disp)
diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl
index cdc7dc14d3..14b80c4eec 100644
--- a/dlls/oleaut32/tests/tmarshal.idl
+++ b/dlls/oleaut32/tests/tmarshal.idl
@@ -65,6 +65,7 @@ enum IWidget_dispids
     DISPID_TM_STRUCT_PTR_PTR,
     DISPID_TM_THIN_STRUCT,
     DISPID_TM_RECT,
+    DISPID_TM_COMPLEX_STRUCT,
     DISPID_TM_ARRAY,
     DISPID_TM_VARIANT_ARRAY,
     DISPID_TM_STRUCT_ARRAY,
@@ -105,6 +106,8 @@ library TestTypelib
 
     typedef [public] int myint_t;
 
+    typedef int array_t[4];
+
     coclass ApplicationObject2;
 
     [
@@ -335,7 +338,23 @@ library TestTypelib
         [id(DISPID_TM_RECT)]
         HRESULT rect([in] RECT in, [out] RECT *out, [in] RECT *in_ptr, [in, out] RECT *in_out);
 
-        typedef int array_t[4];
+        struct complex
+        {
+            char c;
+            int i;
+            int *pi;
+            int **ppi;
+            ISomethingFromDispatch *iface;
+            ISomethingFromDispatch **iface_ptr;
+            BSTR bstr;
+            VARIANT var;
+            MYSTRUCT mystruct;
+            array_t arr;
+            myint_t myint;
+        };
+
+        [id(DISPID_TM_COMPLEX_STRUCT)]
+        HRESULT complex_struct([in] struct complex in);
 
         [id(DISPID_TM_ARRAY)]
         HRESULT array([in] array_t in, [out] array_t out, [in, out] array_t in_out);
-- 
2.20.1




More information about the wine-devel mailing list