4 * Copyright 2005 Mike McCormack for CodeWeavers
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "wine/test.h"
32 static const WCHAR szEmpty
[] = { 0 };
33 static const WCHAR szIncomplete
[] = {
34 '<','?','x','m','l',' ',
35 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
37 static const WCHAR szComplete1
[] = {
38 '<','?','x','m','l',' ',
39 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
40 '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
42 static const WCHAR szComplete2
[] = {
43 '<','?','x','m','l',' ',
44 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
45 '<','o','>','<','/','o','>','\n',0
47 static const WCHAR szComplete3
[] = {
48 '<','?','x','m','l',' ',
49 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
50 '<','a','>','<','/','a','>','\n',0
52 static const WCHAR szComplete4
[] = {
53 '<','?','x','m','l',' ',
54 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>',
55 '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>',
56 '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ',
57 's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>',
58 '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ',
59 'v','r','=','\'','1','.','2','.','3','\'',' ',
60 'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>',
61 'f','n','2','.','t','x','t','<','/','p','r','>',
62 '<','/','l','c','>','\n',0
64 static const WCHAR szNonExistentFile
[] = {
65 'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
67 static const WCHAR szDocument
[] = {
68 '#', 'd', 'o', 'c', 'u', 'm', 'e', 'n', 't', 0
71 static const WCHAR szOpen
[] = { 'o','p','e','n',0 };
72 static const WCHAR szdl
[] = { 'd','l',0 };
73 static const WCHAR szlc
[] = { 'l','c',0 };
74 static const WCHAR szbs
[] = { 'b','s',0 };
76 const GUID CLSID_DOMDocument
=
77 { 0x2933BF90, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
78 const GUID IID_IXMLDOMDocument
=
79 { 0x2933BF81, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
81 void test_domdoc( void )
84 IXMLDOMDocument
*doc
= NULL
;
85 IXMLDOMElement
*element
= NULL
;
90 r
= CoCreateInstance( &CLSID_DOMDocument
, NULL
,
91 CLSCTX_INPROC_SERVER
, &IID_IXMLDOMDocument
, (LPVOID
*)&doc
);
95 /* try some stupid things */
96 r
= IXMLDOMDocument_loadXML( doc
, NULL
, NULL
);
97 ok( r
== S_FALSE
, "loadXML failed\n");
100 r
= IXMLDOMDocument_loadXML( doc
, NULL
, &b
);
101 ok( r
== S_FALSE
, "loadXML failed\n");
102 ok( b
== VARIANT_FALSE
, "failed to load XML string\n");
104 /* try to load an document from an non-existent file */
106 str
= SysAllocString( szNonExistentFile
);
108 V_VT(&var
) = VT_BSTR
;
111 r
= IXMLDOMDocument_load( doc
, var
, &b
);
112 ok( r
== S_FALSE
, "load (from file) failed\n");
113 ok( b
== VARIANT_FALSE
, "failed to load XML file\n");
114 SysFreeString( str
);
116 /* try load an empty document */
118 str
= SysAllocString( szEmpty
);
119 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
120 ok( r
== S_FALSE
, "loadXML failed\n");
121 ok( b
== VARIANT_FALSE
, "failed to load XML string\n");
122 SysFreeString( str
);
124 /* check that there's no document element */
126 r
= IXMLDOMDocument_get_documentElement( doc
, &element
);
127 ok( r
== S_FALSE
, "should be no document element\n");
130 str
= SysAllocString( szIncomplete
);
131 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
132 ok( r
== S_FALSE
, "loadXML failed\n");
133 ok( b
== VARIANT_FALSE
, "failed to load XML string\n");
134 SysFreeString( str
);
136 /* check that there's no document element */
137 element
= (IXMLDOMElement
*)1;
138 r
= IXMLDOMDocument_get_documentElement( doc
, &element
);
139 ok( r
== S_FALSE
, "should be no document element\n");
140 ok( element
== NULL
, "Element should be NULL\n");
142 /* try to load something valid */
144 str
= SysAllocString( szComplete1
);
145 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
146 ok( r
== S_OK
, "loadXML failed\n");
147 ok( b
== VARIANT_TRUE
, "failed to load XML string\n");
148 SysFreeString( str
);
150 /* try with a null out pointer - crashes */
153 r
= IXMLDOMDocument_get_documentElement( doc
, NULL
);
154 ok( r
== S_OK
, "should be no document element\n");
157 /* check if nodename is correct */
158 r
= IXMLDOMDocument_get_nodeName( doc
, NULL
);
159 ok ( r
== E_INVALIDARG
, "get_nodeName (NULL) wrong code");
161 /* content doesn't matter here */
162 str
= SysAllocString( szNonExistentFile
);
163 r
= IXMLDOMDocument_get_nodeName( doc
, &str
);
164 ok ( r
== S_OK
, "get_nodeName wrong code\n");
165 ok ( str
!= NULL
, "str is null\n");
166 ok( !lstrcmpW( str
, szDocument
), "incorrect nodeName\n");
167 SysFreeString( str
);
170 /* check that there's no document element */
172 r
= IXMLDOMDocument_get_documentElement( doc
, &element
);
173 ok( r
== S_OK
, "should be a document element\n");
178 /* check if the tag is correct */
179 r
= IXMLDOMElement_get_tagName( element
, &tag
);
180 ok( r
== S_OK
, "couldn't get tag name\n");
181 ok( tag
!= NULL
, "tag was null\n");
182 ok( !lstrcmpW( tag
, szOpen
), "incorrect tag name\n");
183 SysFreeString( tag
);
185 /* figure out what happens if we try to reload the document */
186 str
= SysAllocString( szComplete2
);
187 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
188 ok( r
== S_OK
, "loadXML failed\n");
189 ok( b
== VARIANT_TRUE
, "failed to load XML string\n");
190 SysFreeString( str
);
192 /* check if the tag is still correct */
194 r
= IXMLDOMElement_get_tagName( element
, &tag
);
195 ok( r
== S_OK
, "couldn't get tag name\n");
196 ok( tag
!= NULL
, "tag was null\n");
197 ok( !lstrcmpW( tag
, szOpen
), "incorrect tag name\n");
198 SysFreeString( tag
);
200 IXMLDOMElement_Release( element
);
204 /* as soon as we call loadXML again, the document element will disappear */
206 r
= IXMLDOMDocument_loadXML( doc
, NULL
, NULL
);
207 ok( r
== S_FALSE
, "loadXML failed\n");
208 ok( b
== 2, "variant modified\n");
209 r
= IXMLDOMDocument_get_documentElement( doc
, &element
);
210 ok( r
== S_FALSE
, "should be no document element\n");
212 /* try to load something else simple and valid */
214 str
= SysAllocString( szComplete3
);
215 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
216 ok( r
== S_OK
, "loadXML failed\n");
217 ok( b
== VARIANT_TRUE
, "failed to load XML string\n");
218 SysFreeString( str
);
220 /* try something a little more complicated */
222 str
= SysAllocString( szComplete4
);
223 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
224 ok( r
== S_OK
, "loadXML failed\n");
225 ok( b
== VARIANT_TRUE
, "failed to load XML string\n");
226 SysFreeString( str
);
228 r
= IXMLDocument_Release( doc
);
229 ok( r
== 0, "document ref count incorrect\n");
233 void test_domnode( void )
236 IXMLDOMDocument
*doc
= NULL
, *owner
= NULL
;
237 IXMLDOMElement
*element
= NULL
;
238 IXMLDOMNamedNodeMap
*map
= NULL
;
239 IXMLDOMNode
*node
= NULL
, *next
= NULL
;
240 IXMLDOMNodeList
*list
= NULL
;
241 DOMNodeType type
= NODE_INVALID
;
246 r
= CoCreateInstance( &CLSID_DOMDocument
, NULL
,
247 CLSCTX_INPROC_SERVER
, &IID_IXMLDOMDocument
, (LPVOID
*)&doc
);
252 str
= SysAllocString( szComplete4
);
253 r
= IXMLDOMDocument_loadXML( doc
, str
, &b
);
254 ok( r
== S_OK
, "loadXML failed\n");
255 ok( b
== VARIANT_TRUE
, "failed to load XML string\n");
256 SysFreeString( str
);
261 r
= IXMLDOMNode_hasChildNodes( doc
, &b
);
262 ok( r
== S_OK
, "hasChildNoes bad return\n");
263 ok( b
== VARIANT_TRUE
, "hasChildNoes wrong result\n");
265 r
= IXMLDOMDocument_get_documentElement( doc
, &element
);
266 ok( r
== S_OK
, "should be a document element\n");
267 ok( element
!= NULL
, "should be an element\n");
270 ok( FALSE
, "no document\n");
273 ok( V_VT(&var
) == VT_EMPTY
, "variant init failed\n");
274 r
= IXMLDOMNode_get_nodeValue( doc
, &var
);
275 ok( r
== S_FALSE
, "nextNode returned wrong code\n");
276 ok( V_VT(&var
) == VT_NULL
, "variant wasn't empty\n");
277 ok( V_BSTR(&var
) == NULL
, "variant value wasn't null\n");
282 r
= IXMLDOMNode_get_ownerDocument( element
, &owner
);
284 ok( r
== S_OK
, "get_ownerDocument return code\n");
286 ok( owner
!= doc
, "get_ownerDocument return\n");
289 r
= IXMLDOMNode_get_nodeType( element
, &type
);
290 ok( r
== S_OK
, "getNamedItem returned wrong code\n");
291 ok( type
== NODE_ELEMENT
, "node not an element\n");
294 r
= IXMLDOMNode_get_baseName( element
, &str
);
295 ok( r
== S_OK
, "get_baseName returned wrong code\n");
296 ok( lstrcmpW(str
,szlc
) == 0, "basename was wrong\n");
298 /* check if nodename is correct */
299 r
= IXMLDOMElement_get_nodeName( element
, NULL
);
300 ok ( r
== E_INVALIDARG
, "get_nodeName (NULL) wrong code");
302 /* content doesn't matter here */
303 str
= SysAllocString( szNonExistentFile
);
304 r
= IXMLDOMElement_get_nodeName( element
, &str
);
305 ok ( r
== S_OK
, "get_nodeName wrong code\n");
306 ok ( str
!= NULL
, "str is null\n");
307 ok( !lstrcmpW( str
, szlc
), "incorrect nodeName\n");
308 SysFreeString( str
);
310 r
= IXMLDOMElement_get_attributes( element
, &map
);
311 ok( r
== S_OK
, "get_attributes returned wrong code\n");
312 ok( map
!= NULL
, "should be attributes\n");
315 r
= IXMLDOMNode_hasChildNodes( element
, &b
);
316 ok( r
== S_OK
, "hasChildNoes bad return\n");
317 ok( b
== VARIANT_TRUE
, "hasChildNoes wrong result\n");
320 ok( FALSE
, "no element\n");
324 str
= SysAllocString( szdl
);
325 r
= IXMLDOMNamedNodeMap_getNamedItem( map
, str
, &node
);
326 ok( r
== S_OK
, "getNamedItem returned wrong code\n");
327 ok( node
!= NULL
, "should be attributes\n");
330 ok( FALSE
, "no map\n");
335 r
= IXMLDOMNode_get_nodeType( node
, &type
);
336 ok( r
== S_OK
, "getNamedItem returned wrong code\n");
337 ok( type
== NODE_ATTRIBUTE
, "node not an attribute\n");
340 r
= IXMLDOMNode_get_baseName( node
, NULL
);
341 ok( r
== E_INVALIDARG
, "get_baseName returned wrong code\n");
344 r
= IXMLDOMNode_get_baseName( node
, &str
);
345 ok( r
== S_OK
, "get_baseName returned wrong code\n");
346 ok( lstrcmpW(str
,szdl
) == 0, "basename was wrong\n");
348 r
= IXMLDOMNode_get_childNodes( node
, NULL
);
349 ok( r
== E_INVALIDARG
, "get_childNodes returned wrong code\n");
351 r
= IXMLDOMNode_get_childNodes( node
, &list
);
352 ok( r
== S_OK
, "get_childNodes returned wrong code\n");
356 r
= IXMLDOMNodeList_nextNode( list
, &next
);
357 ok( r
== S_OK
, "nextNode returned wrong code\n");
360 ok( FALSE
, "no childlist\n");
365 r
= IXMLDOMNode_hasChildNodes( next
, &b
);
366 ok( r
== S_FALSE
, "hasChildNoes bad return\n");
367 ok( b
== VARIANT_FALSE
, "hasChildNoes wrong result\n");
370 r
= IXMLDOMNode_get_nodeType( next
, &type
);
371 ok( r
== S_OK
, "getNamedItem returned wrong code\n");
372 ok( type
== NODE_TEXT
, "node not text\n");
375 r
= IXMLDOMNode_get_baseName( next
, &str
);
376 ok( r
== S_FALSE
, "get_baseName returned wrong code\n");
377 ok( str
== NULL
, "basename was wrong\n");
380 ok( FALSE
, "no next\n");
383 IXMLDOMNode_Release( next
);
386 IXMLDOMNodeList_Release( list
);
389 IXMLDOMNode_Release( node
);
392 ok( FALSE
, "no node\n");
396 IXMLDOMNamedNodeMap_Release( map
);
398 /* now traverse the tree from the root node */
401 r
= IXMLDOMNode_get_childNodes( element
, &list
);
402 ok( r
== S_OK
, "get_childNodes returned wrong code\n");
405 ok( FALSE
, "no element\n");
409 r
= IXMLDOMNodeList_nextNode( list
, &node
);
410 ok( r
== S_OK
, "nextNode returned wrong code\n");
413 ok( FALSE
, "no list\n");
418 r
= IXMLDOMNode_get_nodeType( node
, &type
);
419 ok( r
== S_OK
, "getNamedItem returned wrong code\n");
420 ok( type
== NODE_ELEMENT
, "node not text\n");
423 ok( V_VT(&var
) == VT_EMPTY
, "variant init failed\n");
424 r
= IXMLDOMNode_get_nodeValue( node
, &var
);
425 ok( r
== S_FALSE
, "nextNode returned wrong code\n");
426 ok( V_VT(&var
) == VT_NULL
, "variant wasn't empty\n");
427 ok( V_BSTR(&var
) == NULL
, "variant value wasn't null\n");
429 r
= IXMLDOMNode_hasChildNodes( node
, NULL
);
430 ok( r
== E_INVALIDARG
, "hasChildNoes bad return\n");
433 r
= IXMLDOMNode_hasChildNodes( node
, &b
);
434 ok( r
== S_OK
, "hasChildNoes bad return\n");
435 ok( b
== VARIANT_TRUE
, "hasChildNoes wrong result\n");
438 r
= IXMLDOMNode_get_baseName( node
, &str
);
439 ok( r
== S_OK
, "get_baseName returned wrong code\n");
440 ok( lstrcmpW(str
,szbs
) == 0, "basename was wrong\n");
443 ok( FALSE
, "no node\n");
446 IXMLDOMNode_Release( node
);
448 IXMLDOMNodeList_Release( list
);
450 IXMLDOMElement_Release( element
);
452 IXMLDocument_Release( doc
);
459 r
= CoInitialize( NULL
);
460 ok( r
== S_OK
, "failed to init com\n");