[OLEAUT32_WINETEST] Sync with Wine 3.0. CORE-14225
authorAmine Khaldi <amine.khaldi@reactos.org>
Sat, 20 Jan 2018 12:00:17 +0000 (13:00 +0100)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sat, 20 Jan 2018 12:00:17 +0000 (13:00 +0100)
modules/rostests/winetests/oleaut32/olepicture.c
modules/rostests/winetests/oleaut32/test_reg.idl
modules/rostests/winetests/oleaut32/tmarshal.c
modules/rostests/winetests/oleaut32/typelib.c
modules/rostests/winetests/oleaut32/vartest.c
modules/rostests/winetests/oleaut32/vartype.c

index 02d68a4..149dfc3 100644 (file)
@@ -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();
 }
 
 
index 179d8c5..c9be76b 100644 (file)
@@ -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 */
index c801494..ad29d95 100644 (file)
@@ -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);
 
index c662699..5f7e599 100644 (file)
@@ -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++)
     {
index 38eb180..0d0d760 100644 (file)
@@ -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);
 }
 
 
index 5086e4b..a831393 100644 (file)
@@ -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 */