4 * Copyright 2008 Piotr Caban
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "wine/test.h"
34 CH_PUTDOCUMENTLOCATOR
,
37 CH_STARTPREFIXMAPPING
,
42 CH_IGNORABLEWHITESPACE
,
43 CH_PROCESSINGINSTRUCTION
,
47 static const WCHAR szSimpleXML
[] = {
48 '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\"','1','.','0','\"',' ','?','>','\n',
49 '<','B','a','n','k','A','c','c','o','u','n','t','>','\n',
50 ' ',' ',' ','<','N','u','m','b','e','r','>','1','2','3','4','<','/','N','u','m','b','e','r','>','\n',
51 ' ',' ',' ','<','N','a','m','e','>','C','a','p','t','a','i','n',' ','A','h','a','b','<','/','N','a','m','e','>','\n',
52 '<','/','B','a','n','k','A','c','c','o','u','n','t','>','\n','\0'
55 static const WCHAR szCarriageRetTest
[] = {
56 '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','"','1','.','0','"','?','>','\r','\n',
57 '<','B','a','n','k','A','c','c','o','u','n','t','>','\r','\n',
58 '\t','<','N','u','m','b','e','r','>','1','2','3','4','<','/','N','u','m','b','e','r','>','\r','\n',
59 '\t','<','N','a','m','e','>','C','a','p','t','a','i','n',' ','A','h','a','b','<','/','N','a','m','e','>','\r','\n',
60 '<','/','B','a','n','k','A','c','c','o','u','n','t','>','\0'
63 static const CHAR szTestXML
[] =
64 "<?xml version=\"1.0\" ?>\n"
66 " <Number>1234</Number>\n"
67 " <Name>Captain Ahab</Name>\n"
70 typedef struct _contenthandlercheck
{
77 } content_handler_test
;
79 static content_handler_test contentHandlerTest1
[] = {
80 { CH_PUTDOCUMENTLOCATOR
, 0, 0 },
81 { CH_STARTDOCUMENT
, 0, 0 },
82 { CH_STARTELEMENT
, 2, 14, "", "BankAccount", "BankAccount" },
83 { CH_CHARACTERS
, 2, 14, "\n " },
84 { CH_STARTELEMENT
, 3, 12, "", "Number", "Number" },
85 { CH_CHARACTERS
, 3, 12, "1234" },
86 { CH_ENDELEMENT
, 3, 18, "", "Number", "Number" },
87 { CH_CHARACTERS
, 3, 25, "\n " },
88 { CH_STARTELEMENT
, 4, 10, "", "Name", "Name" },
89 { CH_CHARACTERS
, 4, 10, "Captain Ahab" },
90 { CH_ENDELEMENT
, 4, 24, "", "Name", "Name" },
91 { CH_CHARACTERS
, 4, 29, "\n" },
92 { CH_ENDELEMENT
, 5, 3, "", "BankAccount", "BankAccount" },
93 { CH_ENDDOCUMENT
, 0, 0 },
97 static content_handler_test contentHandlerTest2
[] = {
98 { CH_PUTDOCUMENTLOCATOR
, 0, 0 },
99 { CH_STARTDOCUMENT
, 0, 0 },
100 { CH_STARTELEMENT
, 2, 14, "", "BankAccount", "BankAccount" },
101 { CH_CHARACTERS
, 2, 14, "\n" },
102 { CH_CHARACTERS
, 2, 16, "\t" },
103 { CH_STARTELEMENT
, 3, 10, "", "Number", "Number" },
104 { CH_CHARACTERS
, 3, 10, "1234" },
105 { CH_ENDELEMENT
, 3, 16, "", "Number", "Number" },
106 { CH_CHARACTERS
, 3, 23, "\n" },
107 { CH_CHARACTERS
, 3, 25, "\t" },
108 { CH_STARTELEMENT
, 4, 8, "", "Name", "Name" },
109 { CH_CHARACTERS
, 4, 8, "Captain Ahab" },
110 { CH_ENDELEMENT
, 4, 22, "", "Name", "Name" },
111 { CH_CHARACTERS
, 4, 27, "\n" },
112 { CH_ENDELEMENT
, 5, 3, "", "BankAccount", "BankAccount" },
113 { CH_ENDDOCUMENT
, 0, 0 },
117 static content_handler_test
*expectCall
;
118 static ISAXLocator
*locator
;
120 static const char *debugstr_wn(const WCHAR
*szStr
, int len
)
122 static char buf
[1024];
123 WideCharToMultiByte(CP_ACP
, 0, szStr
, len
, buf
, sizeof(buf
), NULL
, NULL
);
127 static void test_saxstr(unsigned line
, const WCHAR
*szStr
, int nStr
, const char *szTest
)
133 ok_(__FILE__
,line
) (szStr
== NULL
, "szStr != NULL\n");
134 ok_(__FILE__
,line
) (nStr
== 0, "nStr = %d, expected 0\n", nStr
);
138 len
= strlen(szTest
);
139 ok_(__FILE__
,line
) (len
== nStr
, "nStr = %d, expected %d (%s)\n", nStr
, len
, szTest
);
143 MultiByteToWideChar(CP_ACP
, 0, szTest
, -1, buf
, sizeof(buf
)/sizeof(WCHAR
));
144 ok_(__FILE__
,line
) (!memcmp(szStr
, buf
, len
*sizeof(WCHAR
)), "unexpected szStr %s, expected %s\n",
145 debugstr_wn(szStr
, nStr
), szTest
);
148 static BOOL
test_expect_call(CH id
)
150 ok(expectCall
->id
== id
, "unexpected call %d, expected %d\n", id
, expectCall
->id
);
151 return expectCall
->id
== id
;
154 static void test_locator(unsigned line
, int loc_line
, int loc_column
)
157 ISAXLocator_getLineNumber(locator
, &rline
);
158 ISAXLocator_getColumnNumber(locator
, &rcolumn
);
160 ok_(__FILE__
,line
) (rline
== loc_line
,
161 "unexpected line %d, expected %d\n", rline
, loc_line
);
162 ok_(__FILE__
,line
) (rcolumn
== loc_column
,
163 "unexpected column %d, expected %d\n", rcolumn
, loc_column
);
166 static HRESULT WINAPI
contentHandler_QueryInterface(
167 ISAXContentHandler
* iface
,
173 if(IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_ISAXContentHandler
))
179 return E_NOINTERFACE
;
185 static ULONG WINAPI
contentHandler_AddRef(
186 ISAXContentHandler
* iface
)
191 static ULONG WINAPI
contentHandler_Release(
192 ISAXContentHandler
* iface
)
197 static HRESULT WINAPI
contentHandler_putDocumentLocator(
198 ISAXContentHandler
* iface
,
199 ISAXLocator
*pLocator
)
201 if(!test_expect_call(CH_PUTDOCUMENTLOCATOR
))
205 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
211 static HRESULT WINAPI
contentHandler_startDocument(
212 ISAXContentHandler
* iface
)
214 if(!test_expect_call(CH_STARTDOCUMENT
))
217 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
223 static HRESULT WINAPI
contentHandler_endDocument(
224 ISAXContentHandler
* iface
)
226 if(!test_expect_call(CH_ENDDOCUMENT
))
229 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
235 static HRESULT WINAPI
contentHandler_startPrefixMapping(
236 ISAXContentHandler
* iface
,
237 const WCHAR
*pPrefix
,
242 if(!test_expect_call(CH_ENDDOCUMENT
))
245 test_saxstr(__LINE__
, pPrefix
, nPrefix
, expectCall
->arg1
);
246 test_saxstr(__LINE__
, pUri
, nUri
, expectCall
->arg2
);
247 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
253 static HRESULT WINAPI
contentHandler_endPrefixMapping(
254 ISAXContentHandler
* iface
,
255 const WCHAR
*pPrefix
,
258 if(!test_expect_call(CH_ENDPREFIXMAPPING
))
261 test_saxstr(__LINE__
, pPrefix
, nPrefix
, expectCall
->arg1
);
262 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
268 static HRESULT WINAPI
contentHandler_startElement(
269 ISAXContentHandler
* iface
,
270 const WCHAR
*pNamespaceUri
,
272 const WCHAR
*pLocalName
,
276 ISAXAttributes
*pAttr
)
278 if(!test_expect_call(CH_STARTELEMENT
))
281 test_saxstr(__LINE__
, pNamespaceUri
, nNamespaceUri
, expectCall
->arg1
);
282 test_saxstr(__LINE__
, pLocalName
, nLocalName
, expectCall
->arg2
);
283 test_saxstr(__LINE__
, pQName
, nQName
, expectCall
->arg3
);
284 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
290 static HRESULT WINAPI
contentHandler_endElement(
291 ISAXContentHandler
* iface
,
292 const WCHAR
*pNamespaceUri
,
294 const WCHAR
*pLocalName
,
299 if(!test_expect_call(CH_ENDELEMENT
))
302 test_saxstr(__LINE__
, pNamespaceUri
, nNamespaceUri
, expectCall
->arg1
);
303 test_saxstr(__LINE__
, pLocalName
, nLocalName
, expectCall
->arg2
);
304 test_saxstr(__LINE__
, pQName
, nQName
, expectCall
->arg3
);
305 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
311 static HRESULT WINAPI
contentHandler_characters(
312 ISAXContentHandler
* iface
,
316 if(!test_expect_call(CH_CHARACTERS
))
319 test_saxstr(__LINE__
, pChars
, nChars
, expectCall
->arg1
);
320 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
326 static HRESULT WINAPI
contentHandler_ignorableWhitespace(
327 ISAXContentHandler
* iface
,
331 if(!test_expect_call(CH_IGNORABLEWHITESPACE
))
334 test_saxstr(__LINE__
, pChars
, nChars
, expectCall
->arg1
);
335 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
341 static HRESULT WINAPI
contentHandler_processingInstruction(
342 ISAXContentHandler
* iface
,
343 const WCHAR
*pTarget
,
348 if(!test_expect_call(CH_PROCESSINGINSTRUCTION
))
351 test_saxstr(__LINE__
, pTarget
, nTarget
, expectCall
->arg1
);
352 test_saxstr(__LINE__
, pData
, nData
, expectCall
->arg2
);
353 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
359 static HRESULT WINAPI
contentHandler_skippedEntity(
360 ISAXContentHandler
* iface
,
364 if(!test_expect_call(CH_SKIPPEDENTITY
))
367 test_saxstr(__LINE__
, pName
, nName
, expectCall
->arg1
);
368 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
375 static const ISAXContentHandlerVtbl contentHandlerVtbl
=
377 contentHandler_QueryInterface
,
378 contentHandler_AddRef
,
379 contentHandler_Release
,
380 contentHandler_putDocumentLocator
,
381 contentHandler_startDocument
,
382 contentHandler_endDocument
,
383 contentHandler_startPrefixMapping
,
384 contentHandler_endPrefixMapping
,
385 contentHandler_startElement
,
386 contentHandler_endElement
,
387 contentHandler_characters
,
388 contentHandler_ignorableWhitespace
,
389 contentHandler_processingInstruction
,
390 contentHandler_skippedEntity
393 static ISAXContentHandler contentHandler
= { &contentHandlerVtbl
};
395 static HRESULT WINAPI
isaxerrorHandler_QueryInterface(
396 ISAXErrorHandler
* iface
,
402 if(IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_ISAXErrorHandler
))
408 return E_NOINTERFACE
;
414 static ULONG WINAPI
isaxerrorHandler_AddRef(
415 ISAXErrorHandler
* iface
)
420 static ULONG WINAPI
isaxerrorHandler_Release(
421 ISAXErrorHandler
* iface
)
426 static HRESULT WINAPI
isaxerrorHandler_error(
427 ISAXErrorHandler
* iface
,
428 ISAXLocator
*pLocator
,
429 const WCHAR
*pErrorMessage
,
435 static HRESULT WINAPI
isaxerrorHandler_fatalError(
436 ISAXErrorHandler
* iface
,
437 ISAXLocator
*pLocator
,
438 const WCHAR
*pErrorMessage
,
444 static HRESULT WINAPI
isaxerrorHanddler_ignorableWarning(
445 ISAXErrorHandler
* iface
,
446 ISAXLocator
*pLocator
,
447 const WCHAR
*pErrorMessage
,
453 static const ISAXErrorHandlerVtbl errorHandlerVtbl
=
455 isaxerrorHandler_QueryInterface
,
456 isaxerrorHandler_AddRef
,
457 isaxerrorHandler_Release
,
458 isaxerrorHandler_error
,
459 isaxerrorHandler_fatalError
,
460 isaxerrorHanddler_ignorableWarning
463 static ISAXErrorHandler errorHandler
= { &errorHandlerVtbl
};
465 static void test_saxreader(void)
468 ISAXXMLReader
*reader
= NULL
;
470 ISAXContentHandler
*lpContentHandler
;
471 ISAXErrorHandler
*lpErrorHandler
;
473 SAFEARRAYBOUND SADim
[1];
474 char *pSAData
= NULL
;
476 ULARGE_INTEGER liSize
;
480 static const CHAR testXmlA
[] = "test.xml";
481 static const WCHAR testXmlW
[] = {'t','e','s','t','.','x','m','l',0};
482 IXMLDOMDocument
*domDocument
;
486 hr
= CoCreateInstance(&CLSID_SAXXMLReader
, NULL
, CLSCTX_INPROC_SERVER
,
487 &IID_ISAXXMLReader
, (LPVOID
*)&reader
);
491 skip("Failed to create SAXXMLReader instance\n");
495 hr
= ISAXXMLReader_getContentHandler(reader
, NULL
);
496 ok(hr
== E_POINTER
, "Expected E_POINTER, got %08x\n", hr
);
498 hr
= ISAXXMLReader_getErrorHandler(reader
, NULL
);
499 ok(hr
== E_POINTER
, "Expected E_POINTER, got %08x\n", hr
);
501 hr
= ISAXXMLReader_getContentHandler(reader
, &lpContentHandler
);
502 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
503 ok(lpContentHandler
== NULL
, "Expected %p, got %p\n", NULL
, lpContentHandler
);
505 hr
= ISAXXMLReader_getErrorHandler(reader
, &lpErrorHandler
);
506 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
507 ok(lpErrorHandler
== NULL
, "Expected %p, got %p\n", NULL
, lpErrorHandler
);
509 hr
= ISAXXMLReader_putContentHandler(reader
, NULL
);
510 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
512 hr
= ISAXXMLReader_putContentHandler(reader
, &contentHandler
);
513 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
515 hr
= ISAXXMLReader_putErrorHandler(reader
, &errorHandler
);
516 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
518 hr
= ISAXXMLReader_getContentHandler(reader
, &lpContentHandler
);
519 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
520 ok(lpContentHandler
== &contentHandler
, "Expected %p, got %p\n", &contentHandler
, lpContentHandler
);
522 V_VT(&var
) = VT_BSTR
;
523 V_BSTR(&var
) = SysAllocString(szSimpleXML
);
525 expectCall
= contentHandlerTest1
;
526 hr
= ISAXXMLReader_parse(reader
, var
);
527 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
528 test_expect_call(CH_ENDTEST
);
531 SADim
[0].cElements
= sizeof(szTestXML
)-1;
532 pSA
= SafeArrayCreate(VT_UI1
, 1, SADim
);
533 SafeArrayAccessData(pSA
, (void**)&pSAData
);
534 memcpy(pSAData
, szTestXML
, sizeof(szTestXML
)-1);
535 SafeArrayUnaccessData(pSA
);
536 V_VT(&var
) = VT_ARRAY
|VT_UI1
;
539 expectCall
= contentHandlerTest1
;
540 hr
= ISAXXMLReader_parse(reader
, var
);
541 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
542 test_expect_call(CH_ENDTEST
);
544 SafeArrayDestroy(pSA
);
546 CreateStreamOnHGlobal(NULL
, TRUE
, &iStream
);
547 liSize
.QuadPart
= strlen(szTestXML
);
548 IStream_SetSize(iStream
, liSize
);
549 IStream_Write(iStream
, (void const*)szTestXML
, strlen(szTestXML
), &bytesWritten
);
551 IStream_Seek(iStream
, liPos
, STREAM_SEEK_SET
, NULL
);
552 V_VT(&var
) = VT_UNKNOWN
|VT_DISPATCH
;
553 V_UNKNOWN(&var
) = (IUnknown
*)iStream
;
555 expectCall
= contentHandlerTest1
;
556 hr
= ISAXXMLReader_parse(reader
, var
);
557 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
558 test_expect_call(CH_ENDTEST
);
560 IStream_Release(iStream
);
562 V_VT(&var
) = VT_BSTR
;
563 V_BSTR(&var
) = SysAllocString(szCarriageRetTest
);
565 expectCall
= contentHandlerTest2
;
566 hr
= ISAXXMLReader_parse(reader
, var
);
567 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
568 test_expect_call(CH_ENDTEST
);
570 file
= CreateFileA(testXmlA
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
571 ok(file
!= INVALID_HANDLE_VALUE
, "Could not create file: %u\n", GetLastError());
572 WriteFile(file
, szTestXML
, sizeof(szTestXML
)-1, &bytesWritten
, NULL
);
575 expectCall
= contentHandlerTest1
;
576 hr
= ISAXXMLReader_parseURL(reader
, testXmlW
);
577 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
578 test_expect_call(CH_ENDTEST
);
580 DeleteFileA(testXmlA
);
582 hr
= CoCreateInstance(&CLSID_DOMDocument
, NULL
, CLSCTX_INPROC_SERVER
,
583 &IID_IXMLDOMDocument
, (LPVOID
*)&domDocument
);
586 skip("Failed to create DOMDocument instance\n");
589 bstrData
= SysAllocString(szSimpleXML
);
590 hr
= IXMLDOMDocument_loadXML(domDocument
, bstrData
, &vBool
);
591 V_VT(&var
) = VT_UNKNOWN
;
592 V_UNKNOWN(&var
) = (IUnknown
*)domDocument
;
594 expectCall
= contentHandlerTest2
;
595 hr
= ISAXXMLReader_parse(reader
, var
);
596 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
597 test_expect_call(CH_ENDTEST
);
598 IXMLDOMDocument_Release(domDocument
);
600 ISAXXMLReader_Release(reader
);
603 START_TEST(saxreader
)
607 hr
= CoInitialize(NULL
);
608 ok(hr
== S_OK
, "failed to init com\n");