From: Alistair Leslie-Hughes Subject: [PATCH v2] msxml3/test: Add XMLParser Tests Message-Id: Date: Tue, 2 Aug 2016 08:02:11 +0000 With Signed-off. Signed-off-by: Alistair Leslie-Hughes --- dlls/msxml3/tests/xmlparser.c | 196 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 188 insertions(+), 8 deletions(-) diff --git a/dlls/msxml3/tests/xmlparser.c b/dlls/msxml3/tests/xmlparser.c index 32514e3..bf896e4 100644 --- a/dlls/msxml3/tests/xmlparser.c +++ b/dlls/msxml3/tests/xmlparser.c @@ -26,8 +26,45 @@ #include "windows.h" #include "ole2.h" #include "xmlparser.h" +#include "rpcproxy.h" #include "wine/test.h" +#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0) + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +#define CLEAR_CALLED(func) \ + expect_ ## func = called_ ## func = FALSE + +DEFINE_EXPECT(NotifyStartDocument); +DEFINE_EXPECT(NotifyEndDocument); +DEFINE_EXPECT(NotifyEndProlog); +DEFINE_EXPECT(NotifyDataAvailable); +DEFINE_EXPECT(FactoryError); + +const char empty_document[] = ""; + +static HRESULT hresult_NotifyEvent = S_OK; static HRESULT WINAPI nodefact_QueryInterface(IXMLNodeFactory *iface, REFIID riid, void **ppvObject) @@ -54,34 +91,67 @@ static ULONG WINAPI nodefact_Release(IXMLNodeFactory *iface) } static HRESULT WINAPI nodefact_NotifyEvent(IXMLNodeFactory *iface, - IXMLNodeSource *pSource, XML_NODEFACTORY_EVENT iEvt) + IXMLNodeSource *source, XML_NODEFACTORY_EVENT event) { - return E_NOTIMPL; + switch(event) + { + case XMLNF_STARTDOCUMENT: + CHECK_EXPECT(NotifyStartDocument); + trace("NotifyEvent: XMLNF_STARTDOCUMENT\n"); + break; + case XMLNF_ENDPROLOG: + CHECK_EXPECT(NotifyEndProlog); + trace("NotifyEvent: XMLNF_ENDPROLOG\n"); + break; + case XMLNF_ENDDOCUMENT: + CHECK_EXPECT(NotifyEndDocument); + trace("NotifyEvent: XMLNF_ENDDOCUMENT\n"); + break; + case XMLNF_DATAAVAILABLE: + CHECK_EXPECT(NotifyDataAvailable); + trace("NotifyEvent: XMLNF_DATAAVAILABLE\n"); + break; + default: + ok(0, "Unsupported NotifyEvent %p %d\n", source, event); + return E_FAIL; + } + + return hresult_NotifyEvent; } static HRESULT WINAPI nodefact_BeginChildren(IXMLNodeFactory *iface, IXMLNodeSource *pSource, XML_NODE_INFO *pNodeInfo) { - return E_NOTIMPL; + trace("nodefact_BeginChildren %p %p %d\n", pSource, pNodeInfo, + pNodeInfo ? pNodeInfo->dwType : 0); + return S_OK; } static HRESULT WINAPI nodefact_EndChildren(IXMLNodeFactory *iface, IXMLNodeSource *pSource, BOOL fEmpty, XML_NODE_INFO *pNodeInfo) { - return E_NOTIMPL; + trace("nodefact_EndChildren %p %d %p %d\n", pSource, fEmpty, pNodeInfo, + pNodeInfo ? pNodeInfo->dwType : 0); + return S_OK; } static HRESULT WINAPI nodefact_Error(IXMLNodeFactory *iface, IXMLNodeSource *pSource, HRESULT hrErrorCode, USHORT cNumRecs, XML_NODE_INFO **ppNodeInfo) { - return E_NOTIMPL; + CHECK_EXPECT(FactoryError); + trace("nodefact_Error %p %08x %d %p\n", pSource, hrErrorCode, cNumRecs, ppNodeInfo); + return S_OK; } -static HRESULT WINAPI nodefact_CreateNode(IXMLNodeFactory *iface, IXMLNodeSource *pSource, - PVOID pNodeParent, USHORT cNumRecs, XML_NODE_INFO **ppNodeInfo) +static HRESULT WINAPI nodefact_CreateNode(IXMLNodeFactory *iface, IXMLNodeSource *source, + void *parent, USHORT recs, XML_NODE_INFO **nodeinfo) { - return E_NOTIMPL; + trace("nodefact_CreateNode %p %p %d %p\n", source, parent, recs, nodeinfo); + + *nodeinfo = NULL; + + return S_OK; } static const IXMLNodeFactoryVtbl nodefactoryVtbl = @@ -150,6 +220,114 @@ static void create_test(void) IXMLParser_Release(parser); } +static void parse_documnet(void) +{ + HRESULT hr; + IXMLParser *parser; + IStream* stream = NULL; + HGLOBAL hMem; + LPBYTE bytes; + + hr = CoCreateInstance(&CLSID_XMLParser30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLParser, (void**)&parser); + if (FAILED(hr)) + { + win_skip("IXMLParser is not available (0x%08x)\n", hr); + return; + } + + hMem = GlobalAlloc(GMEM_MOVEABLE, strlen(empty_document)); + bytes = GlobalLock(hMem); + memcpy(bytes, empty_document, strlen(empty_document)); + GlobalUnlock(hMem); + + CreateStreamOnHGlobal(hMem, TRUE, &stream); + + hr = IXMLParser_SetFactory(parser, &thenodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_SetInput(parser, (IUnknown *)stream); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_GetParserState(parser); + ok(hr == XMLPARSER_IDLE, "got 0x%08x\n", hr); + + SET_EXPECT(NotifyStartDocument); + SET_EXPECT(NotifyEndDocument); + SET_EXPECT(NotifyEndProlog); + SET_EXPECT(NotifyDataAvailable); + hr = IXMLParser_Run(parser, -1); + todo_wine ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + todo_wine CHECK_CALLED(NotifyStartDocument); + todo_wine CHECK_CALLED(NotifyEndDocument); + todo_wine CHECK_CALLED(NotifyEndProlog); + todo_wine CHECK_CALLED(NotifyDataAvailable); + + hr = IXMLParser_GetParserState(parser); + todo_wine ok(hr == XMLPARSER_STOPPED, "got 0x%08x\n", hr); + + CLEAR_CALLED(NotifyStartDocument); + CLEAR_CALLED(NotifyEndDocument); + CLEAR_CALLED(NotifyEndProlog); + CLEAR_CALLED(NotifyDataAvailable); + + IXMLParser_Release(parser); + IStream_Release(stream); +} + +static void parse_documnet_error(void) +{ + HRESULT hr; + IXMLParser *parser; + IStream* stream = NULL; + HGLOBAL hMem; + LPBYTE bytes; + + hr = CoCreateInstance(&CLSID_XMLParser30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLParser, (void**)&parser); + if (FAILED(hr)) + { + win_skip("IXMLParser is not available (0x%08x)\n", hr); + return; + } + + hMem = GlobalAlloc(GMEM_MOVEABLE, strlen(empty_document)); + bytes = GlobalLock(hMem); + memcpy(bytes, empty_document, strlen(empty_document)); + GlobalUnlock(hMem); + + CreateStreamOnHGlobal(hMem, TRUE, &stream); + + hr = IXMLParser_SetFactory(parser, &thenodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_SetInput(parser, (IUnknown *)stream); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_GetParserState(parser); + ok(hr == XMLPARSER_IDLE, "got 0x%08x\n", hr); + + hresult_NotifyEvent = E_FAIL; + SET_EXPECT(NotifyStartDocument); + SET_EXPECT(NotifyEndDocument); + SET_EXPECT(FactoryError); + hr = IXMLParser_Run(parser, -1); + todo_wine ok(hr == E_FAIL, "Expected S_OK got 0x%08x\n", hr); + todo_wine CHECK_CALLED(NotifyStartDocument); + todo_wine CHECK_CALLED(NotifyEndDocument); + todo_wine CHECK_CALLED(FactoryError); + + hr = IXMLParser_GetParserState(parser); + todo_wine ok(hr == XMLPARSER_ERROR, "got 0x%08x\n", hr); + + CLEAR_CALLED(NotifyStartDocument); + CLEAR_CALLED(NotifyEndDocument); + CLEAR_CALLED(NotifyEndProlog); + CLEAR_CALLED(NotifyDataAvailable); + CLEAR_CALLED(FactoryError); + + IXMLParser_Release(parser); + IStream_Release(stream); +} + START_TEST(xmlparser) { HRESULT hr; @@ -160,6 +338,8 @@ START_TEST(xmlparser) return; create_test(); + parse_documnet(); + parse_documnet_error(); CoUninitialize(); } -- 1.9.1