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