Nikolay Sivov : oleaut32: Some tests for IFontEventsDisp change event.

Alexandre Julliard julliard at winehq.org
Mon Feb 24 15:42:30 CST 2014


Module: wine
Branch: master
Commit: 0fb770492d30b8fee4a295a08fc0c98e0b63f12a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0fb770492d30b8fee4a295a08fc0c98e0b63f12a

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Feb 24 08:17:19 2014 +0400

oleaut32: Some tests for IFontEventsDisp change event.

---

 dlls/oleaut32/olefont.c       |    5 +-
 dlls/oleaut32/tests/olefont.c |  167 +++++++++++++++++++++++++++++++----------
 2 files changed, 130 insertions(+), 42 deletions(-)

diff --git a/dlls/oleaut32/olefont.c b/dlls/oleaut32/olefont.c
index bf69950..7f8ab5d 100644
--- a/dlls/oleaut32/olefont.c
+++ b/dlls/oleaut32/olefont.c
@@ -388,7 +388,7 @@ static void OLEFont_SendNotify(OLEFontImpl* this, DISPID dispID)
   static const WCHAR wszUnder[] = {'U','n','d','e','r','l','i','n','e',0};
   static const WCHAR wszStrike[] = {'S','t','r','i','k','e','t','h','r','o','u','g','h',0};
   static const WCHAR wszWeight[] = {'W','e','i','g','h','t',0};
-  static const WCHAR wszCharset[] = {'C','h','a','r','s','s','e','t',0};
+  static const WCHAR wszCharset[] = {'C','h','a','r','s','e','t',0};
   static const LPCWSTR dispid_mapping[] =
   {
     wszName,
@@ -1305,9 +1305,6 @@ static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(
 /************************************************************************
  * OLEFontImpl_Invoke (IDispatch)
  * 
- * Note: Do not call _put_Xxx methods, since setting things here
- * should not call notify functions as I found out debugging the generic
- * MS VB5 installer.
  */
 static HRESULT WINAPI OLEFontImpl_Invoke(
   IDispatch*  iface,
diff --git a/dlls/oleaut32/tests/olefont.c b/dlls/oleaut32/tests/olefont.c
index 0eab729..53afc8d 100644
--- a/dlls/oleaut32/tests/olefont.c
+++ b/dlls/oleaut32/tests/olefont.c
@@ -261,10 +261,7 @@ static void test_type_info(void)
 	IFontDisp_Release(fontdisp);
 }
 
-static HRESULT WINAPI FontEventsDisp_QueryInterface(
-        IFontEventsDisp *iface,
-    /* [in] */ REFIID riid,
-    /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+static HRESULT WINAPI FontEventsDisp_QueryInterface(IFontEventsDisp *iface, REFIID riid, void **ppvObject)
 {
     if (IsEqualIID(riid, &IID_IFontEventsDisp) || IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDispatch))
     {
@@ -291,26 +288,48 @@ static ULONG WINAPI FontEventsDisp_Release(
     return 1;
 }
 
-static int fonteventsdisp_invoke_called = 0;
+static HRESULT WINAPI FontEventsDisp_GetTypeInfoCount(IFontEventsDisp *iface, UINT *pctinfo)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FontEventsDisp_GetTypeInfo(IFontEventsDisp *iface, UINT itinfo, LCID lcid, ITypeInfo **pptinfo)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI FontEventsDisp_GetIDsOfNames(IFontEventsDisp *iface, REFIID riid, LPOLESTR *names, UINT cNames, LCID lcid,
+    DISPID *dispid)
+{
+    ok(0, "unexpected call\n");
+    return E_NOTIMPL;
+}
+
+static int fonteventsdisp_invoke_called;
+static BSTR fonteventsdisp_invoke_arg0;
 
 static HRESULT WINAPI FontEventsDisp_Invoke(
-        IFontEventsDisp __RPC_FAR * iface,
-    /* [in] */ DISPID dispIdMember,
-    /* [in] */ REFIID riid,
-    /* [in] */ LCID lcid,
-    /* [in] */ WORD wFlags,
-    /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
-    /* [out] */ VARIANT __RPC_FAR *pVarResult,
-    /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
-    /* [out] */ UINT __RPC_FAR *puArgErr)
+        IFontEventsDisp *iface,
+        DISPID dispid,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr)
 {
-    static const WCHAR wszBold[] = {'B','o','l','d',0};
-    ok(wFlags == INVOKE_FUNC, "invoke flags should have been INVOKE_FUNC instead of 0x%x\n", wFlags);
-    ok(dispIdMember == DISPID_FONT_CHANGED, "dispIdMember should have been DISPID_FONT_CHANGED instead of 0x%x\n", dispIdMember);
-    ok(pDispParams->cArgs == 1, "pDispParams->cArgs should have been 1 instead of %d\n", pDispParams->cArgs);
-    ok(V_VT(&pDispParams->rgvarg[0]) == VT_BSTR, "VT of first param should have been VT_BSTR instead of %d\n", V_VT(&pDispParams->rgvarg[0]));
-    ok(!lstrcmpW(V_BSTR(&pDispParams->rgvarg[0]), wszBold), "String in first param should have been \"Bold\"\n");
+    VARIANTARG *arg0 = &pDispParams->rgvarg[0];
+
+    ok(dispid == DISPID_FONT_CHANGED, "expected DISPID_FONT_CHANGED instead of 0x%x\n", dispid);
+    ok(IsEqualGUID(riid, &GUID_NULL), "got riid %s\n", wine_dbgstr_guid(riid));
+    ok(wFlags == INVOKE_FUNC, "expected INVOKE_FUNC instead of 0x%x\n", wFlags);
+    ok(pDispParams->cArgs == 1, "expected arg count 1, got %d\n", pDispParams->cArgs);
+    ok(V_VT(arg0) == VT_BSTR, "expected VT_BSTR, got %d\n", V_VT(arg0));
 
+    fonteventsdisp_invoke_arg0 = SysAllocString(V_BSTR(arg0));
     fonteventsdisp_invoke_called++;
     return S_OK;
 }
@@ -320,16 +339,43 @@ static IFontEventsDispVtbl FontEventsDisp_Vtbl =
     FontEventsDisp_QueryInterface,
     FontEventsDisp_AddRef,
     FontEventsDisp_Release,
-    NULL,
-    NULL,
-    NULL,
+    FontEventsDisp_GetTypeInfoCount,
+    FontEventsDisp_GetTypeInfo,
+    FontEventsDisp_GetIDsOfNames,
     FontEventsDisp_Invoke
 };
 
 static IFontEventsDisp FontEventsDisp = { &FontEventsDisp_Vtbl };
 
+    struct font_dispid
+    {
+        DISPID dispid;
+        const WCHAR *name;
+    };
+
 static void test_font_events_disp(void)
 {
+    static const WCHAR nameW[] = {'N','a','m','e',0};
+    static const WCHAR sizeW[] = {'S','i','z','e',0};
+    static const WCHAR boldW[] = {'B','o','l','d',0};
+    static const WCHAR italicW[] = {'I','t','a','l','i','c',0};
+    static const WCHAR underlineW[] = {'U','n','d','e','r','l','i','n','e',0};
+    static const WCHAR strikeW[] = {'S','t','r','i','k','e','t','h','r','o','u','g','h',0};
+    static const WCHAR weightW[] = {'W','e','i','g','h','t',0};
+    static const WCHAR charsetW[] = {'C','h','a','r','s','e','t',0};
+
+    static const struct font_dispid font_dispids[] =
+    {
+        { DISPID_FONT_NAME, nameW },
+        { DISPID_FONT_SIZE, sizeW },
+        { DISPID_FONT_BOLD, boldW },
+        { DISPID_FONT_ITALIC, italicW },
+        { DISPID_FONT_UNDER, underlineW },
+        { DISPID_FONT_STRIKE, strikeW },
+        { DISPID_FONT_WEIGHT, weightW },
+        { DISPID_FONT_CHARSET, charsetW }
+    };
+
     IFont *pFont;
     IFont *pFont2;
     IConnectionPointContainer *pCPC;
@@ -340,6 +386,7 @@ static void test_font_events_disp(void)
     IFontDisp *pFontDisp;
     DISPPARAMS dispparams;
     VARIANTARG vararg;
+    INT i;
 
     fontdesc.cbSizeofstruct = sizeof(fontdesc);
     fontdesc.lpstrName = MSSansSerif_font;
@@ -364,6 +411,7 @@ static void test_font_events_disp(void)
     EXPECT_HR(hr, S_OK);
     IConnectionPoint_Release(pCP);
 
+    fonteventsdisp_invoke_called = 0;
     hr = IFont_put_Bold(pFont, TRUE);
     EXPECT_HR(hr, S_OK);
 
@@ -372,30 +420,73 @@ static void test_font_events_disp(void)
     hr = IFont_QueryInterface(pFont, &IID_IFontDisp, (void **)&pFontDisp);
     EXPECT_HR(hr, S_OK);
 
-    V_VT(&vararg) = VT_BOOL;
-    V_BOOL(&vararg) = VARIANT_FALSE;
-    dispparams.cNamedArgs = 0;
-    dispparams.rgdispidNamedArgs = NULL;
-    dispparams.cArgs = 1;
-    dispparams.rgvarg = &vararg;
-    hr = IFontDisp_Invoke(pFontDisp, DISPID_FONT_BOLD, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL);
-    EXPECT_HR(hr, S_OK);
+    for (i = 0; i < sizeof(font_dispids)/sizeof(font_dispids[0]); i++)
+    {
+        switch (font_dispids[i].dispid)
+        {
+        case DISPID_FONT_NAME:
+        {
+            static const WCHAR arialW[] = {'A','r','i','a','l',0};
+            V_VT(&vararg) = VT_BSTR;
+            V_BSTR(&vararg) = SysAllocString(arialW);
+            break;
+        }
+        case DISPID_FONT_SIZE:
+            V_VT(&vararg) = VT_CY;
+            V_CY(&vararg).Lo = 25;
+            V_CY(&vararg).Hi = 0;
+            break;
+        case DISPID_FONT_BOLD:
+            V_VT(&vararg) = VT_BOOL;
+            V_BOOL(&vararg) = VARIANT_FALSE;
+            break;
+        case DISPID_FONT_ITALIC:
+        case DISPID_FONT_UNDER:
+        case DISPID_FONT_STRIKE:
+            V_VT(&vararg) = VT_BOOL;
+            V_BOOL(&vararg) = VARIANT_TRUE;
+            break;
+        case DISPID_FONT_WEIGHT:
+            V_VT(&vararg) = VT_I2;
+            V_I2(&vararg) = FW_BLACK;
+            break;
+        case DISPID_FONT_CHARSET:
+            V_VT(&vararg) = VT_I2;
+            V_I2(&vararg) = 1;
+            break;
+        default:
+            ;
+        }
 
-    IFontDisp_Release(pFontDisp);
+        dispparams.cNamedArgs = 0;
+        dispparams.rgdispidNamedArgs = NULL;
+        dispparams.cArgs = 1;
+        dispparams.rgvarg = &vararg;
+        fonteventsdisp_invoke_called = 0;
+        hr = IFontDisp_Invoke(pFontDisp, font_dispids[i].dispid, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL);
+        ok(hr == S_OK, "dispid=%d, got 0x%08x\n", font_dispids[i].dispid, hr);
+        ok(fonteventsdisp_invoke_called == 1, "dispid=%d, DISPID_FONT_CHANGED not called, got %d\n", font_dispids[i].dispid,
+            fonteventsdisp_invoke_called);
+        if (hr == S_OK)
+        {
+            ok(!lstrcmpW(font_dispids[i].name, fonteventsdisp_invoke_arg0), "dispid=%d, got %s, expected %s\n",
+                font_dispids[i].dispid, wine_dbgstr_w(fonteventsdisp_invoke_arg0), wine_dbgstr_w(font_dispids[i].name));
+            SysFreeString(fonteventsdisp_invoke_arg0);
+        }
+        VariantClear(&vararg);
+    }
 
-    ok(fonteventsdisp_invoke_called == 2, "IFontEventDisp::Invoke was called %d times instead of twice\n",
-        fonteventsdisp_invoke_called);
+    IFontDisp_Release(pFontDisp);
 
     hr = IFont_Clone(pFont, &pFont2);
     EXPECT_HR(hr, S_OK);
     IFont_Release(pFont);
 
+    /* this test shows that the notification routine isn't called again */
+    fonteventsdisp_invoke_called = 0;
     hr = IFont_put_Bold(pFont2, FALSE);
     EXPECT_HR(hr, S_OK);
-
-    /* this test shows that the notification routine isn't called again */
-    ok(fonteventsdisp_invoke_called == 2, "IFontEventDisp::Invoke was called %d times instead of twice\n",
-        fonteventsdisp_invoke_called);
+    ok(fonteventsdisp_invoke_called == 0, "got %d\n", fonteventsdisp_invoke_called);
 
     IFont_Release(pFont2);
 }




More information about the wine-cvs mailing list