oleaut32: Add test for invoking a dispatch get-only property with DISPATCH_PROPERTYPUT.

This commit is contained in:
Fabian Maurer 2024-05-15 01:05:04 +02:00 committed by Alexandre Julliard
parent 653f00cf3e
commit 82036f42f1
2 changed files with 220 additions and 2 deletions

View file

@ -155,6 +155,22 @@ library register_test
HRESULT testfunc([in] int i, [out, retval] int *p);
[propget, id(4)]
HRESULT testget([out, retval] ICollection **p);
[propget, id(5)]
HRESULT testget2([out, retval] int *value);
[propget, id(6)]
int testget3();
[propget, id(7)]
int testget4([in] int value);
[propget, id(8)]
int testget5([out,retval] int *value1, [in] int value2);
[propget, id(9)]
int testget6([in] int value1, [in] int value2);
[propget, id(10)]
void testget7([in] int value1, [in] int value2);
[propget, id(11)]
void testget8([out, retval] int* value);
[propput, id(11)]
void testput8([in] int value);
}
/* uuid is same as for test_struct2 in test_tlb.idl, fields are different */

View file

@ -278,6 +278,44 @@ static HRESULT WINAPI invoketest_testget(IInvokeTest *iface, ICollection **p)
return S_OK;
}
static LONG WINAPI invoketest_get_testget2(IInvokeTest *iface, int *value)
{
*value = 4;
return S_OK;
}
static int WINAPI invoketest_get_testget3(IInvokeTest *iface)
{
return 4;
}
static int WINAPI invoketest_get_testget4(IInvokeTest *iface, int value)
{
return 4;
}
static int WINAPI invoketest_get_testget5(IInvokeTest *iface, int *value1, int value2)
{
return 4;
}
static int WINAPI invoketest_get_testget6(IInvokeTest *iface, int value1, int value2)
{
return 4;
}
static void WINAPI invoketest_get_testget7(IInvokeTest *iface, int value1, int value2)
{
}
static void WINAPI invoketest_get_testget8(IInvokeTest *iface, int* value)
{
}
static void WINAPI invoketest_get_testput8(IInvokeTest *iface, int value)
{
}
static const IInvokeTestVtbl invoketestvtbl = {
invoketest_QueryInterface,
invoketest_AddRef,
@ -290,7 +328,15 @@ static const IInvokeTestVtbl invoketestvtbl = {
invoketest_putref_testprop,
invoketest_putref_testprop2,
invoketest_testfunc,
invoketest_testget
invoketest_testget,
invoketest_get_testget2,
invoketest_get_testget3,
invoketest_get_testget4,
invoketest_get_testget5,
invoketest_get_testget6,
invoketest_get_testget7,
invoketest_get_testget8,
invoketest_get_testput8,
};
static IInvokeTest invoketest = { &invoketestvtbl };
@ -850,7 +896,7 @@ static void test_TypeInfo(void)
DISPPARAMS dispparams;
GUID bogusguid = {0x806afb4f,0x13f7,0x42d2,{0x89,0x2c,0x6c,0x97,0xc3,0x6a,0x36,0xc1}};
static const GUID moduleTestGetDllEntryGuid = {0xf073cd92,0xa199,0x11ea,{0xbb,0x37,0x02,0x42,0xac,0x13,0x00,0x02}};
VARIANT var, res, args[2];
VARIANT var, res, args[3];
UINT count, i;
TYPEKIND kind;
const WCHAR *filename;
@ -1177,6 +1223,162 @@ static void test_TypeInfo(void)
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 2, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx, %d\n", hr, i);
V_VT(&res) = VT_I4;
V_I4(&res) = 42;
V_VT(&args[0]) = VT_I4;
V_I4(&args[0]) = 1;
V_VT(&args[1]) = VT_I4;
V_I4(&args[1]) = 1;
V_VT(&args[2]) = VT_I4;
V_I4(&args[2]) = 1;
dispparams.cNamedArgs = 0;
/* call propget with DISPATCH_PROPERTYPUT (missing member id) */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 0xdeadbeef, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int) - 0 params */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int) - 1 param */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int) - 0 params - NULL result passed */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on on HRESULT func(out int) - 1 params - NULL result passed */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 5, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func() - 0 params */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func() - 1 params */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, &res, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func() - 0 params - NULL result passed */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func() - 1 param - NULL result passed */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 6, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int) - 0 param - NULL result passed */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int) - 1 param - NULL result passed */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int) - 2 params - NULL result passed */
dispparams.cArgs = 2;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int) - 3 params - NULL result passed */
dispparams.cArgs = 3;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 7, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 0 param - NULL result passed */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 1 param - NULL result passed */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 2 params - NULL result passed */
dispparams.cArgs = 2;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on HRESULT func(out int, int) - 3 params - NULL result passed */
dispparams.cArgs = 3;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 8, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 0 params - NULL result passed */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 1 params - NULL result passed */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 2 params - NULL result passed */
dispparams.cArgs = 2;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on int func(int, int) - 3 params - NULL result passed */
dispparams.cArgs = 3;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 9, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 0 params - NULL result passed */
dispparams.cArgs = 0;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 1 params - NULL result passed */
dispparams.cArgs = 1;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 2 params - NULL result passed */
dispparams.cArgs = 2;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08lx\n", hr);
/* call propget with DISPATCH_PROPERTYPUT on void func(int, int) - 3 params - NULL result passed */
dispparams.cArgs = 3;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 10, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
todo_wine
ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08lx\n", hr);
/* If there's get and put, the put must work */
/* call propput with DISPATCH_PROPERTYPUT on int func(int) */
dispidMember = DISPID_PROPERTYPUT;
dispparams.cArgs = 1;
dispparams.cNamedArgs = 1;
dispparams.rgdispidNamedArgs = &dispidMember;
hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 11, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, &i);
ok(hr == S_OK, "got 0x%08lx\n", hr);
test_invoke_func(pTypeInfo);
ITypeInfo_Release(pTypeInfo);