Aric Stewart : msctf/tests: Test framework for ITfKeyEventSink.
Alexandre Julliard
julliard at winehq.org
Thu Apr 23 11:27:26 CDT 2009
Module: wine
Branch: master
Commit: bd598adfdd2f601d07229c2e4a5748a700b84af8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bd598adfdd2f601d07229c2e4a5748a700b84af8
Author: Aric Stewart <aric at codeweavers.com>
Date: Wed Apr 22 12:37:57 2009 -0500
msctf/tests: Test framework for ITfKeyEventSink.
---
dlls/msctf/tests/inputprocessor.c | 136 +++++++++++++++++++++++++++++++++++++
1 files changed, 136 insertions(+), 0 deletions(-)
diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c
index 2b2adde..3556922 100644
--- a/dlls/msctf/tests/inputprocessor.c
+++ b/dlls/msctf/tests/inputprocessor.c
@@ -53,6 +53,7 @@ static INT test_OnSetFocus = SINK_UNEXPECTED;
static INT test_OnInitDocumentMgr = SINK_UNEXPECTED;
static INT test_OnPushContext = SINK_UNEXPECTED;
static INT test_OnPopContext = SINK_UNEXPECTED;
+static INT test_KEV_OnSetFocus = SINK_UNEXPECTED;
HRESULT RegisterTextService(REFCLSID rclsid);
HRESULT UnregisterTextService();
@@ -259,12 +260,138 @@ static void test_ThreadMgrUnadviseSinks(void)
ITfSource_Release(source);
}
+/**********************************************************************
+ * ITfKeyEventSink
+ **********************************************************************/
+typedef struct tagKeyEventSink
+{
+ const ITfKeyEventSinkVtbl *KeyEventSinkVtbl;
+ LONG refCount;
+} KeyEventSink;
+
+static void KeyEventSink_Destructor(KeyEventSink *This)
+{
+ HeapFree(GetProcessHeap(),0,This);
+}
+
+static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut)
+{
+ KeyEventSink *This = (KeyEventSink *)iface;
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink))
+ {
+ *ppvOut = This;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface)
+{
+ KeyEventSink *This = (KeyEventSink *)iface;
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface)
+{
+ KeyEventSink *This = (KeyEventSink *)iface;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ KeyEventSink_Destructor(This);
+ return ret;
+}
+
+static HRESULT WINAPI KeyEventSink_OnSetFocus(ITfKeyEventSink *iface,
+ BOOL fForeground)
+{
+ ok(test_KEV_OnSetFocus == SINK_EXPECTED,"Unexpected KeyEventSink_OnSetFocus\n");
+ test_KEV_OnSetFocus = SINK_FIRED;
+ return S_OK;
+}
+
+static HRESULT WINAPI KeyEventSink_OnTestKeyDown(ITfKeyEventSink *iface,
+ ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
+{
+ trace("\n");
+ return S_OK;
+}
+
+static HRESULT WINAPI KeyEventSink_OnTestKeyUp(ITfKeyEventSink *iface,
+ ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
+{
+ trace("\n");
+ return S_OK;
+}
+
+static HRESULT WINAPI KeyEventSink_OnKeyDown(ITfKeyEventSink *iface,
+ ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
+{
+ trace("\n");
+ return S_OK;
+}
+
+static HRESULT WINAPI KeyEventSink_OnKeyUp(ITfKeyEventSink *iface,
+ ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
+{
+ trace("\n");
+ return S_OK;
+}
+
+static HRESULT WINAPI KeyEventSink_OnPreservedKey(ITfKeyEventSink *iface,
+ ITfContext *pic, REFGUID rguid, BOOL *pfEaten)
+{
+ trace("\n");
+ return S_OK;
+}
+
+static const ITfKeyEventSinkVtbl KeyEventSink_KeyEventSinkVtbl =
+{
+ KeyEventSink_QueryInterface,
+ KeyEventSink_AddRef,
+ KeyEventSink_Release,
+
+ KeyEventSink_OnSetFocus,
+ KeyEventSink_OnTestKeyDown,
+ KeyEventSink_OnTestKeyUp,
+ KeyEventSink_OnKeyDown,
+ KeyEventSink_OnKeyUp,
+ KeyEventSink_OnPreservedKey
+};
+
+HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut)
+{
+ KeyEventSink *This;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(KeyEventSink));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl;
+ This->refCount = 1;
+
+ *ppOut = (ITfKeyEventSink*)This;
+ return S_OK;
+}
+
+
static void test_KeystrokeMgr(void)
{
ITfKeystrokeMgr *keymgr= NULL;
HRESULT hr;
TF_PRESERVEDKEY tfpk;
BOOL preserved;
+ ITfKeyEventSink *sink;
+
+ KeyEventSink_Constructor(&sink);
hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfKeystrokeMgr, (LPVOID*)&keymgr);
ok(SUCCEEDED(hr),"Failed to get IID_ITfKeystrokeMgr for ThreadMgr\n");
@@ -272,6 +399,11 @@ static void test_KeystrokeMgr(void)
tfpk.uVKey = 'A';
tfpk.uModifiers = TF_MOD_SHIFT;
+ test_KEV_OnSetFocus = SINK_EXPECTED;
+ hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE);
+ todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_AdviseKeyEventSink failed\n");
+ todo_wine ok(test_KEV_OnSetFocus == SINK_FIRED, "KeyEventSink_OnSetFocus not fired as expected\n");
+
hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0);
todo_wine ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n");
@@ -296,7 +428,11 @@ static void test_KeystrokeMgr(void)
hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk);
todo_wine ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n");
+ hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid);
+ todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n");
+
ITfKeystrokeMgr_Release(keymgr);
+ ITfKeyEventSink_Release(sink);
}
static void test_Activate(void)
More information about the wine-cvs
mailing list