urlmon: Don't create stgmed_obj for binding to object.
[wine] / dlls / msxml3 / tests / domdoc.c
1 /*
2  * XML test
3  *
4  * Copyright 2005 Mike McCormack for CodeWeavers
5  *
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.
10  *
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.
15  *
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
19  */
20
21
22 #define COBJMACROS
23
24 #include "windows.h"
25 #include "ole2.h"
26 #include "xmldom.h"
27 #include "msxml2.h"
28 #include <stdio.h>
29 #include <assert.h>
30
31 #include "wine/test.h"
32
33 const CLSID CLSID_DOMDocument2 = {0xf6d90f11, 0x9c73, 0x11d3, {0xb3, 0x2e, 0x00, 0xc0, 0x4f, 0x99, 0x0b, 0xb4}};
34 const IID IID_IXMLDOMDocument2 = {0x2933bf95, 0x7b36, 0x11d2, {0xb2, 0x0e, 0x00, 0xc0, 0x4f, 0x98, 0x3e, 0x60}};
35
36 static const WCHAR szEmpty[] = { 0 };
37 static const WCHAR szIncomplete[] = {
38     '<','?','x','m','l',' ',
39     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
40 };
41 static const WCHAR szComplete1[] = {
42     '<','?','x','m','l',' ',
43     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
44     '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
45 };
46 static const WCHAR szComplete2[] = {
47     '<','?','x','m','l',' ',
48     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
49     '<','o','>','<','/','o','>','\n',0
50 };
51 static const WCHAR szComplete3[] = {
52     '<','?','x','m','l',' ',
53     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
54     '<','a','>','<','/','a','>','\n',0
55 };
56 static const WCHAR szComplete4[] = {
57     '<','?','x','m','l',' ','v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
58     '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>','\n',
59         '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ','s','z','=','\'','1','2','3','4','\'','>',
60             'f','n','1','.','t','x','t','\n',
61         '<','/','b','s','>','\n',
62         '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ','v','r','=','\'','1','.','2','.','3','\'',' ',
63                     'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>','\n',
64             'f','n','2','.','t','x','t','\n',
65         '<','/','p','r','>','\n',
66         '<','e','m','p','t','y','>','<','/','e','m','p','t','y','>','\n',
67         '<','f','o','>','\n',
68             '<','b','a','>','\n',
69                 'f','1','\n',
70             '<','/','b','a','>','\n',
71         '<','/','f','o','>','\n',
72     '<','/','l','c','>','\n',0
73 };
74 static const WCHAR szComplete5[] = {
75     '<','S',':','s','e','a','r','c','h',' ','x','m','l','n','s',':','D','=','"','D','A','V',':','"',' ',
76     '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','"',
77     ' ','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','"','>',
78         '<','S',':','s','c','o','p','e','>',
79             '<','S',':','d','e','e','p','>','/','<','/','S',':','d','e','e','p','>',
80         '<','/','S',':','s','c','o','p','e','>',
81         '<','S',':','c','o','n','t','e','n','t','f','r','e','e','t','e','x','t','>',
82             '<','C',':','t','e','x','t','o','r','p','r','o','p','e','r','t','y','/','>',
83             'c','o','m','p','u','t','e','r',
84         '<','/','S',':','c','o','n','t','e','n','t','f','r','e','e','t','e','x','t','>',
85     '<','/','S',':','s','e','a','r','c','h','>',0
86 };
87
88 static const CHAR szExampleXML[] =
89 "<?xml version='1.0' encoding='utf-8'?>\n"
90 "<root xmlns:foo='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'>\n"
91 "    <elem>\n"
92 "        <a>A1 field</a>\n"
93 "        <b>B1 field</b>\n"
94 "        <c>C1 field</c>\n"
95 "        <description xmlns:foo='http://www.winehq.org' xmlns:bar='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'>\n"
96 "            <html xmlns='http://www.w3.org/1999/xhtml'>\n"
97 "                This is <strong>a</strong> <i>description</i>. <bar:x/>\n"
98 "            </html>\n"
99 "        </description>\n"
100 "    </elem>\n"
101 "\n"
102 "    <elem>\n"
103 "        <a>A2 field</a>\n"
104 "        <b>B2 field</b>\n"
105 "        <c type=\"old\">C2 field</c>\n"
106 "    </elem>\n"
107 "\n"
108 "    <elem xmlns='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'>\n"
109 "        <a>A3 field</a>\n"
110 "        <b>B3 field</b>\n"
111 "        <c>C3 field</c>\n"
112 "    </elem>\n"
113 "\n"
114 "    <elem>\n"
115 "        <a>A4 field</a>\n"
116 "        <b>B4 field</b>\n"
117 "        <foo:c>C4 field</foo:c>\n"
118 "    </elem>\n"
119 "</root>\n";
120
121 static const WCHAR szNonExistentFile[] = {
122     'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0
123 };
124 static const WCHAR szDocument[] = {
125     '#', 'd', 'o', 'c', 'u', 'm', 'e', 'n', 't', 0
126 };
127
128 static const WCHAR szOpen[] = { 'o','p','e','n',0 };
129 static WCHAR szdl[] = { 'd','l',0 };
130 static const WCHAR szvr[] = { 'v','r',0 };
131 static const WCHAR szlc[] = { 'l','c',0 };
132 static WCHAR szbs[] = { 'b','s',0 };
133 static const WCHAR szstr1[] = { 's','t','r','1',0 };
134 static const WCHAR szstr2[] = { 's','t','r','2',0 };
135 static const WCHAR szstar[] = { '*',0 };
136 static const WCHAR szfn1_txt[] = {'f','n','1','.','t','x','t',0};
137
138 static WCHAR szComment[] = {'A',' ','C','o','m','m','e','n','t',0 };
139 static WCHAR szCommentXML[] = {'<','!','-','-','A',' ','C','o','m','m','e','n','t','-','-','>',0 };
140 static WCHAR szCommentNodeText[] = {'#','c','o','m','m','e','n','t',0 };
141
142 static WCHAR szElement[] = {'E','l','e','T','e','s','t', 0 };
143 static WCHAR szElementXML[]  = {'<','E','l','e','T','e','s','t','/','>',0 };
144 static WCHAR szElementXML2[] = {'<','E','l','e','T','e','s','t',' ','A','t','t','r','=','"','"','/','>',0 };
145 static WCHAR szElementXML3[] = {'<','E','l','e','T','e','s','t',' ','A','t','t','r','=','"','"','>',
146                                 'T','e','s','t','i','n','g','N','o','d','e','<','/','E','l','e','T','e','s','t','>',0 };
147
148 static WCHAR szAttribute[] = {'A','t','t','r',0 };
149 static WCHAR szAttributeXML[] = {'A','t','t','r','=','"','"',0 };
150
151 static WCHAR szCData[] = {'[','1',']','*','2','=','3',';',' ','&','g','e','e',' ','t','h','a','t','s',
152                           ' ','n','o','t',' ','r','i','g','h','t','!', 0};
153 static WCHAR szCDataXML[] = {'<','!','[','C','D','A','T','A','[','[','1',']','*','2','=','3',';',' ','&',
154                              'g','e','e',' ','t','h','a','t','s',' ','n','o','t',' ','r','i','g','h','t',
155                              '!',']',']','>',0};
156 static WCHAR szCDataNodeText[] = {'#','c','d','a','t','a','-','s','e','c','t','i','o','n',0 };
157 static WCHAR szDocFragmentText[] = {'#','d','o','c','u','m','e','n','t','-','f','r','a','g','m','e','n','t',0 };
158
159 static WCHAR szEntityRef[] = {'E','n','t','i','t','y','r','e','f',0 };
160 static WCHAR szEntityRefXML[] = {'&','e','n','t','i','t','y','r','e','f',';',0 };
161
162 #define expect_bstr_eq_and_free(bstr, expect) { \
163     BSTR bstrExp = alloc_str_from_narrow(expect); \
164     ok(lstrcmpW(bstr, bstrExp) == 0, "String differs\n"); \
165     SysFreeString(bstr); \
166     SysFreeString(bstrExp); \
167 }
168
169 #define expect_eq(expr, value, type, format) { type ret = (expr); ok((value) == ret, #expr " expected " format " got " format "\n", value, ret); }
170
171 #define ole_check(expr) { \
172     HRESULT r = expr; \
173     ok(r == S_OK, #expr " returned %x\n", r); \
174 }
175
176 #define ole_expect(expr, expect) { \
177     HRESULT r = expr; \
178     ok(r == (expect), #expr " returned %x, expected %x\n", r, expect); \
179 }
180
181 static BSTR alloc_str_from_narrow(const char *str)
182 {
183     int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
184     BSTR ret = SysAllocStringLen(NULL, len - 1);  /* NUL character added automatically */
185     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
186     return ret;
187 }
188
189 BSTR alloced_bstrs[256];
190 int alloced_bstrs_count = 0;
191
192 static BSTR _bstr_(const char *str)
193 {
194     assert(alloced_bstrs_count < sizeof(alloced_bstrs)/sizeof(alloced_bstrs[0]));
195     alloced_bstrs[alloced_bstrs_count] = alloc_str_from_narrow(str);
196     return alloced_bstrs[alloced_bstrs_count++];
197 }
198
199 static void free_bstrs(void)
200 {
201     int i;
202     for (i = 0; i < alloced_bstrs_count; i++)
203         SysFreeString(alloced_bstrs[i]);
204     alloced_bstrs_count = 0;
205 }
206
207 static VARIANT _variantbstr_(const char *str)
208 {
209     VARIANT v;
210     V_VT(&v) = VT_BSTR;
211     V_BSTR(&v) = _bstr_(str);
212     return v;
213 }
214
215 static void get_str_for_type(DOMNodeType type, char *buf)
216 {
217     switch (type)
218     {
219         case NODE_ATTRIBUTE:
220             strcpy(buf, "A");
221             break;
222         case NODE_ELEMENT:
223             strcpy(buf, "E");
224             break;
225         case NODE_DOCUMENT:
226             strcpy(buf, "D");
227             break;
228         default:
229             wsprintfA(buf, "[%d]", type);
230     }
231 }
232
233 static int get_node_position(IXMLDOMNode *node)
234 {
235     HRESULT r;
236     int pos = 0;
237
238     IXMLDOMNode_AddRef(node);
239     do
240     {
241         IXMLDOMNode *new_node;
242
243         pos++;
244         r = IXMLDOMNode_get_previousSibling(node, &new_node);
245         ok(!FAILED(r), "get_previousSibling failed\n");
246         IXMLDOMNode_Release(node);
247         node = new_node;
248     } while (r == S_OK);
249     return pos;
250 }
251
252 static void node_to_string(IXMLDOMNode *node, char *buf)
253 {
254     HRESULT r = S_OK;
255     DOMNodeType type;
256
257     if (node == NULL)
258     {
259         lstrcpyA(buf, "(null)");
260         return;
261     }
262
263     IXMLDOMNode_AddRef(node);
264     while (r == S_OK)
265     {
266         IXMLDOMNode *new_node;
267
268         ole_check(IXMLDOMNode_get_nodeType(node, &type));
269         get_str_for_type(type, buf);
270         buf+=strlen(buf);
271
272         if (type == NODE_ATTRIBUTE)
273         {
274             BSTR bstr;
275             ole_check(IXMLDOMNode_get_nodeName(node, &bstr));
276             *(buf++) = '\'';
277             wsprintfA(buf, "%ws", bstr);
278             buf += strlen(buf);
279             *(buf++) = '\'';
280             SysFreeString(bstr);
281
282             r = IXMLDOMNode_selectSingleNode(node, _bstr_(".."), &new_node);
283         }
284         else
285         {
286             int pos = get_node_position(node);
287             DOMNodeType parent_type = NODE_INVALID;
288             r = IXMLDOMNode_get_parentNode(node, &new_node);
289
290             /* currently wine doesn't create a node for the <?xml ... ?>. To be able to test query
291              * results we "fix" it */
292             if (r == S_OK)
293                 ole_check(IXMLDOMNode_get_nodeType(node, &parent_type));
294             /* we need also to workaround the no document node problem - see below */
295             if (((r == S_FALSE && type != NODE_DOCUMENT) || parent_type == NODE_DOCUMENT) && type != NODE_PROCESSING_INSTRUCTION && pos==1)
296             {
297                 todo_wine ok(FALSE, "The first child of the document node in MSXML is the <?xml ... ?> processing instruction\n");
298                 pos++;
299             }
300             wsprintf(buf, "%d", pos);
301             buf += strlen(buf);
302         }
303
304         ok(!FAILED(r), "get_parentNode failed (%08x)\n", r);
305         IXMLDOMNode_Release(node);
306         node = new_node;
307         if (r == S_OK)
308             *(buf++) = '.';
309     }
310
311     /* currently we can't access document node in wine. All our examples this is the
312      * root node so to be able to test query results we add it */
313     if (type != NODE_DOCUMENT)
314     {
315         todo_wine ok(FALSE, "Document node is not the last returned node!\n");
316         *(buf++) = '.';
317         *(buf++) = 'D';
318         *(buf++) = '1';
319     }
320     *buf = 0;
321 }
322
323 static char *list_to_string(IXMLDOMNodeList *list)
324 {
325     static char buf[4096];
326     char *pos = buf;
327     long len = 0;
328     int i;
329
330     if (list == NULL)
331     {
332         lstrcpyA(buf, "(null)");
333         return buf;
334     }
335     ole_check(IXMLDOMNodeList_get_length(list, &len));
336     for (i = 0; i < len; i++)
337     {
338         IXMLDOMNode *node;
339         if (i > 0)
340             *(pos++) = ' ';
341         ole_check(IXMLDOMNodeList_nextNode(list, &node));
342         node_to_string(node, pos);
343         pos += strlen(pos);
344         IXMLDOMNode_Release(node);
345     }
346     *pos = 0;
347     return buf;
348 }
349
350 #define expect_node(node, expstr) { char str[4096]; node_to_string(node, str); ok(strcmp(str, expstr)==0, "Invalid node: %s, exptected %s\n", str, expstr); }
351 #define expect_list_and_release(list, expstr) { char *str = list_to_string(list); ok(strcmp(str, expstr)==0, "Invalid node list: %s, exptected %s\n", str, expstr); if (list) IXMLDOMNodeList_Release(list); }
352
353 static void test_domdoc( void )
354 {
355     HRESULT r;
356     IXMLDOMDocument *doc = NULL;
357     IXMLDOMParseError *error;
358     IXMLDOMElement *element = NULL;
359     IXMLDOMNode *node;
360     IXMLDOMText *nodetext = NULL;
361     IXMLDOMComment *node_comment = NULL;
362     IXMLDOMAttribute *node_attr = NULL;
363     IXMLDOMNode *nodeChild = NULL;
364     IXMLDOMProcessingInstruction *nodePI = NULL;
365     VARIANT_BOOL b;
366     VARIANT var;
367     BSTR str;
368     long code;
369
370     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
371         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
372     if( r != S_OK )
373         return;
374
375     /* try some stupid things */
376     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
377     ok( r == S_FALSE, "loadXML failed\n");
378
379     b = VARIANT_TRUE;
380     r = IXMLDOMDocument_loadXML( doc, NULL, &b );
381     ok( r == S_FALSE, "loadXML failed\n");
382     ok( b == VARIANT_FALSE, "failed to load XML string\n");
383
384     /* try to load a document from a nonexistent file */
385     b = VARIANT_TRUE;
386     str = SysAllocString( szNonExistentFile );
387     VariantInit(&var);
388     V_VT(&var) = VT_BSTR;
389     V_BSTR(&var) = str;
390
391     r = IXMLDOMDocument_load( doc, var, &b);
392     ok( r == S_FALSE, "load (from file) failed\n");
393     ok( b == VARIANT_FALSE, "failed to load XML file\n");
394     SysFreeString( str );
395
396     /* try load an empty document */
397     b = VARIANT_TRUE;
398     str = SysAllocString( szEmpty );
399     r = IXMLDOMDocument_loadXML( doc, str, &b );
400     ok( r == S_FALSE, "loadXML failed\n");
401     ok( b == VARIANT_FALSE, "failed to load XML string\n");
402     SysFreeString( str );
403
404     /* check that there's no document element */
405     element = NULL;
406     r = IXMLDOMDocument_get_documentElement( doc, &element );
407     ok( r == S_FALSE, "should be no document element\n");
408
409     /* try finding a node */
410     node = NULL;
411     str = SysAllocString( szstr1 );
412     r = IXMLDOMDocument_selectSingleNode( doc, str, &node );
413     ok( r == S_FALSE, "ret %08x\n", r );
414     SysFreeString( str );
415
416     b = VARIANT_TRUE;
417     str = SysAllocString( szIncomplete );
418     r = IXMLDOMDocument_loadXML( doc, str, &b );
419     ok( r == S_FALSE, "loadXML failed\n");
420     ok( b == VARIANT_FALSE, "failed to load XML string\n");
421     SysFreeString( str );
422
423     /* check that there's no document element */
424     element = (IXMLDOMElement*)1;
425     r = IXMLDOMDocument_get_documentElement( doc, &element );
426     ok( r == S_FALSE, "should be no document element\n");
427     ok( element == NULL, "Element should be NULL\n");
428
429     /* try to load something valid */
430     b = VARIANT_FALSE;
431     str = SysAllocString( szComplete1 );
432     r = IXMLDOMDocument_loadXML( doc, str, &b );
433     ok( r == S_OK, "loadXML failed\n");
434     ok( b == VARIANT_TRUE, "failed to load XML string\n");
435     SysFreeString( str );
436
437     /* try with a null out pointer */
438     r = IXMLDOMDocument_get_documentElement( doc, NULL );
439     ok( r == E_INVALIDARG, "should be no document element\n");
440
441     /* check if nodename is correct */
442     r = IXMLDOMDocument_get_nodeName( doc, NULL );
443     ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
444
445     /* content doesn't matter here */
446     str = NULL;
447     r = IXMLDOMDocument_get_nodeName( doc, &str );
448     ok ( r == S_OK, "get_nodeName wrong code\n");
449     ok ( str != NULL, "str is null\n");
450     ok( !lstrcmpW( str, szDocument ), "incorrect nodeName\n");
451     SysFreeString( str );
452
453     /* test put_text */
454     r = IXMLDOMDocument_put_text( doc, _bstr_("Should Fail") );
455     ok( r == E_FAIL, "ret %08x\n", r );
456
457     /* check that there's a document element */
458     element = NULL;
459     r = IXMLDOMDocument_get_documentElement( doc, &element );
460     ok( r == S_OK, "should be a document element\n");
461     if( element )
462     {
463         BSTR tag = NULL;
464
465         /* check if the tag is correct */
466         r = IXMLDOMElement_get_tagName( element, &tag );
467         ok( r == S_OK, "couldn't get tag name\n");
468         ok( tag != NULL, "tag was null\n");
469         ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
470         SysFreeString( tag );
471
472         /* figure out what happens if we try to reload the document */
473         str = SysAllocString( szComplete2 );
474         r = IXMLDOMDocument_loadXML( doc, str, &b );
475         ok( r == S_OK, "loadXML failed\n");
476         ok( b == VARIANT_TRUE, "failed to load XML string\n");
477         SysFreeString( str );
478
479         /* check if the tag is still correct */
480         tag = NULL;
481         r = IXMLDOMElement_get_tagName( element, &tag );
482         ok( r == S_OK, "couldn't get tag name\n");
483         ok( tag != NULL, "tag was null\n");
484         ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
485         SysFreeString( tag );
486
487         IXMLDOMElement_Release( element );
488         element = NULL;
489     }
490
491     /* as soon as we call loadXML again, the document element will disappear */
492     b = 2;
493     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
494     ok( r == S_FALSE, "loadXML failed\n");
495     ok( b == 2, "variant modified\n");
496     r = IXMLDOMDocument_get_documentElement( doc, &element );
497     ok( r == S_FALSE, "should be no document element\n");
498
499     /* try to load something else simple and valid */
500     b = VARIANT_FALSE;
501     str = SysAllocString( szComplete3 );
502     r = IXMLDOMDocument_loadXML( doc, str, &b );
503     ok( r == S_OK, "loadXML failed\n");
504     ok( b == VARIANT_TRUE, "failed to load XML string\n");
505     SysFreeString( str );
506
507     /* try something a little more complicated */
508     b = FALSE;
509     str = SysAllocString( szComplete4 );
510     r = IXMLDOMDocument_loadXML( doc, str, &b );
511     ok( r == S_OK, "loadXML failed\n");
512     ok( b == VARIANT_TRUE, "failed to load XML string\n");
513     SysFreeString( str );
514
515     r = IXMLDOMDocument_get_parseError( doc, &error );
516     ok( r == S_OK, "returns %08x\n", r );
517
518     r = IXMLDOMParseError_get_errorCode( error, &code );
519     ok( r == S_FALSE, "returns %08x\n", r );
520     ok( code == 0, "code %ld\n", code );
521     IXMLDOMParseError_Release( error );
522
523      /* test createTextNode */
524     str = SysAllocString( szOpen );
525     r = IXMLDOMDocument_createTextNode(doc, str, NULL);
526     ok( r == E_INVALIDARG, "returns %08x\n", r );
527     r = IXMLDOMDocument_createTextNode(doc, str, &nodetext);
528     ok( r == S_OK, "returns %08x\n", r );
529     if(nodetext)
530     {
531         IXMLDOMNamedNodeMap *pAttribs;
532
533         /* Text Last Child Checks */
534         r = IXMLDOMText_get_lastChild(nodetext, NULL);
535         ok(r == E_INVALIDARG, "ret %08x\n", r );
536
537         nodeChild = (IXMLDOMNode*)0x1;
538         r = IXMLDOMText_get_lastChild(nodetext, &nodeChild);
539         ok(r == S_FALSE, "ret %08x\n", r );
540         ok(nodeChild == NULL, "nodeChild not NULL\n");
541
542         /* test get_attributes */
543         r = IXMLDOMText_get_attributes( nodetext, NULL );
544         ok( r == E_INVALIDARG, "get_attributes returned wrong code\n");
545
546         pAttribs = (IXMLDOMNamedNodeMap*)0x1;
547         r = IXMLDOMText_get_attributes( nodetext, &pAttribs);
548         ok(r == S_FALSE, "ret %08x\n", r );
549         ok( pAttribs == NULL, "pAttribs not NULL\n");
550
551         /* test get_dataType */
552         r = IXMLDOMText_get_dataType(nodetext, &var);
553         ok(r == S_FALSE, "ret %08x\n", r );
554         ok( V_VT(&var) == VT_NULL, "incorrect dataType type\n");
555         VariantClear(&var);
556
557         /* test nodeTypeString */
558         r = IXMLDOMText_get_nodeTypeString(nodetext, &str);
559         ok(r == S_OK, "ret %08x\n", r );
560         ok( !lstrcmpW( str, _bstr_("text") ), "incorrect nodeTypeString string\n");
561         SysFreeString(str);
562
563         IXMLDOMText_Release( nodetext );
564     }
565     SysFreeString( str );
566
567     /* test Create Comment */
568     r = IXMLDOMDocument_createComment(doc, NULL, NULL);
569     ok( r == E_INVALIDARG, "returns %08x\n", r );
570     r = IXMLDOMDocument_createComment(doc, szComment, &node_comment);
571     ok( r == S_OK, "returns %08x\n", r );
572     if(node_comment)
573     {
574         /* Last Child Checks */
575         r = IXMLDOMComment_get_lastChild(node_comment, NULL);
576         ok(r == E_INVALIDARG, "ret %08x\n", r );
577
578         nodeChild = (IXMLDOMNode*)0x1;
579         r = IXMLDOMComment_get_lastChild(node_comment, &nodeChild);
580         ok(r == S_FALSE, "ret %08x\n", r );
581         ok(nodeChild == NULL, "pLastChild not NULL\n");
582
583         IXMLDOMComment_Release( node_comment );
584     }
585
586     /* test Create Attribute */
587     r = IXMLDOMDocument_createAttribute(doc, NULL, NULL);
588     ok( r == E_INVALIDARG, "returns %08x\n", r );
589     r = IXMLDOMDocument_createAttribute(doc, szAttribute, &node_attr);
590     ok( r == S_OK, "returns %08x\n", r );
591     IXMLDOMText_Release( node_attr);
592
593     /* test Processing Instruction */
594     str = SysAllocStringLen(NULL, 0);
595     r = IXMLDOMDocument_createProcessingInstruction(doc, str, str, NULL);
596     ok( r == E_INVALIDARG, "returns %08x\n", r );
597     r = IXMLDOMDocument_createProcessingInstruction(doc, NULL, str, &nodePI);
598     ok( r == E_FAIL, "returns %08x\n", r );
599     r = IXMLDOMDocument_createProcessingInstruction(doc, str, str, &nodePI);
600     ok( r == E_FAIL, "returns %08x\n", r );
601     SysFreeString(str);
602
603     r = IXMLDOMDocument_createProcessingInstruction(doc, _bstr_("xml"), _bstr_("version=\"1.0\""), &nodePI);
604     ok( r == S_OK, "returns %08x\n", r );
605     if(nodePI)
606     {
607         /* Last Child Checks */
608         r = IXMLDOMProcessingInstruction_get_lastChild(nodePI, NULL);
609         ok(r == E_INVALIDARG, "ret %08x\n", r );
610
611         nodeChild = (IXMLDOMNode*)0x1;
612         r = IXMLDOMProcessingInstruction_get_lastChild(nodePI, &nodeChild);
613         ok(r == S_FALSE, "ret %08x\n", r );
614         ok(nodeChild == NULL, "nodeChild not NULL\n");
615
616         r = IXMLDOMProcessingInstruction_get_dataType(nodePI, &var);
617         ok(r == S_FALSE, "ret %08x\n", r );
618         ok( V_VT(&var) == VT_NULL, "incorrect dataType type\n");
619         VariantClear(&var);
620
621         /* test nodeTypeString */
622         r = IXMLDOMProcessingInstruction_get_nodeTypeString(nodePI, &str);
623         ok(r == S_OK, "ret %08x\n", r );
624         ok( !lstrcmpW( str, _bstr_("processinginstruction") ), "incorrect nodeTypeString string\n");
625         SysFreeString(str);
626
627         IXMLDOMProcessingInstruction_Release(nodePI);
628     }
629
630     r = IXMLDOMDocument_Release( doc );
631     ok( r == 0, "document ref count incorrect\n");
632
633 }
634
635 static void test_domnode( void )
636 {
637     HRESULT r;
638     IXMLDOMDocument *doc = NULL, *owner = NULL;
639     IXMLDOMElement *element = NULL;
640     IXMLDOMNamedNodeMap *map = NULL;
641     IXMLDOMNode *node = NULL, *next = NULL;
642     IXMLDOMNodeList *list = NULL;
643     DOMNodeType type = NODE_INVALID;
644     VARIANT_BOOL b;
645     BSTR str;
646     VARIANT var;
647     long count;
648
649     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
650         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
651     if( r != S_OK )
652         return;
653
654     b = FALSE;
655     str = SysAllocString( szComplete4 );
656     r = IXMLDOMDocument_loadXML( doc, str, &b );
657     ok( r == S_OK, "loadXML failed\n");
658     ok( b == VARIANT_TRUE, "failed to load XML string\n");
659     SysFreeString( str );
660
661     if (doc)
662     {
663         b = 1;
664         r = IXMLDOMNode_hasChildNodes( doc, &b );
665         ok( r == S_OK, "hasChildNoes bad return\n");
666         ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
667
668         r = IXMLDOMDocument_get_documentElement( doc, &element );
669         ok( r == S_OK, "should be a document element\n");
670         ok( element != NULL, "should be an element\n");
671     }
672     else
673         ok( FALSE, "no document\n");
674
675     VariantInit(&var);
676     ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
677
678     r = IXMLDOMNode_get_nodeValue( doc, NULL );
679     ok(r == E_INVALIDARG, "get_nodeValue ret %08x\n", r );
680
681     r = IXMLDOMNode_get_nodeValue( doc, &var );
682     ok( r == S_FALSE, "nextNode returned wrong code\n");
683     ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
684     ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
685
686     if (element)
687     {
688         owner = NULL;
689         r = IXMLDOMNode_get_ownerDocument( element, &owner );
690         todo_wine {
691         ok( r == S_OK, "get_ownerDocument return code\n");
692         }
693         ok( owner != doc, "get_ownerDocument return\n");
694
695         type = NODE_INVALID;
696         r = IXMLDOMNode_get_nodeType( element, &type);
697         ok( r == S_OK, "getNamedItem returned wrong code\n");
698         ok( type == NODE_ELEMENT, "node not an element\n");
699
700         str = NULL;
701         r = IXMLDOMNode_get_baseName( element, &str );
702         ok( r == S_OK, "get_baseName returned wrong code\n");
703         ok( lstrcmpW(str,szlc) == 0, "basename was wrong\n");
704         SysFreeString(str);
705
706         /* check if nodename is correct */
707         r = IXMLDOMElement_get_nodeName( element, NULL );
708         ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
709     
710         /* content doesn't matter here */
711         str = NULL;
712         r = IXMLDOMElement_get_nodeName( element, &str );
713         ok ( r == S_OK, "get_nodeName wrong code\n");
714         ok ( str != NULL, "str is null\n");
715         ok( !lstrcmpW( str, szlc ), "incorrect nodeName\n");
716         SysFreeString( str );
717
718         str = SysAllocString( szNonExistentFile );      
719         V_VT(&var) = VT_I4;
720         V_I4(&var) = 0x1234;
721         r = IXMLDOMElement_getAttribute( element, str, &var );
722         ok( r == S_FALSE, "getAttribute ret %08x\n", r );
723         ok( V_VT(&var) == VT_NULL, "vt = %x\n", V_VT(&var));
724         VariantClear(&var);
725         SysFreeString( str );
726
727         str = SysAllocString( szdl );   
728         V_VT(&var) = VT_I4;
729         V_I4(&var) = 0x1234;
730         r = IXMLDOMElement_getAttribute( element, str, &var );
731         ok( r == S_OK, "getAttribute ret %08x\n", r );
732         ok( V_VT(&var) == VT_BSTR, "vt = %x\n", V_VT(&var));
733         ok( !lstrcmpW(V_BSTR(&var), szstr1), "wrong attr value\n");
734         VariantClear( &var );
735
736         r = IXMLDOMElement_getAttribute( element, NULL, &var );
737         ok( r == E_INVALIDARG, "getAttribute ret %08x\n", r );
738
739         r = IXMLDOMElement_getAttribute( element, str, NULL );
740         ok( r == E_INVALIDARG, "getAttribute ret %08x\n", r );
741
742         SysFreeString( str );
743
744         r = IXMLDOMElement_get_attributes( element, &map );
745         ok( r == S_OK, "get_attributes returned wrong code\n");
746         ok( map != NULL, "should be attributes\n");
747
748         b = 1;
749         r = IXMLDOMNode_hasChildNodes( element, &b );
750         ok( r == S_OK, "hasChildNoes bad return\n");
751         ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
752     }
753     else
754         ok( FALSE, "no element\n");
755
756     if (map)
757     {
758         ISupportErrorInfo *support_error;
759         r = IXMLDOMNamedNodeMap_QueryInterface( map, &IID_ISupportErrorInfo, (LPVOID*)&support_error );
760         ok( r == S_OK, "ret %08x\n", r );
761
762         r = ISupportErrorInfo_InterfaceSupportsErrorInfo( support_error, &IID_IXMLDOMNamedNodeMap );
763 todo_wine
764 {
765         ok( r == S_OK, "ret %08x\n", r );
766 }
767         ISupportErrorInfo_Release( support_error );
768
769         str = SysAllocString( szdl );
770         r = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
771         ok( r == S_OK, "getNamedItem returned wrong code\n");
772         ok( node != NULL, "should be attributes\n");
773         IXMLDOMNode_Release(node);
774         SysFreeString( str );
775
776         str = SysAllocString( szdl );
777         r = IXMLDOMNamedNodeMap_getNamedItem( map, str, NULL );
778         ok( r == E_INVALIDARG, "getNamedItem should return E_INVALIDARG\n");
779         SysFreeString( str );
780
781         /* something that isn't in szComplete4 */
782         str = SysAllocString( szOpen );
783         node = (IXMLDOMNode *) 1;
784         r = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
785         ok( r = S_FALSE, "getNamedItem found a node that wasn't there\n");
786         ok( node == NULL, "getNamedItem should have returned NULL\n");
787         SysFreeString( str );
788
789         /* test indexed access of attributes */
790         r = IXMLDOMNamedNodeMap_get_length( map, &count );
791         ok ( r == S_OK, "get_length wrong code\n");
792         ok ( count == 1, "get_length != 1\n");
793
794         node = NULL;
795         r = IXMLDOMNamedNodeMap_get_item( map, -1, &node);
796         ok ( r == S_FALSE, "get_item (-1) wrong code\n");
797         ok ( node == NULL, "there is no node\n");
798
799         node = NULL;
800         r = IXMLDOMNamedNodeMap_get_item( map, 1, &node);
801         ok ( r == S_FALSE, "get_item (1) wrong code\n");
802         ok ( node == NULL, "there is no attribute\n");
803
804         node = NULL;
805         r = IXMLDOMNamedNodeMap_get_item( map, 0, &node);
806         ok ( r == S_OK, "get_item (0) wrong code\n");
807         ok ( node != NULL, "should be attribute\n");
808
809         r = IXMLDOMNode_get_nodeName( node, NULL );
810         ok ( r == E_INVALIDARG, "get_nodeName (NULL) wrong code\n");
811
812         /* content doesn't matter here */
813         str = NULL;
814         r = IXMLDOMNode_get_nodeName( node, &str );
815         ok ( r == S_OK, "get_nodeName wrong code\n");
816         ok ( str != NULL, "str is null\n");
817         ok( !lstrcmpW( str, szdl ), "incorrect node name\n");
818         SysFreeString( str );
819
820         /* test sequential access of attributes */
821         node = NULL;
822         r = IXMLDOMNamedNodeMap_nextNode( map, &node );
823         ok ( r == S_OK, "nextNode (first time) wrong code\n");
824         ok ( node != NULL, "nextNode, should be attribute\n");
825
826         r = IXMLDOMNamedNodeMap_nextNode( map, &node );
827         ok ( r != S_OK, "nextNode (second time) wrong code\n");
828         ok ( node == NULL, "nextNode, there is no attribute\n");
829
830         r = IXMLDOMNamedNodeMap_reset( map );
831         ok ( r == S_OK, "reset should return S_OK\n");
832
833         r = IXMLDOMNamedNodeMap_nextNode( map, &node );
834         ok ( r == S_OK, "nextNode (third time) wrong code\n");
835         ok ( node != NULL, "nextNode, should be attribute\n");
836     }
837     else
838         ok( FALSE, "no map\n");
839
840     if (node)
841     {
842         type = NODE_INVALID;
843         r = IXMLDOMNode_get_nodeType( node, &type);
844         ok( r == S_OK, "getNamedItem returned wrong code\n");
845         ok( type == NODE_ATTRIBUTE, "node not an attribute\n");
846
847         str = NULL;
848         r = IXMLDOMNode_get_baseName( node, NULL );
849         ok( r == E_INVALIDARG, "get_baseName returned wrong code\n");
850
851         str = NULL;
852         r = IXMLDOMNode_get_baseName( node, &str );
853         ok( r == S_OK, "get_baseName returned wrong code\n");
854         ok( lstrcmpW(str,szdl) == 0, "basename was wrong\n");
855         SysFreeString( str );
856
857         r = IXMLDOMNode_get_nodeValue( node, &var );
858         ok( r == S_OK, "returns %08x\n", r );
859         ok( V_VT(&var) == VT_BSTR, "vt %x\n", V_VT(&var));
860         ok( !lstrcmpW(V_BSTR(&var), szstr1), "nodeValue incorrect\n");
861         VariantClear(&var);
862
863         r = IXMLDOMNode_get_childNodes( node, NULL );
864         ok( r == E_INVALIDARG, "get_childNodes returned wrong code\n");
865
866         r = IXMLDOMNode_get_childNodes( node, &list );
867         ok( r == S_OK, "get_childNodes returned wrong code\n");
868
869         if (list)
870         {
871             r = IXMLDOMNodeList_nextNode( list, &next );
872             ok( r == S_OK, "nextNode returned wrong code\n");
873         }
874         else
875             ok( FALSE, "no childlist\n");
876
877         if (next)
878         {
879             b = 1;
880             r = IXMLDOMNode_hasChildNodes( next, &b );
881             ok( r == S_FALSE, "hasChildNoes bad return\n");
882             ok( b == VARIANT_FALSE, "hasChildNoes wrong result\n");
883
884             type = NODE_INVALID;
885             r = IXMLDOMNode_get_nodeType( next, &type);
886             ok( r == S_OK, "getNamedItem returned wrong code\n");
887             ok( type == NODE_TEXT, "node not text\n");
888
889             str = (BSTR) 1;
890             r = IXMLDOMNode_get_baseName( next, &str );
891             ok( r == S_FALSE, "get_baseName returned wrong code\n");
892             ok( str == NULL, "basename was wrong\n");
893             SysFreeString(str);
894         }
895         else
896             ok( FALSE, "no next\n");
897
898         if (next)
899             IXMLDOMNode_Release( next );
900         next = NULL;
901         if (list)
902             IXMLDOMNodeList_Release( list );
903         list = NULL;
904         if (node)
905             IXMLDOMNode_Release( node );
906     }
907     else
908         ok( FALSE, "no node\n");
909     node = NULL;
910
911     if (map)
912         IXMLDOMNamedNodeMap_Release( map );
913
914     /* now traverse the tree from the root element */
915     if (element)
916     {
917         IXMLDOMNode *node;
918         r = IXMLDOMNode_get_childNodes( element, &list );
919         ok( r == S_OK, "get_childNodes returned wrong code\n");
920
921         /* using get_item for child list doesn't advance the position */
922         ole_check(IXMLDOMNodeList_get_item(list, 1, &node));
923         expect_node(node, "E2.E2.D1");
924         IXMLDOMNode_Release(node);
925         ole_check(IXMLDOMNodeList_nextNode(list, &node));
926         expect_node(node, "E1.E2.D1");
927         IXMLDOMNode_Release(node);
928         ole_check(IXMLDOMNodeList_reset(list));
929
930         IXMLDOMNodeList_AddRef(list);
931         expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1");
932         ole_check(IXMLDOMNodeList_reset(list));
933     }
934     else
935         ok( FALSE, "no element\n");
936
937     node = (void*)0xdeadbeef;
938     r = IXMLDOMNode_selectSingleNode( element, szdl, &node );
939     ok( r == S_FALSE, "ret %08x\n", r );
940     ok( node == NULL, "node %p\n", node );
941     r = IXMLDOMNode_selectSingleNode( element, szbs, &node );
942     ok( r == S_OK, "ret %08x\n", r );
943     r = IXMLDOMNode_Release( node );
944     ok( r == 0, "ret %08x\n", r );
945
946     if (list)
947     {
948         r = IXMLDOMNodeList_get_length( list, &count );
949         ok( r == S_OK, "get_length returns %08x\n", r );
950         ok( count == 4, "get_length got %ld\n", count );
951
952         r = IXMLDOMNodeList_nextNode( list, &node );
953         ok( r == S_OK, "nextNode returned wrong code\n");
954     }
955     else
956         ok( FALSE, "no list\n");
957
958     if (node)
959     {
960         type = NODE_INVALID;
961         r = IXMLDOMNode_get_nodeType( node, &type);
962         ok( r == S_OK, "getNamedItem returned wrong code\n");
963         ok( type == NODE_ELEMENT, "node not text\n");
964
965         VariantInit(&var);
966         ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
967         r = IXMLDOMNode_get_nodeValue( node, &var );
968         ok( r == S_FALSE, "nextNode returned wrong code\n");
969         ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
970         ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
971
972         r = IXMLDOMNode_hasChildNodes( node, NULL );
973         ok( r == E_INVALIDARG, "hasChildNoes bad return\n");
974
975         b = 1;
976         r = IXMLDOMNode_hasChildNodes( node, &b );
977         ok( r == S_OK, "hasChildNoes bad return\n");
978         ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
979
980         str = NULL;
981         r = IXMLDOMNode_get_baseName( node, &str );
982         ok( r == S_OK, "get_baseName returned wrong code\n");
983         ok( lstrcmpW(str,szbs) == 0, "basename was wrong\n");
984         SysFreeString(str);
985     }
986     else
987         ok( FALSE, "no node\n");
988
989     if (node)
990         IXMLDOMNode_Release( node );
991     if (list)
992         IXMLDOMNodeList_Release( list );
993     if (element)
994         IXMLDOMElement_Release( element );
995
996     b = FALSE;
997     str = SysAllocString( szComplete5 );
998     r = IXMLDOMDocument_loadXML( doc, str, &b );
999     ok( r == S_OK, "loadXML failed\n");
1000     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1001     SysFreeString( str );
1002
1003     b = 1;
1004     r = IXMLDOMNode_hasChildNodes( doc, &b );
1005     ok( r == S_OK, "hasChildNoes bad return\n");
1006     ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
1007
1008     r = IXMLDOMDocument_get_documentElement( doc, &element );
1009     ok( r == S_OK, "should be a document element\n");
1010     ok( element != NULL, "should be an element\n");
1011
1012     if (element)
1013     {
1014         static const WCHAR szSSearch[] = {'S',':','s','e','a','r','c','h',0};
1015         BSTR tag = NULL;
1016
1017         /* check if the tag is correct */
1018         r = IXMLDOMElement_get_tagName( element, &tag );
1019         ok( r == S_OK, "couldn't get tag name\n");
1020         ok( tag != NULL, "tag was null\n");
1021         ok( !lstrcmpW( tag, szSSearch ), "incorrect tag name\n");
1022         SysFreeString( tag );
1023     }
1024
1025     if (element)
1026         IXMLDOMElement_Release( element );
1027     if (doc)
1028         IXMLDOMDocument_Release( doc );
1029 }
1030
1031 static void test_refs(void)
1032 {
1033     HRESULT r;
1034     BSTR str;
1035     VARIANT_BOOL b;
1036     IXMLDOMDocument *doc = NULL;
1037     IXMLDOMElement *element = NULL;
1038     IXMLDOMNode *node = NULL, *node2;
1039     IXMLDOMNodeList *node_list = NULL;
1040     LONG ref;
1041     IUnknown *unk, *unk2;
1042
1043     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1044         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1045     if( r != S_OK )
1046         return;
1047     ref = IXMLDOMDocument_Release(doc);
1048     ok( ref == 0, "ref %d\n", ref);
1049
1050     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1051         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1052     if( r != S_OK )
1053         return;
1054
1055     str = SysAllocString( szComplete4 );
1056     r = IXMLDOMDocument_loadXML( doc, str, &b );
1057     ok( r == S_OK, "loadXML failed\n");
1058     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1059     SysFreeString( str );
1060
1061     ref = IXMLDOMDocument_AddRef( doc );
1062     ok( ref == 2, "ref %d\n", ref );
1063     ref = IXMLDOMDocument_AddRef( doc );
1064     ok( ref == 3, "ref %d\n", ref );
1065     IXMLDOMDocument_Release( doc );
1066     IXMLDOMDocument_Release( doc );
1067
1068     r = IXMLDOMDocument_get_documentElement( doc, &element );
1069     ok( r == S_OK, "should be a document element\n");
1070     ok( element != NULL, "should be an element\n");
1071
1072     ref = IXMLDOMDocument_AddRef( doc );
1073     ok( ref == 2, "ref %d\n", ref );
1074     IXMLDOMDocument_Release( doc );
1075
1076     r = IXMLDOMElement_get_childNodes( element, &node_list );
1077     ok( r == S_OK, "rets %08x\n", r);
1078     ref = IXMLDOMNodeList_AddRef( node_list );
1079     ok( ref == 2, "ref %d\n", ref );
1080     IXMLDOMNodeList_Release( node_list );
1081
1082     IXMLDOMNodeList_get_item( node_list, 0, &node );
1083     ok( r == S_OK, "rets %08x\n", r);
1084
1085     IXMLDOMNodeList_get_item( node_list, 0, &node2 );
1086     ok( r == S_OK, "rets %08x\n", r);
1087
1088     ref = IXMLDOMNode_AddRef( node );
1089     ok( ref == 2, "ref %d\n", ref );
1090     IXMLDOMNode_Release( node );
1091
1092     ref = IXMLDOMNode_Release( node );
1093     ok( ref == 0, "ref %d\n", ref );
1094     ref = IXMLDOMNode_Release( node2 );
1095     ok( ref == 0, "ref %d\n", ref );
1096
1097     ref = IXMLDOMNodeList_Release( node_list );
1098     ok( ref == 0, "ref %d\n", ref );
1099
1100     ok( node != node2, "node %p node2 %p\n", node, node2 );
1101
1102     ref = IXMLDOMDocument_Release( doc );
1103     ok( ref == 0, "ref %d\n", ref );
1104
1105     ref = IXMLDOMElement_AddRef( element );
1106     todo_wine {
1107     ok( ref == 3, "ref %d\n", ref );
1108     }
1109     IXMLDOMElement_Release( element );
1110
1111     /* IUnknown must be unique however we obtain it */
1112     r = IXMLDOMElement_QueryInterface( element, &IID_IUnknown, (LPVOID*)&unk );
1113     ok( r == S_OK, "rets %08x\n", r );
1114     r = IXMLDOMElement_QueryInterface( element, &IID_IXMLDOMNode, (LPVOID*)&node );
1115     ok( r == S_OK, "rets %08x\n", r );
1116     r = IXMLDOMNode_QueryInterface( node, &IID_IUnknown, (LPVOID*)&unk2 );
1117     ok( r == S_OK, "rets %08x\n", r );
1118     ok( unk == unk2, "unk %p unk2 %p\n", unk, unk2 );
1119
1120     IUnknown_Release( unk2 );
1121     IUnknown_Release( unk );
1122     IXMLDOMNode_Release( node );
1123
1124     IXMLDOMElement_Release( element );
1125
1126 }
1127
1128 static void test_create(void)
1129 {
1130     HRESULT r;
1131     VARIANT var;
1132     BSTR str, name;
1133     IXMLDOMDocument *doc;
1134     IXMLDOMElement *element;
1135     IXMLDOMNode *root, *node, *child;
1136     IXMLDOMNamedNodeMap *attr_map;
1137     IUnknown *unk;
1138     LONG ref;
1139     long num;
1140
1141     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1142         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1143     if( r != S_OK )
1144         return;
1145
1146     V_VT(&var) = VT_I4;
1147     V_I4(&var) = NODE_ELEMENT;
1148     str = SysAllocString( szlc );
1149     r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
1150     ok( r == S_OK, "returns %08x\n", r );
1151     r = IXMLDOMDocument_appendChild( doc, node, &root );
1152     ok( r == S_OK, "returns %08x\n", r );
1153     ok( node == root, "%p %p\n", node, root );
1154
1155     ref = IXMLDOMNode_AddRef( node );
1156     ok(ref == 3, "ref %d\n", ref);
1157     IXMLDOMNode_Release( node );
1158
1159     ref = IXMLDOMNode_Release( node );
1160     ok(ref == 1, "ref %d\n", ref);
1161     SysFreeString( str );
1162
1163     V_VT(&var) = VT_I4;
1164     V_I4(&var) = NODE_ELEMENT;
1165     str = SysAllocString( szbs );
1166     r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
1167     ok( r == S_OK, "returns %08x\n", r );
1168
1169     ref = IXMLDOMNode_AddRef( node );
1170     ok(ref == 2, "ref = %d\n", ref);
1171     IXMLDOMNode_Release( node );
1172
1173     r = IXMLDOMNode_QueryInterface( node, &IID_IUnknown, (LPVOID*)&unk );
1174     ok( r == S_OK, "returns %08x\n", r );
1175
1176     ref = IXMLDOMNode_AddRef( unk );
1177     ok(ref == 3, "ref = %d\n", ref);
1178     IXMLDOMNode_Release( unk );
1179
1180     V_VT(&var) = VT_EMPTY;
1181     r = IXMLDOMNode_insertBefore( root, (IXMLDOMNode*)unk, var, &child );
1182     ok( r == S_OK, "returns %08x\n", r );
1183     ok( unk == (IUnknown*)child, "%p %p\n", unk, child );
1184     IXMLDOMNode_Release( child );
1185     IUnknown_Release( unk );
1186
1187
1188     V_VT(&var) = VT_NULL;
1189     V_DISPATCH(&var) = (IDispatch*)node;
1190     r = IXMLDOMNode_insertBefore( root, node, var, &child );
1191     ok( r == S_OK, "returns %08x\n", r );
1192     ok( node == child, "%p %p\n", node, child );
1193     IXMLDOMNode_Release( child );
1194
1195
1196     V_VT(&var) = VT_NULL;
1197     V_DISPATCH(&var) = (IDispatch*)node;
1198     r = IXMLDOMNode_insertBefore( root, node, var, NULL );
1199     ok( r == S_OK, "returns %08x\n", r );
1200     IXMLDOMNode_Release( node );
1201
1202     r = IXMLDOMNode_QueryInterface( root, &IID_IXMLDOMElement, (LPVOID*)&element );
1203     ok( r == S_OK, "returns %08x\n", r );
1204
1205     r = IXMLDOMElement_get_attributes( element, &attr_map );
1206     ok( r == S_OK, "returns %08x\n", r );
1207     r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
1208     ok( r == S_OK, "returns %08x\n", r );
1209     ok( num == 0, "num %ld\n", num );
1210     IXMLDOMNamedNodeMap_Release( attr_map );
1211
1212     V_VT(&var) = VT_BSTR;
1213     V_BSTR(&var) = SysAllocString( szstr1 );
1214     name = SysAllocString( szdl );
1215     r = IXMLDOMElement_setAttribute( element, name, var );
1216     ok( r == S_OK, "returns %08x\n", r );
1217     r = IXMLDOMElement_get_attributes( element, &attr_map );
1218     ok( r == S_OK, "returns %08x\n", r );
1219     r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
1220     ok( r == S_OK, "returns %08x\n", r );
1221     ok( num == 1, "num %ld\n", num );
1222     IXMLDOMNamedNodeMap_Release( attr_map );
1223     VariantClear(&var);
1224
1225     V_VT(&var) = VT_BSTR;
1226     V_BSTR(&var) = SysAllocString( szstr2 );
1227     r = IXMLDOMElement_setAttribute( element, name, var );
1228     ok( r == S_OK, "returns %08x\n", r );
1229     r = IXMLDOMElement_get_attributes( element, &attr_map );
1230     ok( r == S_OK, "returns %08x\n", r );
1231     r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
1232     ok( r == S_OK, "returns %08x\n", r );
1233     ok( num == 1, "num %ld\n", num );
1234     IXMLDOMNamedNodeMap_Release( attr_map );
1235     VariantClear(&var);
1236     r = IXMLDOMElement_getAttribute( element, name, &var );
1237     ok( r == S_OK, "returns %08x\n", r );
1238     ok( !lstrcmpW(V_BSTR(&var), szstr2), "wrong attr value\n");
1239     VariantClear(&var);
1240     SysFreeString(name);
1241
1242     V_VT(&var) = VT_BSTR;
1243     V_BSTR(&var) = SysAllocString( szstr1 );
1244     name = SysAllocString( szlc );
1245     r = IXMLDOMElement_setAttribute( element, name, var );
1246     ok( r == S_OK, "returns %08x\n", r );
1247     r = IXMLDOMElement_get_attributes( element, &attr_map );
1248     ok( r == S_OK, "returns %08x\n", r );
1249     r = IXMLDOMNamedNodeMap_get_length( attr_map, &num );
1250     ok( r == S_OK, "returns %08x\n", r );
1251     ok( num == 2, "num %ld\n", num );
1252     IXMLDOMNamedNodeMap_Release( attr_map );
1253     VariantClear(&var);
1254     SysFreeString(name);
1255
1256     V_VT(&var) = VT_I4;
1257     V_I4(&var) = 10;
1258     name = SysAllocString( szbs );
1259     r = IXMLDOMElement_setAttribute( element, name, var );
1260     ok( r == S_OK, "returns %08x\n", r );
1261     VariantClear(&var);
1262     r = IXMLDOMElement_getAttribute( element, name, &var );
1263     ok( r == S_OK, "returns %08x\n", r );
1264     ok( V_VT(&var) == VT_BSTR, "variant type %x\n", V_VT(&var));
1265     VariantClear(&var);
1266     SysFreeString(name);
1267
1268     IXMLDOMElement_Release( element );
1269     IXMLDOMNode_Release( root );
1270     IXMLDOMDocument_Release( doc );
1271 }
1272
1273 static void test_getElementsByTagName(void)
1274 {
1275     HRESULT r;
1276     BSTR str;
1277     VARIANT_BOOL b;
1278     IXMLDOMDocument *doc;
1279     IXMLDOMNodeList *node_list;
1280     long len;
1281
1282     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1283         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1284     if( r != S_OK )
1285         return;
1286
1287     str = SysAllocString( szComplete4 );
1288     r = IXMLDOMDocument_loadXML( doc, str, &b );
1289     ok( r == S_OK, "loadXML failed\n");
1290     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1291     SysFreeString( str );
1292
1293     str = SysAllocString( szstar );
1294     r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
1295     ok( r == S_OK, "ret %08x\n", r );
1296     r = IXMLDOMNodeList_get_length( node_list, &len );
1297     ok( r == S_OK, "ret %08x\n", r );
1298     ok( len == 6, "len %ld\n", len );
1299     IXMLDOMNodeList_Release( node_list );
1300     SysFreeString( str );
1301
1302     str = SysAllocString( szbs );
1303     r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
1304     ok( r == S_OK, "ret %08x\n", r );
1305     r = IXMLDOMNodeList_get_length( node_list, &len );
1306     ok( r == S_OK, "ret %08x\n", r );
1307     ok( len == 1, "len %ld\n", len );
1308     IXMLDOMNodeList_Release( node_list );
1309     SysFreeString( str );
1310
1311     str = SysAllocString( szdl );
1312     r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
1313     ok( r == S_OK, "ret %08x\n", r );
1314     r = IXMLDOMNodeList_get_length( node_list, &len );
1315     ok( r == S_OK, "ret %08x\n", r );
1316     ok( len == 0, "len %ld\n", len );
1317     IXMLDOMNodeList_Release( node_list );
1318     SysFreeString( str );
1319
1320     str = SysAllocString( szstr1 );
1321     r = IXMLDOMDocument_getElementsByTagName(doc, str, &node_list);
1322     ok( r == S_OK, "ret %08x\n", r );
1323     r = IXMLDOMNodeList_get_length( node_list, &len );
1324     ok( r == S_OK, "ret %08x\n", r );
1325     ok( len == 0, "len %ld\n", len );
1326     IXMLDOMNodeList_Release( node_list );
1327     SysFreeString( str );
1328
1329     IXMLDOMDocument_Release( doc );
1330 }
1331
1332 static void test_get_text(void)
1333 {
1334     HRESULT r;
1335     BSTR str;
1336     VARIANT_BOOL b;
1337     IXMLDOMDocument *doc;
1338     IXMLDOMNode *node, *node2, *node3;
1339     IXMLDOMNodeList *node_list;
1340     IXMLDOMNamedNodeMap *node_map;
1341
1342     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1343         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1344     if( r != S_OK )
1345         return;
1346
1347     str = SysAllocString( szComplete4 );
1348     r = IXMLDOMDocument_loadXML( doc, str, &b );
1349     ok( r == S_OK, "loadXML failed\n");
1350     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1351     SysFreeString( str );
1352
1353     str = SysAllocString( szbs );
1354     r = IXMLDOMDocument_getElementsByTagName( doc, str, &node_list );
1355     ok( r == S_OK, "ret %08x\n", r );
1356     SysFreeString(str);
1357     
1358     r = IXMLDOMNodeList_get_item( node_list, 0, &node );
1359     ok( r == S_OK, "ret %08x\n", r ); 
1360     IXMLDOMNodeList_Release( node_list );
1361
1362     /* Invalid output parameter*/
1363     r = IXMLDOMNode_get_text( node, NULL );
1364     ok( r == E_INVALIDARG, "ret %08x\n", r );
1365
1366     r = IXMLDOMNode_get_text( node, &str );
1367     ok( r == S_OK, "ret %08x\n", r );
1368 todo_wine {
1369     ok( !memcmp(str, szfn1_txt, sizeof(szfn1_txt)), "wrong string\n" );
1370  }
1371     ok( !memcmp(str, szfn1_txt, sizeof(szfn1_txt)-4), "wrong string\n" );
1372     SysFreeString(str);
1373
1374     r = IXMLDOMNode_get_attributes( node, &node_map );
1375     ok( r == S_OK, "ret %08x\n", r );
1376     
1377     str = SysAllocString( szvr );
1378     r = IXMLDOMNamedNodeMap_getNamedItem( node_map, str, &node2 );
1379     ok( r == S_OK, "ret %08x\n", r );
1380     SysFreeString(str);
1381
1382     r = IXMLDOMNode_get_text( node2, &str );
1383     ok( r == S_OK, "ret %08x\n", r );
1384     ok( !memcmp(str, szstr2, sizeof(szstr2)), "wrong string\n" );
1385     SysFreeString(str);
1386
1387     r = IXMLDOMNode_get_firstChild( node2, &node3 );
1388     ok( r == S_OK, "ret %08x\n", r );
1389
1390     r = IXMLDOMNode_get_text( node3, &str );
1391     ok( r == S_OK, "ret %08x\n", r );
1392     ok( !memcmp(str, szstr2, sizeof(szstr2)), "wrong string\n" );
1393     SysFreeString(str);
1394
1395
1396     IXMLDOMNode_Release( node3 );
1397     IXMLDOMNode_Release( node2 );
1398     IXMLDOMNamedNodeMap_Release( node_map );
1399     IXMLDOMNode_Release( node );
1400     IXMLDOMDocument_Release( doc );
1401 }
1402
1403 static void test_get_childNodes(void)
1404 {
1405     HRESULT r;
1406     BSTR str;
1407     VARIANT_BOOL b;
1408     IXMLDOMDocument *doc;
1409     IXMLDOMElement *element;
1410     IXMLDOMNode *node, *node2;
1411     IXMLDOMNodeList *node_list, *node_list2;
1412     long len;
1413
1414     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1415         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1416     if( r != S_OK )
1417         return;
1418
1419     str = SysAllocString( szComplete4 );
1420     r = IXMLDOMDocument_loadXML( doc, str, &b );
1421     ok( r == S_OK, "loadXML failed\n");
1422     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1423     SysFreeString( str );
1424
1425     r = IXMLDOMDocument_get_documentElement( doc, &element );
1426     ok( r == S_OK, "ret %08x\n", r);
1427
1428     r = IXMLDOMElement_get_childNodes( element, &node_list );
1429     ok( r == S_OK, "ret %08x\n", r);
1430
1431     r = IXMLDOMNodeList_get_length( node_list, &len );
1432     ok( r == S_OK, "ret %08x\n", r);
1433     ok( len == 4, "len %ld\n", len);
1434
1435     r = IXMLDOMNodeList_get_item( node_list, 2, &node );
1436     ok( r == S_OK, "ret %08x\n", r);
1437
1438     r = IXMLDOMNode_get_childNodes( node, &node_list2 );
1439     ok( r == S_OK, "ret %08x\n", r);
1440
1441     r = IXMLDOMNodeList_get_length( node_list2, &len );
1442     ok( r == S_OK, "ret %08x\n", r);
1443     ok( len == 0, "len %ld\n", len);
1444
1445     r = IXMLDOMNodeList_get_item( node_list2, 0, &node2);
1446     ok( r == S_FALSE, "ret %08x\n", r);
1447
1448     IXMLDOMNodeList_Release( node_list2 );
1449     IXMLDOMNode_Release( node );
1450     IXMLDOMNodeList_Release( node_list );
1451     IXMLDOMElement_Release( element );
1452     IXMLDOMDocument_Release( doc );
1453 }
1454
1455 static void test_removeChild(void)
1456 {
1457     HRESULT r;
1458     BSTR str;
1459     VARIANT_BOOL b;
1460     IXMLDOMDocument *doc;
1461     IXMLDOMElement *element;
1462     IXMLDOMNode *node, *node2, *node3, *node4;
1463     IXMLDOMNodeList *node_list, *node_list2;
1464
1465     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
1466         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1467     if( r != S_OK )
1468         return;
1469
1470     str = SysAllocString( szComplete4 );
1471     r = IXMLDOMDocument_loadXML( doc, str, &b );
1472     ok( r == S_OK, "loadXML failed\n");
1473     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1474     SysFreeString( str );
1475
1476     r = IXMLDOMDocument_get_documentElement( doc, &element );
1477     ok( r == S_OK, "ret %08x\n", r);
1478
1479     r = IXMLDOMElement_get_childNodes( element, &node_list );
1480     ok( r == S_OK, "ret %08x\n", r);
1481
1482     r = IXMLDOMNodeList_get_item( node_list, 3, &node );
1483     ok( r == S_OK, "ret %08x\n", r);
1484  
1485     r = IXMLDOMNode_get_childNodes( node, &node_list2 );
1486     ok( r == S_OK, "ret %08x\n", r);
1487  
1488     r = IXMLDOMNodeList_get_item( node_list, 0, &node4 );
1489     ok( r == S_OK, "ret %08x\n", r);
1490
1491     r = IXMLDOMElement_removeChild( element, NULL, &node2 );
1492     ok( r == E_INVALIDARG, "ret %08x\n", r );
1493
1494     r = IXMLDOMElement_removeChild( element, node4, &node2 );
1495     ok( r == S_OK, "ret %08x\n", r);
1496     ok( node4 == node2, "node %p node2 %p\n", node4, node2 );
1497
1498     r = IXMLDOMNode_get_parentNode( node4, &node3 );
1499     ok( r == S_FALSE, "ret %08x\n", r);
1500     ok( node3 == NULL, "%p\n", node3 );
1501
1502     IXMLDOMNode_Release( node2 );
1503     IXMLDOMNode_Release( node4 );
1504     IXMLDOMNodeList_Release( node_list2 );
1505     IXMLDOMNode_Release( node );
1506     IXMLDOMNodeList_Release( node_list );
1507     IXMLDOMElement_Release( element );
1508     IXMLDOMDocument_Release( doc );
1509 }
1510
1511 static void test_XMLHTTP(void)
1512 {
1513     static const WCHAR wszBody[] = {'m','o','d','e','=','T','e','s','t',0};
1514     static WCHAR wszPOST[] = {'P','O','S','T',0};
1515     static WCHAR wszUrl[] = {'h','t','t','p',':','/','/',
1516         'c','r','o','s','s','o','v','e','r','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m','/',
1517         'p','o','s','t','t','e','s','t','.','p','h','p',0};
1518     static const WCHAR wszExpectedResponse[] = {'F','A','I','L','E','D',0};
1519     IXMLHttpRequest *pXMLHttpRequest;
1520     BSTR bstrResponse;
1521     VARIANT dummy;
1522     VARIANT varfalse;
1523     VARIANT varbody;
1524     HRESULT hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL,
1525                                   CLSCTX_INPROC_SERVER, &IID_IXMLHttpRequest,
1526                                   (void **)&pXMLHttpRequest);
1527     todo_wine {
1528     ok(hr == S_OK, "CoCreateInstance(CLSID_XMLHTTPRequest) should have succeeded instead of failing with 0x%08x\n", hr);
1529     }
1530     if (hr != S_OK)
1531         return;
1532
1533     VariantInit(&dummy);
1534     V_VT(&dummy) = VT_ERROR;
1535     V_ERROR(&dummy) = DISP_E_MEMBERNOTFOUND;
1536     VariantInit(&varfalse);
1537     V_VT(&varfalse) = VT_BOOL;
1538     V_BOOL(&varfalse) = VARIANT_FALSE;
1539     V_VT(&varbody) = VT_BSTR;
1540     V_BSTR(&varbody) = SysAllocString(wszBody);
1541
1542     hr = IXMLHttpRequest_open(pXMLHttpRequest, wszPOST, wszUrl, varfalse, dummy, dummy);
1543     ok(hr == S_OK, "IXMLHttpRequest_open should have succeeded instead of failing with 0x%08x\n", hr);
1544
1545     hr = IXMLHttpRequest_send(pXMLHttpRequest, varbody);
1546     ok(hr == S_OK, "IXMLHttpRequest_send should have succeeded instead of failing with 0x%08x\n", hr);
1547     VariantClear(&varbody);
1548
1549     hr = IXMLHttpRequest_get_responseText(pXMLHttpRequest, &bstrResponse);
1550     ok(hr == S_OK, "IXMLHttpRequest_get_responseText should have succeeded instead of failing with 0x%08x\n", hr);
1551     /* the server currently returns "FAILED" because the Content-Type header is
1552      * not what the server expects */
1553     ok(!memcmp(bstrResponse, wszExpectedResponse, sizeof(wszExpectedResponse)), "bstrResponse differs from what was expected\n");
1554     SysFreeString(bstrResponse);
1555 }
1556
1557 static void test_IXMLDOMDocument2(void)
1558 {
1559     HRESULT r;
1560     VARIANT_BOOL b;
1561     BSTR str;
1562     IXMLDOMDocument *doc;
1563     IXMLDOMDocument2 *doc2;
1564     VARIANT var;
1565     int ref;
1566
1567     r = CoCreateInstance( &CLSID_DOMDocument, NULL,
1568         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
1569     if( r != S_OK )
1570         return;
1571
1572     str = SysAllocString( szComplete4 );
1573     r = IXMLDOMDocument_loadXML( doc, str, &b );
1574     ok( r == S_OK, "loadXML failed\n");
1575     ok( b == VARIANT_TRUE, "failed to load XML string\n");
1576     SysFreeString( str );
1577
1578     r = IXMLDOMDocument_QueryInterface( doc, &IID_IXMLDOMDocument2, (void**)&doc2 );
1579     ok( r == S_OK, "ret %08x\n", r );
1580     ok( doc == (IXMLDOMDocument*)doc2, "interfaces differ\n");
1581
1582     /* we will check if the variant got cleared */
1583     ref = IXMLDOMDocument2_AddRef(doc2);
1584     expect_eq(ref, 3, int, "%d");  /* doc, doc2, AddRef*/
1585     V_VT(&var) = VT_UNKNOWN;
1586     V_UNKNOWN(&var) = (IUnknown *)doc2;
1587
1588     /* invalid calls */
1589     ole_expect(IXMLDOMDocument2_getProperty(doc2, _bstr_("askldhfaklsdf"), &var), E_FAIL);
1590     expect_eq(V_VT(&var), VT_UNKNOWN, int, "%x");
1591     ole_expect(IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), NULL), E_INVALIDARG);
1592
1593     /* valid call */
1594     ole_check(IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var));
1595     expect_eq(V_VT(&var), VT_BSTR, int, "%x");
1596     expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern");
1597     V_VT(&var) = VT_R4;
1598
1599     /* the variant didn't get cleared*/
1600     expect_eq(IXMLDOMDocument2_Release(doc2), 2, int, "%d");
1601
1602     /* setProperty tests */
1603     ole_expect(IXMLDOMDocument2_setProperty(doc2, _bstr_("askldhfaklsdf"), var), E_FAIL);
1604     ole_expect(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), var), E_FAIL);
1605     ole_expect(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("alskjdh faklsjd hfk")), E_FAIL);
1606     ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern")));
1607     ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath")));
1608     ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XSLPattern")));
1609
1610     /* contrary to what MSDN calims you can switch back from XPath to XSLPattern */
1611     ole_check(IXMLDOMDocument2_getProperty(doc2, _bstr_("SelectionLanguage"), &var));
1612     expect_eq(V_VT(&var), VT_BSTR, int, "%x");
1613     expect_bstr_eq_and_free(V_BSTR(&var), "XSLPattern");
1614
1615     IXMLDOMDocument2_Release( doc2 );
1616     IXMLDOMDocument_Release( doc );
1617     free_bstrs();
1618 }
1619
1620 static void test_XPath(void)
1621 {
1622     HRESULT r;
1623     VARIANT var;
1624     VARIANT_BOOL b;
1625     IXMLDOMDocument2 *doc;
1626     IXMLDOMNode *rootNode;
1627     IXMLDOMNode *elem1Node;
1628     IXMLDOMNode *node;
1629     IXMLDOMNodeList *list;
1630
1631     r = CoCreateInstance( &CLSID_DOMDocument, NULL,
1632         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
1633     if( r != S_OK )
1634         return;
1635
1636     ole_check(IXMLDOMDocument_loadXML(doc, _bstr_(szExampleXML), &b));
1637     ok(b == VARIANT_TRUE, "failed to load XML string\n");
1638
1639     /* switch to XPath */
1640     ole_check(IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionLanguage"), _variantbstr_("XPath")));
1641
1642     /* some simple queries*/
1643     ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("root"), &list));
1644     ole_check(IXMLDOMNodeList_get_item(list, 0, &rootNode));
1645     ole_check(IXMLDOMNodeList_reset(list));
1646     expect_list_and_release(list, "E2.D1");
1647     if (rootNode == NULL)
1648         return;
1649
1650     ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("root//c"), &list));
1651     expect_list_and_release(list, "E3.E1.E2.D1 E3.E2.E2.D1");
1652
1653     ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("//c[@type]"), &list));
1654     expect_list_and_release(list, "E3.E2.E2.D1");
1655
1656     ole_check(IXMLDOMNode_selectNodes(rootNode, _bstr_("elem"), &list));
1657     /* using get_item for query results advances the position */
1658     ole_check(IXMLDOMNodeList_get_item(list, 1, &node));
1659     expect_node(node, "E2.E2.D1");
1660     IXMLDOMNode_Release(node);
1661     ole_check(IXMLDOMNodeList_nextNode(list, &node));
1662     expect_node(node, "E4.E2.D1");
1663     IXMLDOMNode_Release(node);
1664     ole_check(IXMLDOMNodeList_reset(list));
1665     expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E4.E2.D1");
1666
1667     ole_check(IXMLDOMNode_selectNodes(rootNode, _bstr_("."), &list));
1668     expect_list_and_release(list, "E2.D1");
1669
1670     ole_check(IXMLDOMNode_selectNodes(rootNode, _bstr_("elem[3]/preceding-sibling::*"), &list));
1671     ole_check(IXMLDOMNodeList_get_item(list, 0, &elem1Node));
1672     ole_check(IXMLDOMNodeList_reset(list));
1673     expect_list_and_release(list, "E1.E2.D1 E2.E2.D1 E3.E2.D1");
1674
1675     /* select an attribute */
1676     ole_check(IXMLDOMNode_selectNodes(rootNode, _bstr_(".//@type"), &list));
1677     expect_list_and_release(list, "A'type'.E3.E2.E2.D1");
1678
1679     /* would evaluate to a number */
1680     ole_expect(IXMLDOMNode_selectNodes(rootNode, _bstr_("count(*)"), &list), E_FAIL);
1681     /* would evaluate to a boolean */
1682     ole_expect(IXMLDOMNode_selectNodes(rootNode, _bstr_("position()>0"), &list), E_FAIL);
1683     /* would evaluate to a string */
1684     ole_expect(IXMLDOMNode_selectNodes(rootNode, _bstr_("name()"), &list), E_FAIL);
1685
1686     /* no results */
1687     ole_check(IXMLDOMNode_selectNodes(rootNode, _bstr_("c"), &list));
1688     expect_list_and_release(list, "");
1689     ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("elem//c"), &list));
1690     expect_list_and_release(list, "");
1691     ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("//elem[4]"), &list));
1692     expect_list_and_release(list, "");
1693
1694     /* foo undeclared in document node */
1695     ole_expect(IXMLDOMDocument_selectNodes(doc, _bstr_("root//foo:c"), &list), E_FAIL);
1696     /* undeclared in <root> node */
1697     ole_expect(IXMLDOMNode_selectNodes(rootNode, _bstr_(".//foo:c"), &list), E_FAIL);
1698     /* undeclared in <elem> node */
1699     ole_expect(IXMLDOMNode_selectNodes(elem1Node, _bstr_("//foo:c"), &list), E_FAIL);
1700     /* but this trick can be used */
1701     ole_check(IXMLDOMNode_selectNodes(elem1Node, _bstr_("//*[name()='foo:c']"), &list));
1702     expect_list_and_release(list, "E3.E4.E2.D1");
1703
1704     /* it has to be declared in SelectionNamespaces */
1705     todo_wine ole_check(IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
1706         _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29'")));
1707
1708     /* now the namespace can be used */
1709     todo_wine ole_check(IXMLDOMDocument_selectNodes(doc, _bstr_("root//test:c"), &list));
1710     todo_wine expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
1711     todo_wine ole_check(IXMLDOMNode_selectNodes(rootNode, _bstr_(".//test:c"), &list));
1712     todo_wine expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
1713     todo_wine ole_check(IXMLDOMNode_selectNodes(elem1Node, _bstr_("//test:c"), &list));
1714     todo_wine expect_list_and_release(list, "E3.E3.E2.D1 E3.E4.E2.D1");
1715     todo_wine ole_check(IXMLDOMNode_selectNodes(elem1Node, _bstr_(".//test:x"), &list));
1716     todo_wine expect_list_and_release(list, "E5.E1.E4.E1.E2.D1");
1717
1718     /* SelectionNamespaces syntax error - the namespaces doesn't work anymore but the value is stored */
1719     ole_expect(IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
1720         _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###")), E_FAIL);
1721
1722     ole_expect(IXMLDOMDocument_selectNodes(doc, _bstr_("root//foo:c"), &list), E_FAIL);
1723
1724     todo_wine ole_check(IXMLDOMDocument2_getProperty(doc, _bstr_("SelectionNamespaces"), &var));
1725     todo_wine expect_eq(V_VT(&var), VT_BSTR, int, "%x");
1726     if (V_VT(&var) == VT_BSTR)
1727         expect_bstr_eq_and_free(V_BSTR(&var), "xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' xmlns:foo=###");
1728
1729     /* extra attributes - same thing*/
1730     ole_expect(IXMLDOMDocument2_setProperty(doc, _bstr_("SelectionNamespaces"),
1731         _variantbstr_("xmlns:test='urn:uuid:86B2F87F-ACB6-45cd-8B77-9BDB92A01A29' param='test'")), E_FAIL);
1732     ole_expect(IXMLDOMDocument_selectNodes(doc, _bstr_("root//foo:c"), &list), E_FAIL);
1733
1734     IXMLDOMNode_Release(rootNode);
1735     IXMLDOMNode_Release(elem1Node);
1736     IXMLDOMDocument_Release(doc);
1737     free_bstrs();
1738 }
1739
1740 static void test_cloneNode(void )
1741 {
1742     IXMLDOMDocument *doc = NULL;
1743     VARIANT_BOOL b;
1744     IXMLDOMNodeList *pList;
1745     IXMLDOMNamedNodeMap *mapAttr;
1746     long nLength = 0, nLength1 = 0;
1747     long nAttrCnt = 0, nAttrCnt1 = 0;
1748     IXMLDOMNode *node;
1749     IXMLDOMNode *node_clone;
1750     HRESULT r;
1751     BSTR str;
1752     static const WCHAR szSearch[] = { 'l', 'c', '/', 'p', 'r', 0 };
1753
1754     r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
1755     if( r != S_OK )
1756         return;
1757
1758     str = SysAllocString( szComplete4 );
1759     ole_check(IXMLDOMDocument_loadXML(doc, str, &b));
1760     ok(b == VARIANT_TRUE, "failed to load XML string\n");
1761     SysFreeString(str);
1762
1763     if(!b)
1764         return;
1765
1766     str = SysAllocString( szSearch);
1767     r = IXMLDOMNode_selectSingleNode(doc, str, &node);
1768     ok( r == S_OK, "ret %08x\n", r );
1769     ok( node != NULL, "node %p\n", node );
1770     SysFreeString(str);
1771
1772     if(!node)
1773     {
1774         IXMLDOMDocument_Release(doc);
1775         return;
1776     }
1777
1778     /* Check invalid parameter */
1779     r = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, NULL);
1780     ok( r == E_INVALIDARG, "ret %08x\n", r );
1781
1782     /* All Children */
1783     r = IXMLDOMNode_cloneNode(node, VARIANT_TRUE, &node_clone);
1784     ok( r == S_OK, "ret %08x\n", r );
1785     ok( node_clone != NULL, "node %p\n", node );
1786
1787     if(!node_clone)
1788     {
1789         IXMLDOMDocument_Release(doc);
1790         IXMLDOMNode_Release(node);
1791         return;
1792     }
1793
1794     r = IXMLDOMNode_get_childNodes(node, &pList);
1795     ok( r == S_OK, "ret %08x\n", r );
1796     if (pList)
1797         {
1798                 IXMLDOMNodeList_get_length(pList, &nLength);
1799                 IXMLDOMNodeList_Release(pList);
1800         }
1801
1802     r = IXMLDOMNode_get_attributes(node, &mapAttr);
1803     ok( r == S_OK, "ret %08x\n", r );
1804     if(mapAttr)
1805     {
1806         IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt);
1807         IXMLDOMNamedNodeMap_Release(mapAttr);
1808     }
1809
1810     r = IXMLDOMNode_get_childNodes(node_clone, &pList);
1811     ok( r == S_OK, "ret %08x\n", r );
1812     if (pList)
1813         {
1814                 IXMLDOMNodeList_get_length(pList, &nLength1);
1815                 IXMLDOMNodeList_Release(pList);
1816         }
1817
1818     r = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
1819     ok( r == S_OK, "ret %08x\n", r );
1820     if(mapAttr)
1821     {
1822         IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt1);
1823         IXMLDOMNamedNodeMap_Release(mapAttr);
1824     }
1825
1826     ok(nLength == nLength1, "wrong Child count (%ld, %ld)\n", nLength, nLength1);
1827     ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%ld, %ld)\n", nAttrCnt, nAttrCnt1);
1828     IXMLDOMNode_Release(node_clone);
1829
1830     /* No Children */
1831     r = IXMLDOMNode_cloneNode(node, VARIANT_FALSE, &node_clone);
1832     ok( r == S_OK, "ret %08x\n", r );
1833     ok( node_clone != NULL, "node %p\n", node );
1834
1835     if(!node_clone)
1836     {
1837         IXMLDOMDocument_Release(doc);
1838         IXMLDOMNode_Release(node);
1839         return;
1840     }
1841
1842     r = IXMLDOMNode_get_childNodes(node_clone, &pList);
1843     ok( r == S_OK, "ret %08x\n", r );
1844     if (pList)
1845         {
1846                 IXMLDOMNodeList_get_length(pList, &nLength1);
1847         ok( nLength1 == 0, "Length should be 0 (%ld)\n", nLength1);
1848                 IXMLDOMNodeList_Release(pList);
1849         }
1850
1851     r = IXMLDOMNode_get_attributes(node_clone, &mapAttr);
1852     ok( r == S_OK, "ret %08x\n", r );
1853     if(mapAttr)
1854     {
1855         IXMLDOMNamedNodeMap_get_length(mapAttr, &nAttrCnt1);
1856         ok( nAttrCnt1 == 3, "Attribute count should be 3 (%ld)\n", nAttrCnt1);
1857         IXMLDOMNamedNodeMap_Release(mapAttr);
1858     }
1859
1860     ok(nLength != nLength1, "wrong Child count (%ld, %ld)\n", nLength, nLength1);
1861     ok(nAttrCnt == nAttrCnt1, "wrong Attribute count (%ld, %ld)\n", nAttrCnt, nAttrCnt1);
1862     IXMLDOMNode_Release(node_clone);
1863
1864
1865     IXMLDOMNode_Release(node);
1866     IXMLDOMDocument_Release(doc);
1867 }
1868
1869 static void test_xmlTypes(void)
1870 {
1871     IXMLDOMDocument *doc = NULL;
1872     IXMLDOMElement *pRoot;
1873     HRESULT hr;
1874     IXMLDOMComment *pComment;
1875     IXMLDOMElement *pElement;
1876     IXMLDOMAttribute *pAttrubute;
1877     IXMLDOMNamedNodeMap *pAttribs;
1878     IXMLDOMCDATASection *pCDataSec;
1879     IXMLDOMImplementation *pIXMLDOMImplementation = NULL;
1880     IXMLDOMDocumentFragment *pDocFrag = NULL;
1881     IXMLDOMEntityReference *pEntityRef = NULL;
1882     BSTR str;
1883     IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;   /* Used for testing Siblings */
1884     VARIANT v;
1885
1886     hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc );
1887     if( hr != S_OK )
1888         return;
1889
1890     hr = IXMLDOMDocument_get_nextSibling(doc, NULL);
1891     ok(hr == E_INVALIDARG, "ret %08x\n", hr );
1892
1893     hr = IXMLDOMDocument_get_nextSibling(doc, &pNextChild);
1894     ok(hr == S_FALSE, "ret %08x\n", hr );
1895     ok(pNextChild == NULL, "pDocChild not NULL\n");
1896
1897     /* test previous Sibling */
1898     hr = IXMLDOMDocument_get_previousSibling(doc, NULL);
1899     ok(hr == E_INVALIDARG, "ret %08x\n", hr );
1900
1901     pNextChild = (IXMLDOMNode *)0x1;
1902     hr = IXMLDOMDocument_get_previousSibling(doc, &pNextChild);
1903     ok(hr == S_FALSE, "ret %08x\n", hr );
1904     ok(pNextChild == NULL, "pNextChild not NULL\n");
1905
1906     /* test get_attributes */
1907     hr = IXMLDOMDocument_get_attributes( doc, NULL );
1908     ok( hr == E_INVALIDARG, "get_attributes returned wrong code\n");
1909
1910     pAttribs = (IXMLDOMNamedNodeMap*)0x1;
1911     hr = IXMLDOMDocument_get_attributes( doc, &pAttribs);
1912     ok(hr == S_FALSE, "ret %08x\n", hr );
1913     ok( pAttribs == NULL, "pAttribs not NULL\n");
1914
1915     /* test get_dataType */
1916     hr = IXMLDOMDocument_get_dataType(doc, &v);
1917     ok(hr == S_FALSE, "ret %08x\n", hr );
1918     ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
1919     VariantClear(&v);
1920
1921     /* test nodeTypeString */
1922     hr = IXMLDOMDocument_get_nodeTypeString(doc, &str);
1923     ok(hr == S_OK, "ret %08x\n", hr );
1924     ok( !lstrcmpW( str, _bstr_("document") ), "incorrect nodeTypeString string\n");
1925     SysFreeString(str);
1926
1927     /* test implementation */
1928     hr = IXMLDOMDocument_get_implementation(doc, NULL);
1929     ok(hr == E_INVALIDARG, "ret %08x\n", hr );
1930
1931     hr = IXMLDOMDocument_get_implementation(doc, &pIXMLDOMImplementation);
1932     ok(hr == S_OK, "ret %08x\n", hr );
1933     if(hr == S_OK)
1934     {
1935         VARIANT_BOOL hasFeature = VARIANT_TRUE;
1936         BSTR sEmpty = SysAllocStringLen(NULL, 0);
1937
1938         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, NULL, sEmpty, &hasFeature);
1939         ok(hr == E_INVALIDARG, "ret %08x\n", hr );
1940
1941         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, NULL);
1942         ok(hr == E_INVALIDARG, "ret %08x\n", hr );
1943
1944         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
1945         ok(hr == S_OK, "ret %08x\n", hr );
1946         ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
1947
1948         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, sEmpty, sEmpty, &hasFeature);
1949         ok(hr == S_OK, "ret %08x\n", hr );
1950         ok(hasFeature == VARIANT_FALSE, "hasFeature returned true\n");
1951
1952         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), NULL, &hasFeature);
1953         ok(hr == S_OK, "ret %08x\n", hr );
1954         ok(hasFeature == VARIANT_TRUE, "hasFeature returned false\n");
1955
1956         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), sEmpty, &hasFeature);
1957         ok(hr == S_OK, "ret %08x\n", hr );
1958         ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
1959
1960         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("DOM"), _bstr_("1.0"), &hasFeature);
1961         ok(hr == S_OK, "ret %08x\n", hr );
1962         ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
1963
1964         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("XML"), _bstr_("1.0"), &hasFeature);
1965         ok(hr == S_OK, "ret %08x\n", hr );
1966         ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
1967
1968         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("MS-DOM"), _bstr_("1.0"), &hasFeature);
1969         ok(hr == S_OK, "ret %08x\n", hr );
1970         ok(hasFeature == VARIANT_TRUE, "hasFeature returned true\n");
1971
1972         hr = IXMLDOMImplementation_hasFeature(pIXMLDOMImplementation, _bstr_("SSS"), NULL, &hasFeature);
1973         ok(hr == S_OK, "ret %08x\n", hr );
1974         ok(hasFeature == VARIANT_FALSE, "hasFeature returned false\n");
1975
1976         SysFreeString(sEmpty);
1977         IXMLDOMImplementation_Release(pIXMLDOMImplementation);
1978     }
1979
1980
1981
1982     hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
1983     ok(hr == S_OK, "ret %08x\n", hr );
1984     if(hr == S_OK)
1985     {
1986         hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)pRoot, NULL);
1987         ok(hr == S_OK, "ret %08x\n", hr );
1988         if(hr == S_OK)
1989         {
1990             /* Comment */
1991             hr = IXMLDOMDocument_createComment(doc, szComment, &pComment);
1992             ok(hr == S_OK, "ret %08x\n", hr );
1993             if(hr == S_OK)
1994             {
1995                 /* test get_attributes */
1996                 hr = IXMLDOMComment_get_attributes( pComment, NULL );
1997                 ok( hr == E_INVALIDARG, "get_attributes returned wrong code\n");
1998
1999                 pAttribs = (IXMLDOMNamedNodeMap*)0x1;
2000                 hr = IXMLDOMComment_get_attributes( pComment, &pAttribs);
2001                 ok(hr == S_FALSE, "ret %08x\n", hr );
2002                 ok( pAttribs == NULL, "pAttribs not NULL\n");
2003
2004                 /* test nodeTypeString */
2005                 hr = IXMLDOMComment_get_nodeTypeString(pComment, &str);
2006                 ok(hr == S_OK, "ret %08x\n", hr );
2007                 ok( !lstrcmpW( str, _bstr_("comment") ), "incorrect nodeTypeString string\n");
2008                 SysFreeString(str);
2009
2010                 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pComment, NULL);
2011                 ok(hr == S_OK, "ret %08x\n", hr );
2012
2013                 hr = IXMLDOMComment_get_nodeName(pComment, &str);
2014                 ok(hr == S_OK, "ret %08x\n", hr );
2015                 ok( !lstrcmpW( str, szCommentNodeText ), "incorrect comment node Name\n");
2016                 SysFreeString(str);
2017
2018                 hr = IXMLDOMComment_get_xml(pComment, &str);
2019                 ok(hr == S_OK, "ret %08x\n", hr );
2020                 ok( !lstrcmpW( str, szCommentXML ), "incorrect comment xml\n");
2021                 SysFreeString(str);
2022
2023                 hr = IXMLDOMComment_get_dataType(pComment, &v);
2024                 ok(hr == S_FALSE, "ret %08x\n", hr );
2025                 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
2026                 VariantClear(&v);
2027
2028                 IXMLDOMComment_Release(pComment);
2029             }
2030
2031             /* Element */
2032             hr = IXMLDOMDocument_createElement(doc, szElement, &pElement);
2033             ok(hr == S_OK, "ret %08x\n", hr );
2034             if(hr == S_OK)
2035             {
2036                 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pElement, NULL);
2037                 ok(hr == S_OK, "ret %08x\n", hr );
2038
2039                 /* test nodeTypeString */
2040                 hr = IXMLDOMDocument_get_nodeTypeString(pElement, &str);
2041                 ok(hr == S_OK, "ret %08x\n", hr );
2042                 ok( !lstrcmpW( str, _bstr_("element") ), "incorrect nodeTypeString string\n");
2043                 SysFreeString(str);
2044
2045                 hr = IXMLDOMElement_get_nodeName(pElement, &str);
2046                 ok(hr == S_OK, "ret %08x\n", hr );
2047                 ok( !lstrcmpW( str, szElement ), "incorrect element node Name\n");
2048                 SysFreeString(str);
2049
2050                 hr = IXMLDOMElement_get_xml(pElement, &str);
2051                 ok(hr == S_OK, "ret %08x\n", hr );
2052                 ok( !lstrcmpW( str, szElementXML ), "incorrect element xml\n");
2053                 SysFreeString(str);
2054
2055                 hr = IXMLDOMElement_get_dataType(pElement, &v);
2056                 ok(hr == S_FALSE, "ret %08x\n", hr );
2057                 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
2058                 VariantClear(&v);
2059
2060                  /* Attribute */
2061                 hr = IXMLDOMDocument_createAttribute(doc, szAttribute, &pAttrubute);
2062                 ok(hr == S_OK, "ret %08x\n", hr );
2063                 if(hr == S_OK)
2064                 {
2065                     IXMLDOMNode *pNewChild = (IXMLDOMNode *)0x1;
2066
2067                     hr = IXMLDOMAttribute_get_nextSibling(pAttrubute, NULL);
2068                     ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2069
2070                     pNextChild = (IXMLDOMNode *)0x1;
2071                     hr = IXMLDOMAttribute_get_nextSibling(pAttrubute, &pNextChild);
2072                     ok(hr == S_FALSE, "ret %08x\n", hr );
2073                     ok(pNextChild == NULL, "pNextChild not NULL\n");
2074
2075                     /* test Previous Sibling*/
2076                     hr = IXMLDOMAttribute_get_previousSibling(pAttrubute, NULL);
2077                     ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2078
2079                     pNextChild = (IXMLDOMNode *)0x1;
2080                     hr = IXMLDOMAttribute_get_previousSibling(pAttrubute, &pNextChild);
2081                     ok(hr == S_FALSE, "ret %08x\n", hr );
2082                     ok(pNextChild == NULL, "pNextChild not NULL\n");
2083
2084                     /* test get_attributes */
2085                     hr = IXMLDOMAttribute_get_attributes( pAttrubute, NULL );
2086                     ok( hr == E_INVALIDARG, "get_attributes returned wrong code\n");
2087
2088                     pAttribs = (IXMLDOMNamedNodeMap*)0x1;
2089                     hr = IXMLDOMAttribute_get_attributes( pAttrubute, &pAttribs);
2090                     ok(hr == S_FALSE, "ret %08x\n", hr );
2091                     ok( pAttribs == NULL, "pAttribs not NULL\n");
2092
2093                     hr = IXMLDOMElement_appendChild(pElement, (IXMLDOMNode*)pAttrubute, &pNewChild);
2094                     ok(hr == E_FAIL, "ret %08x\n", hr );
2095                     ok(pNewChild == NULL, "pNewChild not NULL\n");
2096
2097                     hr = IXMLDOMElement_get_attributes(pElement, &pAttribs);
2098                     ok(hr == S_OK, "ret %08x\n", hr );
2099                     if ( hr == S_OK )
2100                     {
2101                         hr = IXMLDOMNamedNodeMap_setNamedItem(pAttribs, (IXMLDOMNode*)pAttrubute, NULL );
2102                         ok(hr == S_OK, "ret %08x\n", hr );
2103
2104                         IXMLDOMNamedNodeMap_Release(pAttribs);
2105                     }
2106
2107                     hr = IXMLDOMAttribute_get_nodeName(pAttrubute, &str);
2108                     ok(hr == S_OK, "ret %08x\n", hr );
2109                     ok( !lstrcmpW( str, szAttribute ), "incorrect attribute node Name\n");
2110                     SysFreeString(str);
2111
2112                     /* test nodeTypeString */
2113                     hr = IXMLDOMAttribute_get_nodeTypeString(pAttrubute, &str);
2114                     ok(hr == S_OK, "ret %08x\n", hr );
2115                     ok( !lstrcmpW( str, _bstr_("attribute") ), "incorrect nodeTypeString string\n");
2116                     SysFreeString(str);
2117
2118                     hr = IXMLDOMAttribute_get_xml(pAttrubute, &str);
2119                     ok(hr == S_OK, "ret %08x\n", hr );
2120                     ok( !lstrcmpW( str, szAttributeXML ), "incorrect attribute xml\n");
2121                     SysFreeString(str);
2122
2123                     hr = IXMLDOMAttribute_get_dataType(pAttrubute, &v);
2124                     ok(hr == S_FALSE, "ret %08x\n", hr );
2125                     ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
2126                     VariantClear(&v);
2127
2128                     IXMLDOMAttribute_Release(pAttrubute);
2129
2130                     /* Check Element again with the Add Attribute*/
2131                     hr = IXMLDOMElement_get_xml(pElement, &str);
2132                     ok(hr == S_OK, "ret %08x\n", hr );
2133                     ok( !lstrcmpW( str, szElementXML2 ), "incorrect element xml\n");
2134                     SysFreeString(str);
2135                 }
2136
2137                 hr = IXMLDOMElement_put_text(pElement, _bstr_("TestingNode"));
2138                 ok(hr == S_OK, "ret %08x\n", hr );
2139
2140                 hr = IXMLDOMElement_get_xml(pElement, &str);
2141                 ok(hr == S_OK, "ret %08x\n", hr );
2142                 ok( !lstrcmpW( str, szElementXML3 ), "incorrect element xml\n");
2143
2144                 IXMLDOMElement_Release(pElement);
2145             }
2146
2147             /* CData Section */
2148             hr = IXMLDOMDocument_createCDATASection(doc, szCData, NULL);
2149             ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2150
2151             hr = IXMLDOMDocument_createCDATASection(doc, szCData, &pCDataSec);
2152             ok(hr == S_OK, "ret %08x\n", hr );
2153             if(hr == S_OK)
2154             {
2155                 IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;
2156
2157                 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pCDataSec, NULL);
2158                 ok(hr == S_OK, "ret %08x\n", hr );
2159
2160                 /* get Attribute Tests */
2161                 hr = IXMLDOMCDATASection_get_attributes(pCDataSec, NULL);
2162                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2163
2164                 pAttribs = (IXMLDOMNamedNodeMap*)0x1;
2165                 hr = IXMLDOMCDATASection_get_attributes(pCDataSec, &pAttribs);
2166                 ok(hr == S_FALSE, "ret %08x\n", hr );
2167                 ok(pAttribs == NULL, "pAttribs != NULL\n");
2168
2169                 hr = IXMLDOMCDATASection_get_nodeName(pCDataSec, &str);
2170                 ok(hr == S_OK, "ret %08x\n", hr );
2171                 ok( !lstrcmpW( str, szCDataNodeText ), "incorrect cdata node Name\n");
2172                 SysFreeString(str);
2173
2174                 hr = IXMLDOMCDATASection_get_xml(pCDataSec, &str);
2175                 ok(hr == S_OK, "ret %08x\n", hr );
2176                 ok( !lstrcmpW( str, szCDataXML ), "incorrect cdata xml\n");
2177                 SysFreeString(str);
2178
2179                 /* test lastChild */
2180                 pNextChild = (IXMLDOMNode*)0x1;
2181                 hr = IXMLDOMCDATASection_get_lastChild(pCDataSec, &pNextChild);
2182                 ok(hr == S_FALSE, "ret %08x\n", hr );
2183                 ok(pNextChild == NULL, "pNextChild not NULL\n");
2184
2185                 /* test get_dataType */
2186                 hr = IXMLDOMCDATASection_get_dataType(pCDataSec, NULL);
2187                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2188
2189                 hr = IXMLDOMCDATASection_get_dataType(pCDataSec, &v);
2190                 ok(hr == S_FALSE, "ret %08x\n", hr );
2191                 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
2192                 VariantClear(&v);
2193
2194                 /* test nodeTypeString */
2195                 hr = IXMLDOMCDATASection_get_nodeTypeString(pCDataSec, &str);
2196                 ok(hr == S_OK, "ret %08x\n", hr );
2197                 ok( !lstrcmpW( str, _bstr_("cdatasection") ), "incorrect nodeTypeString string\n");
2198                 SysFreeString(str);
2199
2200                 IXMLDOMCDATASection_Release(pCDataSec);
2201             }
2202
2203             /* Document Fragments */
2204             hr = IXMLDOMDocument_createDocumentFragment(doc, NULL);
2205             ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2206
2207             hr = IXMLDOMDocument_createDocumentFragment(doc, &pDocFrag);
2208             ok(hr == S_OK, "ret %08x\n", hr );
2209             if(hr == S_OK)
2210             {
2211                 IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;
2212
2213                 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pDocFrag, NULL);
2214                 ok(hr == S_OK, "ret %08x\n", hr );
2215
2216                 /* get Attribute Tests */
2217                 hr = IXMLDOMDocumentFragment_get_attributes(pDocFrag, NULL);
2218                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2219
2220                 pAttribs = (IXMLDOMNamedNodeMap*)0x1;
2221                 hr = IXMLDOMDocumentFragment_get_attributes(pDocFrag, &pAttribs);
2222                 ok(hr == S_FALSE, "ret %08x\n", hr );
2223                 ok(pAttribs == NULL, "pAttribs != NULL\n");
2224
2225                 hr = IXMLDOMDocumentFragment_get_nodeName(pDocFrag, &str);
2226                 ok(hr == S_OK, "ret %08x\n", hr );
2227                 ok( !lstrcmpW( str, szDocFragmentText ), "incorrect docfragment node Name\n");
2228                 SysFreeString(str);
2229
2230                 /* test next Sibling*/
2231                 hr = IXMLDOMDocumentFragment_get_nextSibling(pDocFrag, NULL);
2232                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2233
2234                 pNextChild = (IXMLDOMNode *)0x1;
2235                 hr = IXMLDOMDocumentFragment_get_nextSibling(pDocFrag, &pNextChild);
2236                 ok(hr == S_FALSE, "ret %08x\n", hr );
2237                 ok(pNextChild == NULL, "pNextChild not NULL\n");
2238
2239                 /* test Previous Sibling*/
2240                 hr = IXMLDOMDocumentFragment_get_previousSibling(pDocFrag, NULL);
2241                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2242
2243                 pNextChild = (IXMLDOMNode *)0x1;
2244                 hr = IXMLDOMDocumentFragment_get_previousSibling(pDocFrag, &pNextChild);
2245                 ok(hr == S_FALSE, "ret %08x\n", hr );
2246                 ok(pNextChild == NULL, "pNextChild not NULL\n");
2247
2248                 /* test get_dataType */
2249                 hr = IXMLDOMDocumentFragment_get_dataType(pDocFrag, NULL);
2250                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2251
2252                 hr = IXMLDOMDocumentFragment_get_dataType(pDocFrag, &v);
2253                 ok(hr == S_FALSE, "ret %08x\n", hr );
2254                 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
2255                 VariantClear(&v);
2256
2257                 /* test nodeTypeString */
2258                 hr = IXMLDOMDocumentFragment_get_nodeTypeString(pDocFrag, &str);
2259                 ok(hr == S_OK, "ret %08x\n", hr );
2260                 ok( !lstrcmpW( str, _bstr_("documentfragment") ), "incorrect nodeTypeString string\n");
2261                 SysFreeString(str);
2262
2263                 IXMLDOMDocumentFragment_Release(pCDataSec);
2264             }
2265
2266             /* Entity References */
2267             hr = IXMLDOMDocument_createEntityReference(doc, szEntityRef, NULL);
2268             ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2269
2270             hr = IXMLDOMDocument_createEntityReference(doc, szEntityRef, &pEntityRef);
2271             ok(hr == S_OK, "ret %08x\n", hr );
2272             if(hr == S_OK)
2273             {
2274                 hr = IXMLDOMElement_appendChild(pRoot, (IXMLDOMNode*)pEntityRef, NULL);
2275                 ok(hr == S_OK, "ret %08x\n", hr );
2276
2277                 /* get Attribute Tests */
2278                 hr = IXMLDOMEntityReference_get_attributes(pEntityRef, NULL);
2279                 ok(hr == E_INVALIDARG, "ret %08x\n", hr );
2280
2281                 pAttribs = (IXMLDOMNamedNodeMap*)0x1;
2282                 hr = IXMLDOMEntityReference_get_attributes(pEntityRef, &pAttribs);
2283                 ok(hr == S_FALSE, "ret %08x\n", hr );
2284                 ok(pAttribs == NULL, "pAttribs != NULL\n");
2285
2286                 /* test dataType */
2287                 hr = IXMLDOMEntityReference_get_dataType(pEntityRef, &v);
2288                 ok(hr == S_FALSE, "ret %08x\n", hr );
2289                 ok( V_VT(&v) == VT_NULL, "incorrect dataType type\n");
2290                 VariantClear(&v);
2291
2292                 /* test nodeTypeString */
2293                 hr = IXMLDOMEntityReference_get_nodeTypeString(pEntityRef, &str);
2294                 ok(hr == S_OK, "ret %08x\n", hr );
2295                 ok( !lstrcmpW( str, _bstr_("entityreference") ), "incorrect nodeTypeString string\n");
2296                 SysFreeString(str);
2297
2298                 /* test get_xml*/
2299                 hr = IXMLDOMEntityReference_get_xml(pEntityRef, &str);
2300                 ok(hr == S_OK, "ret %08x\n", hr );
2301                 todo_wine ok( !lstrcmpW( str, szEntityRefXML ), "incorrect xml string\n");
2302                 SysFreeString(str);
2303
2304                 IXMLDOMEntityReference_Release(pEntityRef);
2305             }
2306
2307             IXMLDOMElement_Release( pRoot );
2308         }
2309     }
2310
2311     IXMLDOMDocument_Release(doc);
2312
2313     free_bstrs();
2314 }
2315
2316 START_TEST(domdoc)
2317 {
2318     HRESULT r;
2319
2320     r = CoInitialize( NULL );
2321     ok( r == S_OK, "failed to init com\n");
2322
2323     test_domdoc();
2324     test_domnode();
2325     test_refs();
2326     test_create();
2327     test_getElementsByTagName();
2328     test_get_text();
2329     test_get_childNodes();
2330     test_removeChild();
2331     test_XMLHTTP();
2332     test_IXMLDOMDocument2();
2333     test_XPath();
2334     test_cloneNode();
2335     test_xmlTypes();
2336
2337     CoUninitialize();
2338 }