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 void test_saxstr(unsigned line
, const WCHAR
*szStr
, int nStr
, const char *szTest
)
126 ok_(__FILE__
,line
) (szStr
== NULL
, "szStr != NULL\n");
127 ok_(__FILE__
,line
) (nStr
== 0, "nStr = %d, expected 0\n", nStr
);
131 len
= strlen(szTest
);
132 ok_(__FILE__
,line
) (len
== nStr
, "nStr = %d, expected %d (%s)\n", nStr
, len
, szTest
);
136 MultiByteToWideChar(CP_ACP
, 0, szTest
, -1, buf
, sizeof(buf
)/sizeof(WCHAR
));
137 ok_(__FILE__
,line
) (!memcmp(szStr
, buf
, len
*sizeof(WCHAR
)), "unexpected szStr %s, expected %s\n",
138 wine_dbgstr_wn(szStr
, nStr
), szTest
);
141 static BOOL
test_expect_call(CH id
)
143 ok(expectCall
->id
== id
, "unexpected call %d, expected %d\n", id
, expectCall
->id
);
144 return expectCall
->id
== id
;
147 static void test_locator(unsigned line
, int loc_line
, int loc_column
)
150 ISAXLocator_getLineNumber(locator
, &rline
);
151 ISAXLocator_getColumnNumber(locator
, &rcolumn
);
153 ok_(__FILE__
,line
) (rline
== loc_line
,
154 "unexpected line %d, expected %d\n", rline
, loc_line
);
155 ok_(__FILE__
,line
) (rcolumn
== loc_column
,
156 "unexpected column %d, expected %d\n", rcolumn
, loc_column
);
159 static HRESULT WINAPI
contentHandler_QueryInterface(
160 ISAXContentHandler
* iface
,
166 if(IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_ISAXContentHandler
))
172 return E_NOINTERFACE
;
178 static ULONG WINAPI
contentHandler_AddRef(
179 ISAXContentHandler
* iface
)
184 static ULONG WINAPI
contentHandler_Release(
185 ISAXContentHandler
* iface
)
190 static HRESULT WINAPI
contentHandler_putDocumentLocator(
191 ISAXContentHandler
* iface
,
192 ISAXLocator
*pLocator
)
194 if(!test_expect_call(CH_PUTDOCUMENTLOCATOR
))
198 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
204 static HRESULT WINAPI
contentHandler_startDocument(
205 ISAXContentHandler
* iface
)
207 if(!test_expect_call(CH_STARTDOCUMENT
))
210 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
216 static HRESULT WINAPI
contentHandler_endDocument(
217 ISAXContentHandler
* iface
)
219 if(!test_expect_call(CH_ENDDOCUMENT
))
222 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
228 static HRESULT WINAPI
contentHandler_startPrefixMapping(
229 ISAXContentHandler
* iface
,
230 const WCHAR
*pPrefix
,
235 if(!test_expect_call(CH_ENDDOCUMENT
))
238 test_saxstr(__LINE__
, pPrefix
, nPrefix
, expectCall
->arg1
);
239 test_saxstr(__LINE__
, pUri
, nUri
, expectCall
->arg2
);
240 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
246 static HRESULT WINAPI
contentHandler_endPrefixMapping(
247 ISAXContentHandler
* iface
,
248 const WCHAR
*pPrefix
,
251 if(!test_expect_call(CH_ENDPREFIXMAPPING
))
254 test_saxstr(__LINE__
, pPrefix
, nPrefix
, expectCall
->arg1
);
255 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
261 static HRESULT WINAPI
contentHandler_startElement(
262 ISAXContentHandler
* iface
,
263 const WCHAR
*pNamespaceUri
,
265 const WCHAR
*pLocalName
,
269 ISAXAttributes
*pAttr
)
271 if(!test_expect_call(CH_STARTELEMENT
))
274 test_saxstr(__LINE__
, pNamespaceUri
, nNamespaceUri
, expectCall
->arg1
);
275 test_saxstr(__LINE__
, pLocalName
, nLocalName
, expectCall
->arg2
);
276 test_saxstr(__LINE__
, pQName
, nQName
, expectCall
->arg3
);
277 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
283 static HRESULT WINAPI
contentHandler_endElement(
284 ISAXContentHandler
* iface
,
285 const WCHAR
*pNamespaceUri
,
287 const WCHAR
*pLocalName
,
292 if(!test_expect_call(CH_ENDELEMENT
))
295 test_saxstr(__LINE__
, pNamespaceUri
, nNamespaceUri
, expectCall
->arg1
);
296 test_saxstr(__LINE__
, pLocalName
, nLocalName
, expectCall
->arg2
);
297 test_saxstr(__LINE__
, pQName
, nQName
, expectCall
->arg3
);
298 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
304 static HRESULT WINAPI
contentHandler_characters(
305 ISAXContentHandler
* iface
,
309 if(!test_expect_call(CH_CHARACTERS
))
312 test_saxstr(__LINE__
, pChars
, nChars
, expectCall
->arg1
);
313 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
319 static HRESULT WINAPI
contentHandler_ignorableWhitespace(
320 ISAXContentHandler
* iface
,
324 if(!test_expect_call(CH_IGNORABLEWHITESPACE
))
327 test_saxstr(__LINE__
, pChars
, nChars
, expectCall
->arg1
);
328 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
334 static HRESULT WINAPI
contentHandler_processingInstruction(
335 ISAXContentHandler
* iface
,
336 const WCHAR
*pTarget
,
341 if(!test_expect_call(CH_PROCESSINGINSTRUCTION
))
344 test_saxstr(__LINE__
, pTarget
, nTarget
, expectCall
->arg1
);
345 test_saxstr(__LINE__
, pData
, nData
, expectCall
->arg2
);
346 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
352 static HRESULT WINAPI
contentHandler_skippedEntity(
353 ISAXContentHandler
* iface
,
357 if(!test_expect_call(CH_SKIPPEDENTITY
))
360 test_saxstr(__LINE__
, pName
, nName
, expectCall
->arg1
);
361 test_locator(__LINE__
, expectCall
->line
, expectCall
->column
);
368 static const ISAXContentHandlerVtbl contentHandlerVtbl
=
370 contentHandler_QueryInterface
,
371 contentHandler_AddRef
,
372 contentHandler_Release
,
373 contentHandler_putDocumentLocator
,
374 contentHandler_startDocument
,
375 contentHandler_endDocument
,
376 contentHandler_startPrefixMapping
,
377 contentHandler_endPrefixMapping
,
378 contentHandler_startElement
,
379 contentHandler_endElement
,
380 contentHandler_characters
,
381 contentHandler_ignorableWhitespace
,
382 contentHandler_processingInstruction
,
383 contentHandler_skippedEntity
386 static ISAXContentHandler contentHandler
= { &contentHandlerVtbl
};
388 static HRESULT WINAPI
isaxerrorHandler_QueryInterface(
389 ISAXErrorHandler
* iface
,
395 if(IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_ISAXErrorHandler
))
401 return E_NOINTERFACE
;
407 static ULONG WINAPI
isaxerrorHandler_AddRef(
408 ISAXErrorHandler
* iface
)
413 static ULONG WINAPI
isaxerrorHandler_Release(
414 ISAXErrorHandler
* iface
)
419 static HRESULT WINAPI
isaxerrorHandler_error(
420 ISAXErrorHandler
* iface
,
421 ISAXLocator
*pLocator
,
422 const WCHAR
*pErrorMessage
,
428 static HRESULT WINAPI
isaxerrorHandler_fatalError(
429 ISAXErrorHandler
* iface
,
430 ISAXLocator
*pLocator
,
431 const WCHAR
*pErrorMessage
,
437 static HRESULT WINAPI
isaxerrorHanddler_ignorableWarning(
438 ISAXErrorHandler
* iface
,
439 ISAXLocator
*pLocator
,
440 const WCHAR
*pErrorMessage
,
446 static const ISAXErrorHandlerVtbl errorHandlerVtbl
=
448 isaxerrorHandler_QueryInterface
,
449 isaxerrorHandler_AddRef
,
450 isaxerrorHandler_Release
,
451 isaxerrorHandler_error
,
452 isaxerrorHandler_fatalError
,
453 isaxerrorHanddler_ignorableWarning
456 static ISAXErrorHandler errorHandler
= { &errorHandlerVtbl
};
458 static void test_saxreader(void)
461 ISAXXMLReader
*reader
= NULL
;
463 ISAXContentHandler
*lpContentHandler
;
464 ISAXErrorHandler
*lpErrorHandler
;
466 SAFEARRAYBOUND SADim
[1];
467 char *pSAData
= NULL
;
469 ULARGE_INTEGER liSize
;
473 static const CHAR testXmlA
[] = "test.xml";
474 static const WCHAR testXmlW
[] = {'t','e','s','t','.','x','m','l',0};
475 IXMLDOMDocument
*domDocument
;
479 hr
= CoCreateInstance(&CLSID_SAXXMLReader
, NULL
, CLSCTX_INPROC_SERVER
,
480 &IID_ISAXXMLReader
, (LPVOID
*)&reader
);
484 skip("Failed to create SAXXMLReader instance\n");
488 hr
= ISAXXMLReader_getContentHandler(reader
, NULL
);
489 ok(hr
== E_POINTER
, "Expected E_POINTER, got %08x\n", hr
);
491 hr
= ISAXXMLReader_getErrorHandler(reader
, NULL
);
492 ok(hr
== E_POINTER
, "Expected E_POINTER, got %08x\n", hr
);
494 hr
= ISAXXMLReader_getContentHandler(reader
, &lpContentHandler
);
495 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
496 ok(lpContentHandler
== NULL
, "Expected %p, got %p\n", NULL
, lpContentHandler
);
498 hr
= ISAXXMLReader_getErrorHandler(reader
, &lpErrorHandler
);
499 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
500 ok(lpErrorHandler
== NULL
, "Expected %p, got %p\n", NULL
, lpErrorHandler
);
502 hr
= ISAXXMLReader_putContentHandler(reader
, NULL
);
503 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
505 hr
= ISAXXMLReader_putContentHandler(reader
, &contentHandler
);
506 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
508 hr
= ISAXXMLReader_putErrorHandler(reader
, &errorHandler
);
509 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
511 hr
= ISAXXMLReader_getContentHandler(reader
, &lpContentHandler
);
512 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
513 ok(lpContentHandler
== &contentHandler
, "Expected %p, got %p\n", &contentHandler
, lpContentHandler
);
515 V_VT(&var
) = VT_BSTR
;
516 V_BSTR(&var
) = SysAllocString(szSimpleXML
);
518 expectCall
= contentHandlerTest1
;
519 hr
= ISAXXMLReader_parse(reader
, var
);
520 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
521 test_expect_call(CH_ENDTEST
);
526 SADim
[0].cElements
= sizeof(szTestXML
)-1;
527 pSA
= SafeArrayCreate(VT_UI1
, 1, SADim
);
528 SafeArrayAccessData(pSA
, (void**)&pSAData
);
529 memcpy(pSAData
, szTestXML
, sizeof(szTestXML
)-1);
530 SafeArrayUnaccessData(pSA
);
531 V_VT(&var
) = VT_ARRAY
|VT_UI1
;
534 expectCall
= contentHandlerTest1
;
535 hr
= ISAXXMLReader_parse(reader
, var
);
536 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
537 test_expect_call(CH_ENDTEST
);
539 SafeArrayDestroy(pSA
);
541 CreateStreamOnHGlobal(NULL
, TRUE
, &iStream
);
542 liSize
.QuadPart
= strlen(szTestXML
);
543 IStream_SetSize(iStream
, liSize
);
544 IStream_Write(iStream
, szTestXML
, strlen(szTestXML
), &bytesWritten
);
546 IStream_Seek(iStream
, liPos
, STREAM_SEEK_SET
, NULL
);
547 V_VT(&var
) = VT_UNKNOWN
|VT_DISPATCH
;
548 V_UNKNOWN(&var
) = (IUnknown
*)iStream
;
550 expectCall
= contentHandlerTest1
;
551 hr
= ISAXXMLReader_parse(reader
, var
);
552 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
553 test_expect_call(CH_ENDTEST
);
555 IStream_Release(iStream
);
557 V_VT(&var
) = VT_BSTR
;
558 V_BSTR(&var
) = SysAllocString(szCarriageRetTest
);
560 expectCall
= contentHandlerTest2
;
561 hr
= ISAXXMLReader_parse(reader
, var
);
562 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
563 test_expect_call(CH_ENDTEST
);
567 file
= CreateFileA(testXmlA
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
568 ok(file
!= INVALID_HANDLE_VALUE
, "Could not create file: %u\n", GetLastError());
569 WriteFile(file
, szTestXML
, sizeof(szTestXML
)-1, &bytesWritten
, NULL
);
572 expectCall
= contentHandlerTest1
;
573 hr
= ISAXXMLReader_parseURL(reader
, testXmlW
);
574 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
575 test_expect_call(CH_ENDTEST
);
577 DeleteFileA(testXmlA
);
579 hr
= CoCreateInstance(&CLSID_DOMDocument
, NULL
, CLSCTX_INPROC_SERVER
,
580 &IID_IXMLDOMDocument
, (LPVOID
*)&domDocument
);
583 skip("Failed to create DOMDocument instance\n");
586 bstrData
= SysAllocString(szSimpleXML
);
587 hr
= IXMLDOMDocument_loadXML(domDocument
, bstrData
, &vBool
);
588 V_VT(&var
) = VT_UNKNOWN
;
589 V_UNKNOWN(&var
) = (IUnknown
*)domDocument
;
591 expectCall
= contentHandlerTest2
;
592 hr
= ISAXXMLReader_parse(reader
, var
);
593 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
594 test_expect_call(CH_ENDTEST
);
595 IXMLDOMDocument_Release(domDocument
);
597 ISAXXMLReader_Release(reader
);
598 SysFreeString(bstrData
);
601 START_TEST(saxreader
)
605 hr
= CoInitialize(NULL
);
606 ok(hr
== S_OK
, "failed to init com\n");