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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
29 #include "wine/test.h"
31 static const WCHAR szEmpty[] = { 0 };
32 static const WCHAR szIncomplete[] = {
33 '<','?','x','m','l',' ',
34 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
36 static const WCHAR szComplete1[] = {
37 '<','?','x','m','l',' ',
38 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
39 '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
41 static const WCHAR szComplete2[] = {
42 '<','?','x','m','l',' ',
43 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
44 '<','o','>','<','/','o','>','\n',0
46 static const WCHAR szComplete3[] = {
47 '<','?','x','m','l',' ',
48 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
49 '<','a','>','<','/','a','>','\n',0
51 static const WCHAR szComplete4[] = {
52 '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
53 '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>','\n',
54 '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ','s','z','=','\'','1','2','3','4','\'','>',
55 'f','n','1','.','t','x','t','\n',
56 '<','/','b','s','>','\n',
57 '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ','v','r','=','\'','1','.','2','.','3','\'',' ',
58 'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>','\n',
59 'f','n','2','.','t','x','t','\n',
60 '<','/','p','r','>','\n',
61 '<','e','m','p','t','y','>','<','/','e','m','p','t','y','>','\n',
62 '<','/','l','c','>','\n',0
64 static const WCHAR szComplete5[] = {
65 '<','S',':','s','e','a','r','c','h',' ','x','m','l','n','s',':','D','=','"','D','A','V',':','"',' ',
66 'x','m','l','n','s',':','C','=','"','u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','o','f','f','i','c','e',':','c','l','i','p','g','a','l','l','e','r','y','"',
67 ' ','x','m','l','n','s',':','S','=','"','u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','o','f','f','i','c','e',':','c','l','i','p','g','a','l','l','e','r','y',':','s','e','a','r','c','h','"','>',
68 '<','S',':','s','c','o','p','e','>',
69 '<','S',':','d','e','e','p','>','/','<','/','S',':','d','e','e','p','>',
70 '<','/','S',':','s','c','o','p','e','>',
71 '<','S',':','c','o','n','t','e','n','t','f','r','e','e','t','e','x','t','>',
72 '<','C',':','t','e','x','t','o','r','p','r','o','p','e','r','t','y','/','>',
73 'c','o','m','p','u','t','e','r',
74 '<','/','S',':','c','o','n','t','e','n','t','f','r','e','e','t','e','x','t','>',
75 '<','/','S',':','s','e','a','r','c','h','>',0
78 static const WCHAR szNonExistentFile[] = {
79 'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
81 static const WCHAR szDocument[] = {
82 '#', 'd', 'o', 'c', 'u', 'm', 'e', 'n', 't', 0
85 static const WCHAR szOpen[] = { 'o','p','e','n',0 };
86 static const WCHAR szdl[] = { 'd','l',0 };
87 static const WCHAR szvr[] = { 'v','r',0 };
88 static const WCHAR szlc[] = { 'l','c',0 };
89 static const WCHAR szbs[] = { 'b','s',0 };
90 static const WCHAR szstr1[] = { 's','t','r','1',0 };
91 static const WCHAR szstr2[] = { 's','t','r','2',0 };
92 static const WCHAR szstar[] = { '*',0 };
93 static const WCHAR szfn1_txt[] = {'f','n','1','.','t','x','t',0};
95 void test_domdoc( void )
98 IXMLDOMDocument *doc = NULL;
99 IXMLDOMParseError *error;
100 IXMLDOMElement *element = NULL;
106 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
107 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
111 /* try some stupid things */
112 r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
113 ok( r == S_FALSE, "loadXML failed\n");
116 r = IXMLDOMDocument_loadXML( doc, NULL, &b );
117 ok( r == S_FALSE, "loadXML failed\n");
118 ok( b == VARIANT_FALSE, "failed to load XML string\n");
120 /* try to load a document from a nonexistent file */
122 str = SysAllocString( szNonExistentFile );
124 V_VT(&var) = VT_BSTR;
127 r = IXMLDOMDocument_load( doc, var, &b);
128 ok( r == S_FALSE, "load (from file) failed\n");
129 ok( b == VARIANT_FALSE, "failed to load XML file\n");
130 SysFreeString( str );
132 /* try load an empty document */
134 str = SysAllocString( szEmpty );
135 r = IXMLDOMDocument_loadXML( doc, str, &b );
136 ok( r == S_FALSE, "loadXML failed\n");
137 ok( b == VARIANT_FALSE, "failed to load XML string\n");
138 SysFreeString( str );
140 /* check that there's no document element */
142 r = IXMLDOMDocument_get_documentElement( doc, &element );
143 ok( r == S_FALSE, "should be no document element\n");
146 str = SysAllocString( szIncomplete );
147 r = IXMLDOMDocument_loadXML( doc, str, &b );
148 ok( r == S_FALSE, "loadXML failed\n");
149 ok( b == VARIANT_FALSE, "failed to load XML string\n");
150 SysFreeString( str );
152 /* check that there's no document element */
153 element = (IXMLDOMElement*)1;
154 r = IXMLDOMDocument_get_documentElement( doc, &element );
155 ok( r == S_FALSE, "should be no document element\n");
156 ok( element == NULL, "Element should be NULL\n");
158 /* try to load something valid */
160 str = SysAllocString( szComplete1 );
161 r = IXMLDOMDocument_loadXML( doc, str, &b );
162 ok( r == S_OK, "loadXML failed\n");
163 ok( b == VARIANT_TRUE, "failed to load XML string\n");
164 SysFreeString( str );
166 /* try with a null out pointer - crashes */
169 r = IXMLDOMDocument_get_documentElement( doc, NULL );
170 ok( r == S_OK, "should be no document element\n");
173 /* check if nodename is correct */
174 r = IXMLDOMDocument_get_nodeName( doc, NULL );
175 ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
177 /* content doesn't matter here */
178 str = SysAllocString( szNonExistentFile );
179 r = IXMLDOMDocument_get_nodeName( doc, &str );
180 ok ( r == S_OK, "get_nodeName wrong code\n");
181 ok ( str != NULL, "str is null\n");
182 ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
183 SysFreeString( str );
186 /* check that there's a document element */
188 r = IXMLDOMDocument_get_documentElement( doc, &element );
189 ok( r == S_OK, "should be a document element\n");
194 /* check if the tag is correct */
195 r = IXMLDOMElement_get_tagName( element, &tag );
196 ok( r == S_OK, "couldn't get tag name\n");
197 ok( tag != NULL, "tag was null\n");
198 ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
199 SysFreeString( tag );
201 /* figure out what happens if we try to reload the document */
202 str = SysAllocString( szComplete2 );
203 r = IXMLDOMDocument_loadXML( doc, str, &b );
204 ok( r == S_OK, "loadXML failed\n");
205 ok( b == VARIANT_TRUE, "failed to load XML string\n");
206 SysFreeString( str );
208 /* check if the tag is still correct */
210 r = IXMLDOMElement_get_tagName( element, &tag );
211 ok( r == S_OK, "couldn't get tag name\n");
212 ok( tag != NULL, "tag was null\n");
213 ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
214 SysFreeString( tag );
216 IXMLDOMElement_Release( element );
220 /* as soon as we call loadXML again, the document element will disappear */
222 r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
223 ok( r == S_FALSE, "loadXML failed\n");
224 ok( b == 2, "variant modified\n");
225 r = IXMLDOMDocument_get_documentElement( doc, &element );
226 ok( r == S_FALSE, "should be no document element\n");
228 /* try to load something else simple and valid */
230 str = SysAllocString( szComplete3 );
231 r = IXMLDOMDocument_loadXML( doc, str, &b );
232 ok( r == S_OK, "loadXML failed\n");
233 ok( b == VARIANT_TRUE, "failed to load XML string\n");
234 SysFreeString( str );
236 /* try something a little more complicated */
238 str = SysAllocString( szComplete4 );
239 r = IXMLDOMDocument_loadXML( doc, str, &b );
240 ok( r == S_OK, "loadXML failed\n");
241 ok( b == VARIANT_TRUE, "failed to load XML string\n");
242 SysFreeString( str );
244 r = IXMLDOMDocument_get_parseError( doc, &error );
245 ok( r == S_OK, "returns %08lx\n", r );
247 r = IXMLDOMParseError_get_errorCode( error, &code );
248 ok( r == S_FALSE, "returns %08lx\n", r );
249 ok( code == 0, "code %ld\n", code );
250 IXMLDOMParseError_Release( error );
252 r = IXMLDOMDocument_Release( doc );
253 ok( r == 0, "document ref count incorrect\n");
257 void test_domnode( void )
260 IXMLDOMDocument *doc = NULL, *owner = NULL;
261 IXMLDOMElement *element = NULL;
262 IXMLDOMNamedNodeMap *map = NULL;
263 IXMLDOMNode *node = NULL, *next = NULL;
264 IXMLDOMNodeList *list = NULL;
265 DOMNodeType type = NODE_INVALID;
271 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
272 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
277 str = SysAllocString( szComplete4 );
278 r = IXMLDOMDocument_loadXML( doc, str, &b );
279 ok( r == S_OK, "loadXML failed\n");
280 ok( b == VARIANT_TRUE, "failed to load XML string\n");
281 SysFreeString( str );
286 r = IXMLDOMNode_hasChildNodes( doc, &b );
287 ok( r == S_OK, "hasChildNoes bad return\n");
288 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
290 r = IXMLDOMDocument_get_documentElement( doc, &element );
291 ok( r == S_OK, "should be a document element\n");
292 ok( element != NULL, "should be an element\n");
295 ok( FALSE, "no document\n");
298 ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
299 r = IXMLDOMNode_get_nodeValue( doc, &var );
300 ok( r == S_FALSE, "nextNode returned wrong code\n");
301 ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
302 ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
307 r = IXMLDOMNode_get_ownerDocument( element, &owner );
309 ok( r == S_OK, "get_ownerDocument return code\n");
311 ok( owner != doc, "get_ownerDocument return\n");
314 r = IXMLDOMNode_get_nodeType( element, &type);
315 ok( r == S_OK, "getNamedItem returned wrong code\n");
316 ok( type == NODE_ELEMENT, "node not an element\n");
319 r = IXMLDOMNode_get_baseName( element, &str );
320 ok( r == S_OK, "get_baseName returned wrong code\n");
321 ok( lstrcmpW(str,szlc) == 0, "basename was wrong\n");
323 /* check if nodename is correct */
324 r = IXMLDOMElement_get_nodeName( element, NULL );
325 ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
327 /* content doesn't matter here */
328 str = SysAllocString( szNonExistentFile );
329 r = IXMLDOMElement_get_nodeName( element, &str );
330 ok ( r == S_OK, "get_nodeName wrong code\n");
331 ok ( str != NULL, "str is null\n");
332 ok( !lstrcmpW( str, szlc ), "incorrect nodeName\n");
333 SysFreeString( str );
335 str = SysAllocString( szNonExistentFile );
338 r = IXMLDOMElement_getAttribute( element, str, &var );
339 ok( r == E_FAIL, "getAttribute ret %08lx\n", r );
340 ok( V_VT(&var) == VT_EMPTY, "vt = %x\n", V_VT(&var));
342 SysFreeString( str );
344 str = SysAllocString( szdl );
347 r = IXMLDOMElement_getAttribute( element, str, &var );
348 ok( r == S_OK, "getAttribute ret %08lx\n", r );
349 ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
350 ok( !lstrcmpW(V_BSTR(&var), szstr1), "wrong attr value\n");
351 VariantClear( &var );
352 SysFreeString( str );
354 r = IXMLDOMElement_get_attributes( element, &map );
355 ok( r == S_OK, "get_attributes returned wrong code\n");
356 ok( map != NULL, "should be attributes\n");
359 r = IXMLDOMNode_hasChildNodes( element, &b );
360 ok( r == S_OK, "hasChildNoes bad return\n");
361 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
364 ok( FALSE, "no element\n");
368 ISupportErrorInfo *support_error;
369 r = IXMLDOMNamedNodeMap_QueryInterface( map, &IID_ISupportErrorInfo, (LPVOID*)&support_error );
370 ok( r == S_OK, "ret %08lx\n", r );
372 r = ISupportErrorInfo_InterfaceSupportsErrorInfo( support_error, &IID_IXMLDOMNamedNodeMap );
375 ok( r == S_OK, "ret %08lx\n", r );
377 ISupportErrorInfo_Release( support_error );
379 str = SysAllocString( szdl );
380 r = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
381 ok( r == S_OK, "getNamedItem returned wrong code\n");
382 ok( node != NULL, "should be attributes\n");
383 IXMLDOMNode_Release(node);
384 SysFreeString( str );
386 /* test indexed access of attributes */
387 r = IXMLDOMNamedNodeMap_get_length( map, &count );
388 ok ( r == S_OK, "get_length wrong code\n");
389 ok ( count == 1, "get_length != 1\n");
392 r = IXMLDOMNamedNodeMap_get_item( map, -1, &node);
393 ok ( r == S_FALSE, "get_item (-1) wrong code\n");
394 ok ( node == NULL, "there is no node\n");
397 r = IXMLDOMNamedNodeMap_get_item( map, 1, &node);
398 ok ( r == S_FALSE, "get_item (1) wrong code\n");
399 ok ( node == NULL, "there is no attribute\n");
402 r = IXMLDOMNamedNodeMap_get_item( map, 0, &node);
403 ok ( r == S_OK, "get_item (0) wrong code\n");
404 ok ( node != NULL, "should be attribute\n");
406 r = IXMLDOMNode_get_nodeName( node, NULL );
407 ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
409 /* content doesn't matter here */
410 str = SysAllocString( szNonExistentFile );
411 r = IXMLDOMNode_get_nodeName( node, &str );
412 ok ( r == S_OK, "get_nodeName wrong code\n");
413 ok ( str != NULL, "str is null\n");
414 ok( !lstrcmpW( str, szdl ), "incorrect node name\n");
415 SysFreeString( str );
418 ok( FALSE, "no map\n");
423 r = IXMLDOMNode_get_nodeType( node, &type);
424 ok( r == S_OK, "getNamedItem returned wrong code\n");
425 ok( type == NODE_ATTRIBUTE, "node not an attribute\n");
428 r = IXMLDOMNode_get_baseName( node, NULL );
429 ok( r == E_INVALIDARG, "get_baseName returned wrong code\n");
432 r = IXMLDOMNode_get_baseName( node, &str );
433 ok( r == S_OK, "get_baseName returned wrong code\n");
434 ok( lstrcmpW(str,szdl) == 0, "basename was wrong\n");
436 r = IXMLDOMNode_get_nodeValue( node, &var );
437 ok( r == S_OK, "returns %08lx\n", r );
438 ok( V_VT(&var) == VT_BSTR, "vt %x\n", V_VT(&var));
439 ok( !lstrcmpW(V_BSTR(&var), szstr1), "nodeValue incorrect\n");
442 r = IXMLDOMNode_get_childNodes( node, NULL );
443 ok( r == E_INVALIDARG, "get_childNodes returned wrong code\n");
445 r = IXMLDOMNode_get_childNodes( node, &list );
446 ok( r == S_OK, "get_childNodes returned wrong code\n");
450 r = IXMLDOMNodeList_nextNode( list, &next );
451 ok( r == S_OK, "nextNode returned wrong code\n");
454 ok( FALSE, "no childlist\n");
459 r = IXMLDOMNode_hasChildNodes( next, &b );
460 ok( r == S_FALSE, "hasChildNoes bad return\n");
461 ok( b == VARIANT_FALSE, "hasChildNoes wrong result\n");
464 r = IXMLDOMNode_get_nodeType( next, &type);
465 ok( r == S_OK, "getNamedItem returned wrong code\n");
466 ok( type == NODE_TEXT, "node not text\n");
469 r = IXMLDOMNode_get_baseName( next, &str );
470 ok( r == S_FALSE, "get_baseName returned wrong code\n");
471 ok( str == NULL, "basename was wrong\n");
474 ok( FALSE, "no next\n");
477 IXMLDOMNode_Release( next );
480 IXMLDOMNodeList_Release( list );
483 IXMLDOMNode_Release( node );
486 ok( FALSE, "no node\n");
490 IXMLDOMNamedNodeMap_Release( map );
492 /* now traverse the tree from the root node */
495 r = IXMLDOMNode_get_childNodes( element, &list );
496 ok( r == S_OK, "get_childNodes returned wrong code\n");
499 ok( FALSE, "no element\n");
501 r = IXMLDOMNode_selectSingleNode( element, (BSTR)szdl, &node );
502 ok( r == S_FALSE, "ret %08lx\n", r );
503 r = IXMLDOMNode_selectSingleNode( element, (BSTR)szbs, &node );
504 ok( r == S_OK, "ret %08lx\n", r );
505 r = IXMLDOMNode_Release( node );
506 ok( r == 0, "ret %08lx\n", r );
510 r = IXMLDOMNodeList_get_length( list, &count );
511 ok( r == S_OK, "get_length returns %08lx\n", r );
512 ok( count == 3, "get_length got %ld\n", count );
514 r = IXMLDOMNodeList_nextNode( list, &node );
515 ok( r == S_OK, "nextNode returned wrong code\n");
518 ok( FALSE, "no list\n");
523 r = IXMLDOMNode_get_nodeType( node, &type);
524 ok( r == S_OK, "getNamedItem returned wrong code\n");
525 ok( type == NODE_ELEMENT, "node not text\n");
528 ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
529 r = IXMLDOMNode_get_nodeValue( node, &var );
530 ok( r == S_FALSE, "nextNode returned wrong code\n");
531 ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
532 ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
534 r = IXMLDOMNode_hasChildNodes( node, NULL );
535 ok( r == E_INVALIDARG, "hasChildNoes bad return\n");
538 r = IXMLDOMNode_hasChildNodes( node, &b );
539 ok( r == S_OK, "hasChildNoes bad return\n");
540 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
543 r = IXMLDOMNode_get_baseName( node, &str );
544 ok( r == S_OK, "get_baseName returned wrong code\n");
545 ok( lstrcmpW(str,szbs) == 0, "basename was wrong\n");
548 ok( FALSE, "no node\n");
551 IXMLDOMNode_Release( node );
553 IXMLDOMNodeList_Release( list );
555 IXMLDOMElement_Release( element );
558 str = SysAllocString( szComplete5 );
559 r = IXMLDOMDocument_loadXML( doc, str, &b );
560 ok( r == S_OK, "loadXML failed\n");
561 ok( b == VARIANT_TRUE, "failed to load XML string\n");
562 SysFreeString( str );
565 r = IXMLDOMNode_hasChildNodes( doc, &b );
566 ok( r == S_OK, "hasChildNoes bad return\n");
567 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
569 r = IXMLDOMDocument_get_documentElement( doc, &element );
570 ok( r == S_OK, "should be a document element\n");
571 ok( element != NULL, "should be an element\n");
575 static const WCHAR szSSearch[] = {'S',':','s','e','a','r','c','h',0};
578 /* check if the tag is correct */
579 r = IXMLDOMElement_get_tagName( element, &tag );
580 ok( r == S_OK, "couldn't get tag name\n");
581 ok( tag != NULL, "tag was null\n");
582 ok( !lstrcmpW( tag, szSSearch ), "incorrect tag name\n");
583 SysFreeString( tag );
587 IXMLDOMElement_Release( element );
589 IXMLDOMDocument_Release( doc );
592 static void test_refs(void)
597 IXMLDOMDocument *doc = NULL;
598 IXMLDOMElement *element = NULL;
599 IXMLDOMNode *node = NULL, *node2;
600 IXMLDOMNodeList *node_list = NULL;
602 IUnknown *unk, *unk2;
604 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
605 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
608 ref = IXMLDOMDocument_Release(doc);
609 ok( ref == 0, "ref %ld\n", ref);
611 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
612 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
616 str = SysAllocString( szComplete4 );
617 r = IXMLDOMDocument_loadXML( doc, str, &b );
618 ok( r == S_OK, "loadXML failed\n");
619 ok( b == VARIANT_TRUE, "failed to load XML string\n");
620 SysFreeString( str );
622 ref = IXMLDOMDocument_AddRef( doc );
623 ok( ref == 2, "ref %ld\n", ref );
624 ref = IXMLDOMDocument_AddRef( doc );
625 ok( ref == 3, "ref %ld\n", ref );
626 IXMLDOMDocument_Release( doc );
627 IXMLDOMDocument_Release( doc );
629 r = IXMLDOMDocument_get_documentElement( doc, &element );
630 ok( r == S_OK, "should be a document element\n");
631 ok( element != NULL, "should be an element\n");
633 ref = IXMLDOMDocument_AddRef( doc );
634 ok( ref == 2, "ref %ld\n", ref );
635 IXMLDOMDocument_Release( doc );
637 r = IXMLDOMElement_get_childNodes( element, &node_list );
638 ok( r == S_OK, "rets %08lx\n", r);
639 ref = IXMLDOMNodeList_AddRef( node_list );
640 ok( ref == 2, "ref %ld\n", ref );
641 IXMLDOMNodeList_Release( node_list );
643 IXMLDOMNodeList_get_item( node_list, 0, &node );
644 ok( r == S_OK, "rets %08lx\n", r);
646 IXMLDOMNodeList_get_item( node_list, 0, &node2 );
647 ok( r == S_OK, "rets %08lx\n", r);
649 ref = IXMLDOMNode_AddRef( node );
650 ok( ref == 2, "ref %ld\n", ref );
651 IXMLDOMNode_Release( node );
653 ref = IXMLDOMNode_Release( node );
654 ok( ref == 0, "ref %ld\n", ref );
655 ref = IXMLDOMNode_Release( node2 );
656 ok( ref == 0, "ref %ld\n", ref );
658 ref = IXMLDOMNodeList_Release( node_list );
659 ok( ref == 0, "ref %ld\n", ref );
661 ok( node != node2, "node %p node2 %p\n", node, node2 );
663 ref = IXMLDOMDocument_Release( doc );
664 ok( ref == 0, "ref %ld\n", ref );
666 ref = IXMLDOMElement_AddRef( element );
668 ok( ref == 3, "ref %ld\n", ref );
670 IXMLDOMElement_Release( element );
672 /* IUnknown must be unique however we obtain it */
673 r = IXMLDOMElement_QueryInterface( element, &IID_IUnknown, (LPVOID*)&unk );
674 ok( r == S_OK, "rets %08lx\n", r );
675 r = IXMLDOMElement_QueryInterface( element, &IID_IXMLDOMNode, (LPVOID*)&node );
676 ok( r == S_OK, "rets %08lx\n", r );
677 r = IXMLDOMNode_QueryInterface( node, &IID_IUnknown, (LPVOID*)&unk2 );
678 ok( r == S_OK, "rets %08lx\n", r );
679 ok( unk == unk2, "unk %p unk2 %p\n", unk, unk2 );
681 IUnknown_Release( unk2 );
682 IUnknown_Release( unk );
683 IXMLDOMNode_Release( node );
685 IXMLDOMElement_Release( element );
689 static void test_create(void)
694 IXMLDOMDocument *doc;
695 IXMLDOMElement *element;
696 IXMLDOMNode *root, *node, *child;
697 IXMLDOMNamedNodeMap *attr_map;
701 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
702 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
707 V_I4(&var) = NODE_ELEMENT;
708 str = SysAllocString( szlc );
709 r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
710 ok( r == S_OK, "returns %08lx\n", r );
711 r = IXMLDOMDocument_appendChild( doc, node, &root );
712 ok( r == S_OK, "returns %08lx\n", r );
713 ok( node == root, "%p %p\n", node, root );
715 ref = IXMLDOMNode_AddRef( node );
716 ok(ref == 3, "ref %ld\n", ref);
717 IXMLDOMNode_Release( node );
719 ref = IXMLDOMNode_Release( node );
720 ok(ref == 1, "ref %ld\n", ref);
721 SysFreeString( str );
724 V_I4(&var) = NODE_ELEMENT;
725 str = SysAllocString( szbs );
726 r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
727 ok( r == S_OK, "returns %08lx\n", r );
729 ref = IXMLDOMNode_AddRef( node );
730 ok(ref == 2, "ref = %ld\n", ref);
731 IXMLDOMNode_Release( node );
733 r = IXMLDOMNode_QueryInterface( node, &IID_IUnknown, (LPVOID*)&unk );
734 ok( r == S_OK, "returns %08lx\n", r );
736 ref = IXMLDOMNode_AddRef( unk );
737 ok(ref == 3, "ref = %ld\n", ref);
738 IXMLDOMNode_Release( unk );
740 V_VT(&var) = VT_EMPTY;
741 r = IXMLDOMNode_insertBefore( root, (IXMLDOMNode*)unk, var, &child );
742 ok( r == S_OK, "returns %08lx\n", r );
743 ok( unk == (IUnknown*)child, "%p %p\n", unk, child );
744 IXMLDOMNode_Release( child );
745 IUnknown_Release( unk );
748 V_VT(&var) = VT_NULL;
749 V_DISPATCH(&var) = (IDispatch*)node;
750 r = IXMLDOMNode_insertBefore( root, node, var, &child );
751 ok( r == S_OK, "returns %08lx\n", r );
752 ok( node == child, "%p %p\n", node, child );
753 IXMLDOMNode_Release( child );
754 IXMLDOMNode_Release( node );
757 r = IXMLDOMNode_QueryInterface( root, &IID_IXMLDOMElement, (LPVOID*)&element );
758 ok( r == S_OK, "returns %08lx\n", r );
760 r = IXMLDOMElement_get_attributes( element, &attr_map );
761 ok( r == S_OK, "returns %08lx\n", r );
762 r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
763 ok( r == S_OK, "returns %08lx\n", r );
764 ok( num == 0, "num %ld\n", num );
765 IXMLDOMNamedNodeMap_Release( attr_map );
767 V_VT(&var) = VT_BSTR;
768 V_BSTR(&var) = SysAllocString( szstr1 );
769 name = SysAllocString( szdl );
770 r = IXMLDOMElement_setAttribute( element, name, var );
771 ok( r == S_OK, "returns %08lx\n", r );
772 r = IXMLDOMElement_get_attributes( element, &attr_map );
773 ok( r == S_OK, "returns %08lx\n", r );
774 r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
775 ok( r == S_OK, "returns %08lx\n", r );
776 ok( num == 1, "num %ld\n", num );
777 IXMLDOMNamedNodeMap_Release( attr_map );
780 V_VT(&var) = VT_BSTR;
781 V_BSTR(&var) = SysAllocString( szstr2 );
782 r = IXMLDOMElement_setAttribute( element, name, var );
783 ok( r == S_OK, "returns %08lx\n", r );
784 r = IXMLDOMElement_get_attributes( element, &attr_map );
785 ok( r == S_OK, "returns %08lx\n", r );
786 r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
787 ok( r == S_OK, "returns %08lx\n", r );
788 ok( num == 1, "num %ld\n", num );
789 IXMLDOMNamedNodeMap_Release( attr_map );
791 r = IXMLDOMElement_getAttribute( element, name, &var );
792 ok( r == S_OK, "returns %08lx\n", r );
793 ok( !lstrcmpW(V_BSTR(&var), szstr2), "wrong attr value\n");
797 V_VT(&var) = VT_BSTR;
798 V_BSTR(&var) = SysAllocString( szstr1 );
799 name = SysAllocString( szlc );
800 r = IXMLDOMElement_setAttribute( element, name, var );
801 ok( r == S_OK, "returns %08lx\n", r );
802 r = IXMLDOMElement_get_attributes( element, &attr_map );
803 ok( r == S_OK, "returns %08lx\n", r );
804 r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
805 ok( r == S_OK, "returns %08lx\n", r );
806 ok( num == 2, "num %ld\n", num );
807 IXMLDOMNamedNodeMap_Release( attr_map );
813 name = SysAllocString( szbs );
814 r = IXMLDOMElement_setAttribute( element, name, var );
815 ok( r == S_OK, "returns %08lx\n", r );
817 r = IXMLDOMElement_getAttribute( element, name, &var );
818 ok( r == S_OK, "returns %08lx\n", r );
819 ok( V_VT(&var) == VT_BSTR, "variant type %x\n", V_VT(&var));
823 IXMLDOMElement_Release( element );
824 IXMLDOMNode_Release( root );
825 IXMLDOMDocument_Release( doc );
828 static void test_getElementsByTagName(void)
833 IXMLDOMDocument *doc;
834 IXMLDOMNodeList *node_list;
837 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
838 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
842 str = SysAllocString( szComplete4 );
843 r = IXMLDOMDocument_loadXML( doc, str, &b );
844 ok( r == S_OK, "loadXML failed\n");
845 ok( b == VARIANT_TRUE, "failed to load XML string\n");
846 SysFreeString( str );
848 str = SysAllocString( szstar );
849 r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
850 ok( r == S_OK, "ret %08lx\n", r );
851 r = IXMLDOMNodeList_get_length( node_list, &len );
852 ok( r == S_OK, "ret %08lx\n", r );
853 ok( len == 4, "len %ld\n", len );
854 IXMLDOMNodeList_Release( node_list );
855 SysFreeString( str );
857 str = SysAllocString( szbs );
858 r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
859 ok( r == S_OK, "ret %08lx\n", r );
860 r = IXMLDOMNodeList_get_length( node_list, &len );
861 ok( r == S_OK, "ret %08lx\n", r );
862 ok( len == 1, "len %ld\n", len );
863 IXMLDOMNodeList_Release( node_list );
864 SysFreeString( str );
866 str = SysAllocString( szdl );
867 r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
868 ok( r == S_OK, "ret %08lx\n", r );
869 r = IXMLDOMNodeList_get_length( node_list, &len );
870 ok( r == S_OK, "ret %08lx\n", r );
871 ok( len == 0, "len %ld\n", len );
872 IXMLDOMNodeList_Release( node_list );
873 SysFreeString( str );
875 str = SysAllocString( szstr1 );
876 r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
877 ok( r == S_OK, "ret %08lx\n", r );
878 r = IXMLDOMNodeList_get_length( node_list, &len );
879 ok( r == S_OK, "ret %08lx\n", r );
880 ok( len == 0, "len %ld\n", len );
881 IXMLDOMNodeList_Release( node_list );
882 SysFreeString( str );
884 IXMLDOMDocument_Release( doc );
887 static void test_get_text(void)
892 IXMLDOMDocument *doc;
893 IXMLDOMNode *node, *node2, *node3;
894 IXMLDOMNodeList *node_list;
895 IXMLDOMNamedNodeMap *node_map;
897 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
898 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
902 str = SysAllocString( szComplete4 );
903 r = IXMLDOMDocument_loadXML( doc, str, &b );
904 ok( r == S_OK, "loadXML failed\n");
905 ok( b == VARIANT_TRUE, "failed to load XML string\n");
906 SysFreeString( str );
908 str = SysAllocString( szbs );
909 r = IXMLDOMDocument_getElementsByTagName( doc, str, &node_list );
910 ok( r == S_OK, "ret %08lx\n", r );
913 r = IXMLDOMNodeList_get_item( node_list, 0, &node );
914 ok( r == S_OK, "ret %08lx\n", r );
915 IXMLDOMNodeList_Release( node_list );
917 r = IXMLDOMNode_get_text( node, &str );
918 ok( r == S_OK, "ret %08lx\n", r );
920 ok( !memcmp(str, szfn1_txt, sizeof(szfn1_txt)), "wrong string\n" );
922 ok( !memcmp(str, szfn1_txt, sizeof(szfn1_txt)-4), "wrong string\n" );
925 r = IXMLDOMNode_get_attributes( node, &node_map );
926 ok( r == S_OK, "ret %08lx\n", r );
928 str = SysAllocString( szvr );
929 r = IXMLDOMNamedNodeMap_getNamedItem( node_map, str, &node2 );
930 ok( r == S_OK, "ret %08lx\n", r );
933 r = IXMLDOMNode_get_text( node2, &str );
934 ok( r == S_OK, "ret %08lx\n", r );
935 ok( !memcmp(str, szstr2, sizeof(szstr2)), "wrong string\n" );
938 r = IXMLDOMNode_get_firstChild( node2, &node3 );
939 ok( r == S_OK, "ret %08lx\n", r );
941 r = IXMLDOMNode_get_text( node3, &str );
942 ok( r == S_OK, "ret %08lx\n", r );
943 ok( !memcmp(str, szstr2, sizeof(szstr2)), "wrong string\n" );
947 IXMLDOMNode_Release( node3 );
948 IXMLDOMNode_Release( node2 );
949 IXMLDOMNamedNodeMap_Release( node_map );
950 IXMLDOMNode_Release( node );
951 IXMLDOMDocument_Release( doc );
954 static void test_get_childNodes(void)
959 IXMLDOMDocument *doc;
960 IXMLDOMElement *element;
961 IXMLDOMNode *node, *node2;
962 IXMLDOMNodeList *node_list, *node_list2;
965 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
966 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
970 str = SysAllocString( szComplete4 );
971 r = IXMLDOMDocument_loadXML( doc, str, &b );
972 ok( r == S_OK, "loadXML failed\n");
973 ok( b == VARIANT_TRUE, "failed to load XML string\n");
974 SysFreeString( str );
976 r = IXMLDOMDocument_get_documentElement( doc, &element );
977 ok( r == S_OK, "ret %08lx\n", r);
979 r = IXMLDOMElement_get_childNodes( element, &node_list );
980 ok( r == S_OK, "ret %08lx\n", r);
982 r = IXMLDOMNodeList_get_length( node_list, &len );
983 ok( r == S_OK, "ret %08lx\n", r);
984 ok( len == 3, "len %ld\n", len);
986 r = IXMLDOMNodeList_get_item( node_list, 2, &node );
987 ok( r == S_OK, "ret %08lx\n", r);
989 r = IXMLDOMNode_get_childNodes( node, &node_list2 );
990 ok( r == S_OK, "ret %08lx\n", r);
992 r = IXMLDOMNodeList_get_length( node_list2, &len );
993 ok( r == S_OK, "ret %08lx\n", r);
994 ok( len == 0, "len %ld\n", len);
996 r = IXMLDOMNodeList_get_item( node_list2, 0, &node2);
997 ok( r == S_FALSE, "ret %08lx\n", r);
999 IXMLDOMNodeList_Release( node_list2 );
1000 IXMLDOMNode_Release( node );
1001 IXMLDOMNodeList_Release( node_list );
1002 IXMLDOMElement_Release( element );
1003 IXMLDOMDocument_Release( doc );
1010 r = CoInitialize( NULL );
1011 ok( r == S_OK, "failed to init com\n");
1017 test_getElementsByTagName();
1019 test_get_childNodes();