[PATCH] msxml3/test: Add XMLParser Tests
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Mon Aug 1 04:45:21 CDT 2016
---
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[] = "<?xml version=\"1.0\" ?><root></root>";
+
+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
More information about the wine-patches
mailing list