On 02.08.2016 11:02, Alistair Leslie-Hughes wrote:
With Signed-off.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com
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"
Why do you need this?
+static HRESULT hresult_NotifyEvent = S_OK;
Please move this global variable to factory instance.
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;
}
Arguably trace()'s are not really useful in this context, and will appear on every parsing test.
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);
Main problem is that this does not test actual callback order - actual ordering is
- start document; - create node; - end children; - end prolog; - data available; - end document;
Please use test sequences facility saxreader.c is using - add_call(), ok_sequence(), etc.
START_TEST(xmlparser) { HRESULT hr; @@ -160,6 +338,8 @@ START_TEST(xmlparser) return;
create_test();
- parse_documnet();
- parse_documnet_error();
I guess it was meant to be 'document'.
CoUninitialize();
}