https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5f28af7188c133fd14ac5e...
commit 5f28af7188c133fd14ac5e958aa33fd375f8a72f Author: Amine Khaldi amine.khaldi@reactos.org AuthorDate: Sat Jan 20 13:00:17 2018 +0100 Commit: Amine Khaldi amine.khaldi@reactos.org CommitDate: Sat Jan 20 13:00:17 2018 +0100
[OLEAUT32_WINETEST] Sync with Wine 3.0. CORE-14225 --- modules/rostests/winetests/oleaut32/olepicture.c | 176 +++------------------- modules/rostests/winetests/oleaut32/test_reg.idl | 11 ++ modules/rostests/winetests/oleaut32/tmarshal.c | 48 +----- modules/rostests/winetests/oleaut32/typelib.c | 183 +++++++++++++++-------- modules/rostests/winetests/oleaut32/vartest.c | 5 + modules/rostests/winetests/oleaut32/vartype.c | 3 + 6 files changed, 166 insertions(+), 260 deletions(-)
diff --git a/modules/rostests/winetests/oleaut32/olepicture.c b/modules/rostests/winetests/oleaut32/olepicture.c index 02d68a4171..149dfc357f 100644 --- a/modules/rostests/winetests/oleaut32/olepicture.c +++ b/modules/rostests/winetests/oleaut32/olepicture.c @@ -77,7 +77,7 @@ static const unsigned char pngimage[285] = { 0xe7,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 };
-/* 1bpp BI_RGB 1x1 pixel bmp */ +/* 1x1 pixel bmp */ static const unsigned char bmpimage[66] = { 0x42,0x4d,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00, @@ -86,15 +86,6 @@ static const unsigned char bmpimage[66] = { 0x00,0x00 };
-/* 8bpp BI_RLE8 1x1 pixel bmp */ -static const unsigned char bmpimage_rle8[] = { -0x42,0x4d,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00, -0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00, -0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x12,0x0b,0x00,0x00,0x02,0x00, -0x00,0x00,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x01, -0x00,0x00 -}; - /* 2x2 pixel gif */ static const unsigned char gif4pixel[42] = { 0x47,0x49,0x46,0x38,0x37,0x61,0x02,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00, @@ -228,7 +219,7 @@ test_pic_with_stream(LPSTREAM stream, unsigned int imgsize) { BITMAP bmp; GetObjectA(UlongToHandle(handle), sizeof(BITMAP), &bmp); - ok(bmp.bmBits != 0, "not a dib\n"); + todo_wine ok(bmp.bmBits != 0, "not a dib\n"); }
width = 0; @@ -710,7 +701,8 @@ static void test_Render(void) HDC hdc = create_render_dc();
/* test IPicture::Render return code on uninitialized picture */ - OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (VOID**)&pic); + hres = OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (void **)&pic); + ok(hres == S_OK, "Failed to create a picture, hr %#x.\n", hres); hres = IPicture_get_Type(pic, &type); ok(hres == S_OK, "IPicture_get_Type does not return S_OK, but 0x%08x\n", hres); ok(type == PICTYPE_UNINITIALIZED, "Expected type = PICTYPE_UNINITIALIZED, got = %d\n", type); @@ -743,7 +735,8 @@ static void test_Render(void) return; }
- OleCreatePictureIndirect(&desc, &IID_IPicture, TRUE, (VOID**)&pic); + hres = OleCreatePictureIndirect(&desc, &IID_IPicture, TRUE, (void **)&pic); + ok(hres == S_OK, "Failed to create a picture, hr %#x.\n", hres); /* zero dimensions, PICTYPE_ICON */ hres = picture_render(pic, hdc, 0, 0, 0, 0, 0, 0, 0, 0, NULL); ole_expect(hres, CTL_E_INVALIDPROPERTYVALUE); @@ -797,7 +790,8 @@ static void test_get_Attributes(void) short type; DWORD attr;
- OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (VOID**)&pic); + hres = OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (void **)&pic); + ok(hres == S_OK, "Failed to create a picture, hr %#x.\n", hres); hres = IPicture_get_Type(pic, &type); ok(hres == S_OK, "IPicture_get_Type does not return S_OK, but 0x%08x\n", hres); ok(type == PICTYPE_UNINITIALIZED, "Expected type = PICTYPE_UNINITIALIZED, got = %d\n", type); @@ -818,8 +812,8 @@ static void test_get_Handle(void) IPicture *pic; HRESULT hres;
- OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (VOID**)&pic); - + hres = OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (void **)&pic); + ok(hres == S_OK, "Failed to create a picture, hr %#x.\n", hres); hres = IPicture_get_Handle(pic, NULL); ole_expect(hres, E_POINTER);
@@ -831,7 +825,8 @@ static void test_get_Type(void) IPicture *pic; HRESULT hres;
- OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (VOID**)&pic); + hres = OleCreatePictureIndirect(NULL, &IID_IPicture, TRUE, (void **)&pic); + ok(hres == S_OK, "Failed to create a picture, hr %#x.\n", hres);
hres = IPicture_get_Type(pic, NULL); ole_expect(hres, E_POINTER); @@ -852,7 +847,6 @@ static void test_OleLoadPicturePath(void) HANDLE file; DWORD size; WCHAR *ptr; - VARIANT var;
const struct { @@ -919,14 +913,6 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
- VariantInit(&var); - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = SysAllocString(temp_fileW + 8); - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == S_OK, "OleLoadPictureFile error %#x\n", hres); - IPicture_Release(pic); - VariantClear(&var); - /* Try a DOS path with tacked on "file:". */ hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic); ok(hres == S_OK || @@ -935,13 +921,6 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
- VariantInit(&var); - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = SysAllocString(temp_fileW); - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); - VariantClear(&var); - DeleteFileA(temp_file);
/* Try with a nonexistent file. */ @@ -951,26 +930,12 @@ static void test_OleLoadPicturePath(void) broken(hres == E_FAIL), /*Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08x\n", hres);
- VariantInit(&var); - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = SysAllocString(temp_fileW + 8); - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == CTL_E_FILENOTFOUND, "wrong error %#x\n", hres); - VariantClear(&var); - hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic); ok(hres == INET_E_RESOURCE_NOT_FOUND || /* XP+ */ broken(hres == E_UNEXPECTED) || /* NT4 */ broken(hres == E_FAIL), /* Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08x\n", hres);
- VariantInit(&var); - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = SysAllocString(temp_fileW); - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); - VariantClear(&var); - file = CreateFileA(temp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(file, bmpimage, sizeof(bmpimage), &size, NULL); @@ -992,13 +957,6 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
- VariantInit(&var); - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = SysAllocString(temp_fileW); - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); - VariantClear(&var); - DeleteFileA(temp_file);
/* Try with a nonexistent file. */ @@ -1007,22 +965,6 @@ static void test_OleLoadPicturePath(void) broken(hres == E_UNEXPECTED) || /* NT4 */ broken(hres == E_FAIL), /* Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08x\n", hres); - - VariantInit(&var); - V_VT(&var) = VT_BSTR; - V_BSTR(&var) = SysAllocString(temp_fileW); - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); - VariantClear(&var); - - VariantInit(&var); - V_VT(&var) = VT_INT; - V_INT(&var) = 762; - hres = OleLoadPictureFile(var, (IDispatch **)&pic); - ok(hres == CTL_E_FILENOTFOUND, "wrong error %#x\n", hres); - -if (0) /* crashes under Windows */ - hres = OleLoadPictureFile(var, NULL); }
static void test_himetric(void) @@ -1134,14 +1076,18 @@ static void test_load_save_bmp(void) size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine ok(size == 66, "expected 66, got %d\n", size); mem = GlobalLock(hmem); +todo_wine ok(!memcmp(&mem[0], "BM", 2), "got wrong bmp header %04x\n", mem[0]); GlobalUnlock(hmem);
size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); +todo_wine ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); +todo_wine ok(size == -1, "expected -1, got %d\n", size);
offset.QuadPart = 0; @@ -1208,12 +1154,15 @@ static void test_load_save_icon(void) todo_wine ok(size == 766, "expected 766, got %d\n", size); mem = GlobalLock(hmem); +todo_wine ok(mem[0] == 0x00010000, "got wrong icon header %04x\n", mem[0]); GlobalUnlock(hmem);
size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); +todo_wine ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); +todo_wine ok(size == -1, "expected -1, got %d\n", size);
offset.QuadPart = 0; @@ -1279,11 +1228,13 @@ static void test_load_save_empty_picture(void) size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine ok(size == -1, "expected -1, got %d\n", size);
size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); +todo_wine ok(size == -1, "expected -1, got %d\n", size);
hr = IPicture_QueryInterface(pic, &IID_IPersistStream, (void **)&src_stream); @@ -1351,89 +1302,6 @@ static void test_load_save_empty_picture(void) IStream_Release(stream); }
-static void test_load_save_emf(void) -{ - HDC hdc; - IPicture *pic; - PICTDESC desc; - short type; - OLE_HANDLE handle; - HGLOBAL hmem; - DWORD *mem; - ENHMETAHEADER *emh; - IPersistStream *src_stream; - IStream *dst_stream; - LARGE_INTEGER offset; - HRESULT hr; - LONG size; - - hdc = CreateEnhMetaFileA(0, NULL, NULL, NULL); - ok(hdc != 0, "CreateEnhMetaFileA failed\n"); - - desc.cbSizeofstruct = sizeof(desc); - desc.picType = PICTYPE_ENHMETAFILE; - desc.emf.hemf = CloseEnhMetaFile(hdc); - ok(desc.emf.hemf != 0, "CloseEnhMetaFile failed\n"); - hr = OleCreatePictureIndirect(&desc, &IID_IPicture, FALSE, (void**)&pic); - ok(hr == S_OK, "OleCreatePictureIndirect error %#x\n", hr); - - type = -1; - hr = IPicture_get_Type(pic, &type); - ok(hr == S_OK,"get_Type error %#8x\n", hr); - ok(type == PICTYPE_ENHMETAFILE,"expected PICTYPE_ENHMETAFILE, got %d\n", type); - - hr = IPicture_get_Handle(pic, &handle); - ok(hr == S_OK,"get_Handle error %#8x\n", hr); - ok(IntToPtr(handle) == desc.emf.hemf, "get_Handle returned wrong handle %#x\n", handle); - - hmem = GlobalAlloc(GMEM_MOVEABLE, 0); - hr = CreateStreamOnHGlobal(hmem, FALSE, &dst_stream); - ok(hr == S_OK, "createstreamonhglobal error %#x\n", hr); - - size = -1; - hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); - ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); - ok(size == 128, "expected 128, got %d\n", size); - emh = GlobalLock(hmem); -if (size) -{ - ok(emh->iType == EMR_HEADER, "wrong iType %04x\n", emh->iType); - ok(emh->dSignature == ENHMETA_SIGNATURE, "wrong dSignature %08x\n", emh->dSignature); -} - GlobalUnlock(hmem); - - size = -1; - hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); - ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); - ok(size == -1, "expected -1, got %d\n", size); - - offset.QuadPart = 0; - hr = IStream_Seek(dst_stream, offset, SEEK_SET, NULL); - ok(hr == S_OK, "IStream_Seek %#x\n", hr); - - hr = IPicture_QueryInterface(pic, &IID_IPersistStream, (void **)&src_stream); - ok(hr == S_OK, "QueryInterface error %#x\n", hr); - - hr = IPersistStream_Save(src_stream, dst_stream, TRUE); - ok(hr == S_OK, "Save error %#x\n", hr); - - IPersistStream_Release(src_stream); - IStream_Release(dst_stream); - - mem = GlobalLock(hmem); - ok(!memcmp(mem, "lt\0\0", 4), "got wrong stream header %04x\n", mem[0]); - ok(mem[1] == 128, "expected 128, got %u\n", mem[1]); - emh = (ENHMETAHEADER *)(mem + 2); - ok(emh->iType == EMR_HEADER, "wrong iType %04x\n", emh->iType); - ok(emh->dSignature == ENHMETA_SIGNATURE, "wrong dSignature %08x\n", emh->dSignature); - - GlobalUnlock(hmem); - GlobalFree(hmem); - - DeleteEnhMetaFile(desc.emf.hemf); - IPicture_Release(pic); -} - START_TEST(olepicture) { hOleaut32 = GetModuleHandleA("oleaut32.dll"); @@ -1449,7 +1317,6 @@ START_TEST(olepicture) test_pic(gifimage, sizeof(gifimage)); test_pic(jpgimage, sizeof(jpgimage)); test_pic(bmpimage, sizeof(bmpimage)); - test_pic(bmpimage_rle8, sizeof(bmpimage_rle8)); test_pic(gif4pixel, sizeof(gif4pixel)); /* FIXME: No PNG support in Windows... */ if (0) test_pic(pngimage, sizeof(pngimage)); @@ -1474,7 +1341,6 @@ START_TEST(olepicture) test_load_save_bmp(); test_load_save_icon(); test_load_save_empty_picture(); - test_load_save_emf(); }
diff --git a/modules/rostests/winetests/oleaut32/test_reg.idl b/modules/rostests/winetests/oleaut32/test_reg.idl index 179d8c51a4..c9be76b027 100644 --- a/modules/rostests/winetests/oleaut32/test_reg.idl +++ b/modules/rostests/winetests/oleaut32/test_reg.idl @@ -130,6 +130,15 @@ library register_test interface Iole_from_disp; }
+ [ + uuid(fed318b2-c2ed-11e7-abc4-cec278b6b50a) + ] + interface ICollection : IDispatch + { + [id(DISPID_VALUE)] + HRESULT Item([in] int i, [out, retval] int *p); + } + [ uuid(f1b68c3b-02a3-4110-bc4c-cf9bc7e7f177) ] @@ -143,6 +152,8 @@ library register_test LONG testprop2([in] IUnknown *i); [id(3)] HRESULT testfunc([in] int i, [out, retval] int *p); + [propget, id(4)] + HRESULT testget([out, retval] ICollection **p); }
/* uuid is same as for test_struct2 in test_tlb.idl, fields are different */ diff --git a/modules/rostests/winetests/oleaut32/tmarshal.c b/modules/rostests/winetests/oleaut32/tmarshal.c index c801494c49..ad29d95780 100644 --- a/modules/rostests/winetests/oleaut32/tmarshal.c +++ b/modules/rostests/winetests/oleaut32/tmarshal.c @@ -1355,7 +1355,7 @@ static void test_typelibmarshal(void) ok(!lstrcmpW(bstr, szCat), "IWidget_get_Name should have returned string "Cat" instead of %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr);
- /* call DoSomething without optional arguments */ + /* call DoSomething */ VariantInit(&vararg[0]); VariantInit(&vararg[1]); V_VT(&vararg[1]) = VT_R8; @@ -1370,43 +1370,6 @@ static void test_typelibmarshal(void) ok(V_VT(&varresult) == VT_EMPTY, "varresult should be VT_EMPTY\n"); VariantClear(&varresult);
- /* call DoSomething with optional argument set to VT_EMPTY */ - VariantInit(&vararg[0]); - VariantInit(&vararg[1]); - VariantInit(&vararg[2]); - V_VT(&vararg[2]) = VT_R8; - V_R8(&vararg[2]) = 3.141; - dispparams.cNamedArgs = 0; - dispparams.cArgs = 3; - dispparams.rgdispidNamedArgs = NULL; - dispparams.rgvarg = vararg; - VariantInit(&varresult); - hr = IDispatch_Invoke(pDispatch, DISPID_TM_DOSOMETHING, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); - ok_ole_success(hr, IDispatch_Invoke); - ok(V_VT(&varresult) == VT_EMPTY, "varresult should be VT_EMPTY\n"); - VariantClear(&varresult); - - /* call DoSomething with optional arguments set to VT_ERROR/DISP_E_PARAMNOTFOUND */ - VariantInit(&vararg[0]); - VariantInit(&vararg[1]); - VariantInit(&vararg[2]); - VariantInit(&vararg[3]); - V_VT(&vararg[3]) = VT_R8; - V_R8(&vararg[3]) = 3.141; - V_VT(&vararg[1]) = VT_ERROR; - V_ERROR(&vararg[1]) = DISP_E_PARAMNOTFOUND; - V_VT(&vararg[0]) = VT_ERROR; - V_ERROR(&vararg[0]) = DISP_E_PARAMNOTFOUND; - dispparams.cNamedArgs = 0; - dispparams.cArgs = 4; - dispparams.rgdispidNamedArgs = NULL; - dispparams.rgvarg = vararg; - VariantInit(&varresult); - hr = IDispatch_Invoke(pDispatch, DISPID_TM_DOSOMETHING, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); - ok_ole_success(hr, IDispatch_Invoke); - ok(V_VT(&varresult) == VT_EMPTY, "varresult should be VT_EMPTY\n"); - VariantClear(&varresult); - /* call get_State */ dispparams.cNamedArgs = 0; dispparams.cArgs = 0; @@ -1542,15 +1505,11 @@ static void test_typelibmarshal(void) dispparams.rgvarg = vararg; VariantInit(&varresult); hr = IDispatch_Invoke(pDispatch, DISPID_TM_COCLASS, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); - ok_ole_success(hr, IDispatch_Invoke); + todo_wine ok_ole_success(hr, IDispatch_Invoke); ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK, "EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n", excepinfo.wCode, excepinfo.scode); VariantClear(&varresult); - - /* call CoClass (direct) */ - hr = IWidget_Coclass(pWidget, (void *)V_DISPATCH(&vararg[0])); - ok_ole_success(hr, IWidget_Coclass); VariantClear(&vararg[0]);
/* call Value with a VT_VARIANT|VT_BYREF type */ @@ -2043,7 +2002,8 @@ static void test_external_connection(void) todo_wine ok(external_connections == 2, "external_connections = %d\n", external_connections);
- ITestSecondDisp_Release(second); + if (hres == S_OK) + ITestSecondDisp_Release(second); todo_wine ok(external_connections == 2, "external_connections = %d\n", external_connections);
diff --git a/modules/rostests/winetests/oleaut32/typelib.c b/modules/rostests/winetests/oleaut32/typelib.c index c6626991c0..5f7e599a5d 100644 --- a/modules/rostests/winetests/oleaut32/typelib.c +++ b/modules/rostests/winetests/oleaut32/typelib.c @@ -74,6 +74,97 @@ static WCHAR wszguid[] = {'g','u','i','d',0};
static const BOOL is_win64 = sizeof(void *) > sizeof(int);
+#ifdef __i386__ +static const BOOL abi_supports_stdcall = TRUE; +#else +static const BOOL abi_supports_stdcall = FALSE; +#endif + +static HRESULT WINAPI collection_QueryInterface(ICollection *iface, REFIID riid, void **ret) +{ + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDispatch) || + IsEqualIID(riid, &IID_ICollection)) + { + *ret = iface; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI collection_AddRef(ICollection *iface) +{ + return 2; +} + +static ULONG WINAPI collection_Release(ICollection *iface) +{ + return 1; +} + +static HRESULT WINAPI collection_GetTypeInfoCount(ICollection *iface, UINT *cnt) +{ + ok(0, "unexpected call\n"); + *cnt = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI collection_GetTypeInfo(ICollection *iface, UINT index, LCID lcid, ITypeInfo **ti) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI collection_GetIDsOfNames(ICollection *iface, REFIID riid, LPOLESTR *names, + UINT cnt, LCID lcid, DISPID *dispid) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI collection_Invoke(ICollection *iface, DISPID dispid, REFIID riid, + LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr) +{ + if(dispid != DISPID_VALUE) { + ok(0, "unexpected call\n"); + return E_NOTIMPL; + } + + ok(flags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET), "flags = %x\n", flags); + ok(dispparams != NULL, "dispparams == NULL\n"); + ok(!dispparams->rgdispidNamedArgs, "dispparams->rgdispidNamedArgs != NULL\n"); + ok(dispparams->cArgs == 1, "dispparams->cArgs = %d\n", dispparams->cArgs); + ok(!dispparams->cNamedArgs, "dispparams->cNamedArgs = %d\n", dispparams->cNamedArgs); + ok(V_VT(dispparams->rgvarg) == VT_I4, "V_VT(dispparams->rgvarg) = %d\n", V_VT(dispparams->rgvarg)); + ok(V_I4(dispparams->rgvarg) == 7, "V_I4(dispparams->rgvarg) = %d\n", V_I4(dispparams->rgvarg)); + ok(res != NULL, "res == NULL\n"); + ok(V_VT(res) == VT_EMPTY, "V_VT(res) = %d\n", V_VT(res)); + + V_VT(res) = VT_I4; + V_I4(res) = 15; + return S_OK; +} + +static HRESULT WINAPI collection_Item(ICollection *iface, int i, int *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const ICollectionVtbl collectionvtbl = { + collection_QueryInterface, + collection_AddRef, + collection_Release, + collection_GetTypeInfoCount, + collection_GetTypeInfo, + collection_GetIDsOfNames, + collection_Invoke, + collection_Item +}; + +static ICollection collection = { &collectionvtbl }; + static HRESULT WINAPI invoketest_QueryInterface(IInvokeTest *iface, REFIID riid, void **ret) { if (IsEqualIID(riid, &IID_IUnknown) || @@ -145,6 +236,13 @@ static HRESULT WINAPI invoketest_testfunc(IInvokeTest *iface, int i, int *p) return S_OK; }
+static HRESULT WINAPI invoketest_testget(IInvokeTest *iface, ICollection **p) +{ + *p = &collection; + ICollection_AddRef(&collection); + return S_OK; +} + static const IInvokeTestVtbl invoketestvtbl = { invoketest_QueryInterface, invoketest_AddRef, @@ -156,7 +254,8 @@ static const IInvokeTestVtbl invoketestvtbl = { invoketest_get_test, invoketest_putref_testprop, invoketest_putref_testprop2, - invoketest_testfunc + invoketest_testfunc, + invoketest_testget };
static IInvokeTest invoketest = { &invoketestvtbl }; @@ -944,6 +1043,22 @@ static void test_TypeInfo(void) ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res)); ok(V_I4(&res) == 1, "got %d\n", V_I4(&res));
+ /* call propget with DISPATCH_METHOD|DISPATCH_PROPERTYGET flags */ + V_VT(&args[0]) = VT_I4; + V_I4(&args[0]) = 7; + + dispparams.cArgs = 1; + dispparams.rgvarg = args; + + i = 0; + V_VT(&res) = VT_EMPTY; + V_I4(&res) = 0; + hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, 4, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, &res, NULL, &i); + ok(hr == S_OK, "got 0x%08x, %d\n", hr, i); + ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res)); + ok(V_I4(&res) == 15, "got %d\n", V_I4(&res)); + + /* DISPATCH_PROPERTYPUTREF */ l = 1; V_VT(&args[0]) = VT_I4|VT_BYREF; @@ -1066,41 +1181,11 @@ static HRESULT WINAPI ret_false_func(void) return S_FALSE; }
-static const WCHAR testW[] = { 'T','e','s','t',0 }; - -static void WINAPI variant_func2(VARIANT *ret, VARIANT v1, VARIANT v2) -{ - ok(V_VT(&v1) == VT_I4, "unexpected %d\n", V_VT(&v1)); - ok(V_I4(&v1) == 2, "unexpected %d\n", V_I4(&v1)); - ok(V_VT(&v2) == VT_BSTR, "unexpected %d\n", V_VT(&v2)); - ok(lstrcmpW(V_BSTR(&v2), testW) == 0, "unexpected %s\n", wine_dbgstr_w(V_BSTR(&v2))); - - V_VT(ret) = VT_UI4; - V_I4(ret) = 4321; -} - -static void WINAPI inst_func2(void *inst, VARIANT *ret, VARIANT v1, VARIANT v2) -{ - ok( (*(void ***)inst)[3] == inst_func2, "wrong ptr %p\n", inst ); - - ok(V_VT(ret) == VT_I4 || broken(V_VT(ret) == VT_VARIANT) /* win64 */, "unexpected %d\n", V_VT(ret)); - ok(V_I4(ret) == 1234, "unexpected %d\n", V_I4(ret)); - - ok(V_VT(&v1) == VT_I4, "unexpected %d\n", V_VT(&v1)); - ok(V_I4(&v1) == 2, "unexpected %d\n", V_I4(&v1)); - ok(V_VT(&v2) == VT_BSTR, "unexpected %d\n", V_VT(&v2)); - ok(lstrcmpW(V_BSTR(&v2), testW) == 0, "unexpected %s\n", wine_dbgstr_w(V_BSTR(&v2))); - - V_VT(ret) = VT_UI4; - V_I4(ret) = 4321; -} - -static void *vtable[] = { NULL, NULL, NULL, inst_func }; -static void *vtable2[] = { NULL, NULL, NULL, inst_func2 }; +static const void *vtable[] = { NULL, NULL, NULL, inst_func };
static void test_DispCallFunc(void) { - void **inst; + const void **inst = vtable; HRESULT res; VARIANT result, args[5]; VARIANTARG *pargs[5]; @@ -1109,30 +1194,6 @@ static void test_DispCallFunc(void)
for (i = 0; i < 5; i++) pargs[i] = &args[i];
- memset( args, 0x55, sizeof(args) ); - - types[0] = VT_VARIANT; - V_VT(&args[0]) = VT_I4; - V_I4(&args[0]) = 2; - types[1] = VT_VARIANT; - V_VT(&args[1]) = VT_BSTR; - V_BSTR(&args[1]) = SysAllocString(testW); - memset( &result, 0xcc, sizeof(result) ); - res = DispCallFunc(NULL, (ULONG_PTR)variant_func2, CC_STDCALL, VT_VARIANT, 2, types, pargs, &result); - ok(res == S_OK, "DispCallFunc error %#x\n", res); - ok(V_VT(&result) == VT_UI4, "wrong result type %d\n", V_VT(&result)); - ok(V_UI4(&result) == 4321, "wrong result %u\n", V_UI4(&result)); - - V_VT(&result) = VT_I4; - V_UI4(&result) = 1234; - inst = vtable2; - res = DispCallFunc(&inst, 3 * sizeof(void *), CC_STDCALL, VT_VARIANT, 2, types, pargs, &result); - ok(res == S_OK, "DispCallFunc error %#x\n", res); - ok(V_VT(&result) == VT_UI4, "wrong result type %d\n", V_VT(&result)); - ok(V_UI4(&result) == 4321, "wrong result %u\n", V_UI4(&result)); - - VariantClear(&args[1]); - memset( args, 0x55, sizeof(args) ); types[0] = VT_UI4; V_UI4(&args[0]) = 1; @@ -1151,7 +1212,7 @@ static void test_DispCallFunc(void) ok( V_UI4(&result) == 4321, "wrong result %u\n", V_UI4(&result) );
/* the function checks the argument sizes for stdcall */ - if (!is_win64) /* no stdcall on 64-bit */ + if (abi_supports_stdcall) { res = DispCallFunc( NULL, (ULONG_PTR)stdcall_func, CC_STDCALL, VT_UI4, 0, types, pargs, &result ); ok( res == DISP_E_BADCALLEE, "DispCallFunc wrong error %x\n", res ); @@ -1231,7 +1292,6 @@ static void test_DispCallFunc(void) types[0] = VT_I4; V_I4(&args[0]) = 3; memset( &result, 0xcc, sizeof(result) ); - inst = vtable; res = DispCallFunc( &inst, 3 * sizeof(void*), CC_STDCALL, VT_I4, 1, types, pargs, &result ); ok( res == S_OK, "DispCallFunc failed %x\n", res ); ok( V_VT(&result) == VT_I4, "wrong result type %d\n", V_VT(&result) ); @@ -4868,7 +4928,7 @@ static void test_register_typelib(BOOL system_registration) { TYPEKIND kind; WORD flags; - } attrs[13] = + } attrs[] = { { TKIND_INTERFACE, 0 }, { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE }, @@ -4882,6 +4942,7 @@ static void test_register_typelib(BOOL system_registration) { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE }, { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE }, { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE }, + { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE }, { TKIND_RECORD, 0 } };
@@ -4917,7 +4978,7 @@ static void test_register_typelib(BOOL system_registration) ok(hr == S_OK, "got %08x\n", hr);
count = ITypeLib_GetTypeInfoCount(typelib); - ok(count == 13, "got %d\n", count); + ok(count == 14, "got %d\n", count);
for(i = 0; i < count; i++) { diff --git a/modules/rostests/winetests/oleaut32/vartest.c b/modules/rostests/winetests/oleaut32/vartest.c index 38eb1806a8..0d0d76012e 100644 --- a/modules/rostests/winetests/oleaut32/vartest.c +++ b/modules/rostests/winetests/oleaut32/vartest.c @@ -1930,6 +1930,11 @@ static void test_VarNumFromParseNum(void)
/* Currency is preferred over decimal */ SETRGB(0, 1); CONVERT(1,0,0,1,0,0, VTBIT_CY|VTBIT_DECIMAL); EXPECT_CY(1); + + /* Underflow test */ + SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_R4); EXPECT_R4(0.0); + SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_R8); EXPECT_R8(0.0); + SETRGB(0, 1); CONVERT(1,0,NUMPRS_EXPONENT,1,0,-94938484, VTBIT_CY); EXPECT_CY(0); }
diff --git a/modules/rostests/winetests/oleaut32/vartype.c b/modules/rostests/winetests/oleaut32/vartype.c index 5086e4b500..a831393858 100644 --- a/modules/rostests/winetests/oleaut32/vartype.c +++ b/modules/rostests/winetests/oleaut32/vartype.c @@ -2722,6 +2722,7 @@ static void test_VarR8FromStr(void) CONVERT_STR(VarR8FromStr,"0.5",LOCALE_NOUSEROVERRIDE); EXPECT(0.5); CONVERT_STR(VarR8FromStr,"0.6",LOCALE_NOUSEROVERRIDE); EXPECT(0.6); CONVERT_STR(VarR8FromStr,"1.5",LOCALE_NOUSEROVERRIDE); EXPECT(1.5); + CONVERT_STR(VarR8FromStr,"1e-94938484",LOCALE_NOUSEROVERRIDE); EXPECT(0);
/* We already have exhaustive tests for number parsing, so skip those tests here */ } @@ -3102,6 +3103,8 @@ static void test_VarDateFromStr(void) DFS("6/30/2011 01:20:34"); EXPECT_DBL(40724.05594907407); DFS("6/30/2011 01:20:34 AM"); EXPECT_DBL(40724.05594907407); DFS("6/30/2011 01:20:34 PM"); EXPECT_DBL(40724.55594907407); + DFS("2013-05-14 02:04:12"); EXPECT_DBL(41408.08625000001); + DFS("2013-05-14 02:04:12.017000000"); EXPECT_MISMATCH; /* Native fails "1999 January 3, 9AM". I consider that a bug in native */
/* test a data with ideographic space */