EnumThemeColors() and EnumThemeSizes() actually do not return a single
[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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21
22 #define COBJMACROS
23
24 #include "windows.h"
25 #include "ole2.h"
26 #include "msxml.h"
27 #include "xmldom.h"
28 #include <stdio.h>
29
30 #include "wine/test.h"
31
32 static const WCHAR szEmpty[] = { 0 };
33 static const WCHAR szIncomplete[] = {
34     '<','?','x','m','l',' ',
35     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
36 };
37 static const WCHAR szComplete1[] = {
38     '<','?','x','m','l',' ',
39     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
40     '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
41 };
42 static const WCHAR szComplete2[] = {
43     '<','?','x','m','l',' ',
44     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
45     '<','o','>','<','/','o','>','\n',0
46 };
47 static const WCHAR szComplete3[] = {
48     '<','?','x','m','l',' ',
49     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
50     '<','a','>','<','/','a','>','\n',0
51 };
52 static const WCHAR szComplete4[] = {
53     '<','?','x','m','l',' ',
54     'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>',
55     '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>',
56     '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ',
57     's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>',
58     '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ',
59     'v','r','=','\'','1','.','2','.','3','\'',' ',
60     'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>',
61     'f','n','2','.','t','x','t','<','/','p','r','>',
62     '<','/','l','c','>','\n',0
63 };
64 static const WCHAR szOpen[] = { 'o','p','e','n',0 };
65 static const WCHAR szdl[] = { 'd','l',0 };
66 static const WCHAR szlc[] = { 'l','c',0 };
67 static const WCHAR szbs[] = { 'b','s',0 };
68
69 const GUID CLSID_DOMDocument = 
70     { 0x2933BF90, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
71 const GUID IID_IXMLDOMDocument = 
72     { 0x2933BF81, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
73
74 void test_domdoc( void )
75 {
76     HRESULT r;
77     IXMLDOMDocument *doc = NULL;
78     IXMLDOMElement *element = NULL;
79     VARIANT_BOOL b;
80     BSTR str;
81
82     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
83         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
84     if( r != S_OK )
85         return;
86
87     /* try some stupid things */
88     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
89     ok( r == S_FALSE, "loadXML failed\n");
90
91     b = VARIANT_TRUE;
92     r = IXMLDOMDocument_loadXML( doc, NULL, &b );
93     ok( r == S_FALSE, "loadXML failed\n");
94     ok( b == VARIANT_FALSE, "failed to load XML string\n");
95
96     /* try load an empty document */
97     b = VARIANT_TRUE;
98     str = SysAllocString( szEmpty );
99     r = IXMLDOMDocument_loadXML( doc, str, &b );
100     ok( r == S_FALSE, "loadXML failed\n");
101     ok( b == VARIANT_FALSE, "failed to load XML string\n");
102     SysFreeString( str );
103
104     /* check that there's no document element */
105     element = NULL;
106     r = IXMLDOMDocument_get_documentElement( doc, &element );
107     ok( r == S_FALSE, "should be no document element\n");
108
109     b = VARIANT_TRUE;
110     str = SysAllocString( szIncomplete );
111     r = IXMLDOMDocument_loadXML( doc, str, &b );
112     ok( r == S_FALSE, "loadXML failed\n");
113     ok( b == VARIANT_FALSE, "failed to load XML string\n");
114     SysFreeString( str );
115
116     /* check that there's no document element */
117     element = (IXMLDOMElement*)1;
118     r = IXMLDOMDocument_get_documentElement( doc, &element );
119     ok( r == S_FALSE, "should be no document element\n");
120     ok( element == NULL, "Element should be NULL\n");
121
122     /* try to load something valid */
123     b = VARIANT_FALSE;
124     str = SysAllocString( szComplete1 );
125     r = IXMLDOMDocument_loadXML( doc, str, &b );
126     ok( r == S_OK, "loadXML failed\n");
127     ok( b == VARIANT_TRUE, "failed to load XML string\n");
128     SysFreeString( str );
129
130     /* try with a null out pointer - crashes */
131     if (0)
132     {
133         r = IXMLDOMDocument_get_documentElement( doc, NULL );
134         ok( r == S_OK, "should be no document element\n");
135     }
136
137     /* check that there's no document element */
138     element = NULL;
139     r = IXMLDOMDocument_get_documentElement( doc, &element );
140     ok( r == S_OK, "should be a document element\n");
141     if( element )
142     {
143         BSTR tag = NULL;
144
145         /* check if the tag is correct */
146         r = IXMLDOMElement_get_tagName( element, &tag );
147         ok( r == S_OK, "couldn't get tag name\n");
148         ok( tag != NULL, "tag was null\n");
149         ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
150         SysFreeString( tag );
151
152         /* figure out what happens if we try to reload the document */
153         str = SysAllocString( szComplete2 );
154         r = IXMLDOMDocument_loadXML( doc, str, &b );
155         ok( r == S_OK, "loadXML failed\n");
156         ok( b == VARIANT_TRUE, "failed to load XML string\n");
157         SysFreeString( str );
158
159         /* check if the tag is still correct */
160         tag = NULL;
161         r = IXMLDOMElement_get_tagName( element, &tag );
162         ok( r == S_OK, "couldn't get tag name\n");
163         ok( tag != NULL, "tag was null\n");
164         ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
165         SysFreeString( tag );
166
167         IXMLDOMElement_Release( element );
168         element = NULL;
169     }
170
171     /* as soon as we call loadXML again, the document element will disappear */
172     b = 2;
173     r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
174     ok( r == S_FALSE, "loadXML failed\n");
175     ok( b == 2, "variant modified\n");
176     r = IXMLDOMDocument_get_documentElement( doc, &element );
177     ok( r == S_FALSE, "should be no document element\n");
178
179     /* try to load something else simple and valid */
180     b = VARIANT_FALSE;
181     str = SysAllocString( szComplete3 );
182     r = IXMLDOMDocument_loadXML( doc, str, &b );
183     ok( r == S_OK, "loadXML failed\n");
184     ok( b == VARIANT_TRUE, "failed to load XML string\n");
185     SysFreeString( str );
186
187     /* try something a little more complicated */
188     b = FALSE;
189     str = SysAllocString( szComplete4 );
190     r = IXMLDOMDocument_loadXML( doc, str, &b );
191     ok( r == S_OK, "loadXML failed\n");
192     ok( b == VARIANT_TRUE, "failed to load XML string\n");
193     SysFreeString( str );
194
195     r = IXMLDocument_Release( doc );
196     ok( r == 0, "document ref count incorrect\n");
197
198 }
199
200 void test_domnode( void )
201 {
202     HRESULT r;
203     IXMLDOMDocument *doc = NULL, *owner = NULL;
204     IXMLDOMElement *element = NULL;
205     IXMLDOMNamedNodeMap *map = NULL;
206     IXMLDOMNode *node = NULL, *next = NULL;
207     IXMLDOMNodeList *list = NULL;
208     DOMNodeType type = NODE_INVALID;
209     VARIANT_BOOL b;
210     BSTR str;
211     VARIANT var;
212
213     r = CoCreateInstance( &CLSID_DOMDocument, NULL, 
214         CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
215     if( r != S_OK )
216         return;
217
218     b = FALSE;
219     str = SysAllocString( szComplete4 );
220     r = IXMLDOMDocument_loadXML( doc, str, &b );
221     ok( r == S_OK, "loadXML failed\n");
222     ok( b == VARIANT_TRUE, "failed to load XML string\n");
223     SysFreeString( str );
224
225     if (doc)
226     {
227         b = 1;
228         r = IXMLDOMNode_hasChildNodes( doc, &b );
229         ok( r == S_OK, "hasChildNoes bad return\n");
230         ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
231
232         r = IXMLDOMDocument_get_documentElement( doc, &element );
233         ok( r == S_OK, "should be a document element\n");
234         ok( element != NULL, "should be an element\n");
235     }
236     else
237         ok( FALSE, "no document\n");
238
239     VariantInit(&var);
240     ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
241     r = IXMLDOMNode_get_nodeValue( doc, &var );
242     ok( r == S_FALSE, "nextNode returned wrong code\n");
243     ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
244     ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
245
246     if (element)
247     {
248         owner = NULL;
249         r = IXMLDOMNode_get_ownerDocument( element, &owner );
250         todo_wine {
251         ok( r == S_OK, "get_ownerDocument return code\n");
252         }
253         ok( owner != doc, "get_ownerDocument return\n");
254
255         type = NODE_INVALID;
256         r = IXMLDOMNode_get_nodeType( element, &type);
257         ok( r == S_OK, "getNamedItem returned wrong code\n");
258         ok( type == NODE_ELEMENT, "node not an element\n");
259
260         str = NULL;
261         r = IXMLDOMNode_get_baseName( element, &str );
262         ok( r == S_OK, "get_baseName returned wrong code\n");
263         ok( lstrcmpW(str,szlc) == 0, "basename was wrong\n");
264
265         r = IXMLDOMElement_get_attributes( element, &map );
266         ok( r == S_OK, "get_attributes returned wrong code\n");
267         ok( map != NULL, "should be attributes\n");
268
269         b = 1;
270         r = IXMLDOMNode_hasChildNodes( element, &b );
271         ok( r == S_OK, "hasChildNoes bad return\n");
272         ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
273     }
274     else
275         ok( FALSE, "no element\n");
276
277     if (map)
278     {
279         str = SysAllocString( szdl );
280         r = IXMLDOMNamedNodeMap_getNamedItem( map, str, &node );
281         ok( r == S_OK, "getNamedItem returned wrong code\n");
282         ok( node != NULL, "should be attributes\n");
283     }
284     else
285         ok( FALSE, "no map\n");
286
287     if (node)
288     {
289         type = NODE_INVALID;
290         r = IXMLDOMNode_get_nodeType( node, &type);
291         ok( r == S_OK, "getNamedItem returned wrong code\n");
292         ok( type == NODE_ATTRIBUTE, "node not an attribute\n");
293
294         str = NULL;
295         r = IXMLDOMNode_get_baseName( node, NULL );
296         ok( r == E_INVALIDARG, "get_baseName returned wrong code\n");
297
298         str = NULL;
299         r = IXMLDOMNode_get_baseName( node, &str );
300         ok( r == S_OK, "get_baseName returned wrong code\n");
301         ok( lstrcmpW(str,szdl) == 0, "basename was wrong\n");
302
303         r = IXMLDOMNode_get_childNodes( node, NULL );
304         ok( r == E_INVALIDARG, "get_childNodes returned wrong code\n");
305
306         r = IXMLDOMNode_get_childNodes( node, &list );
307         ok( r == S_OK, "get_childNodes returned wrong code\n");
308
309         if (list)
310         {
311             r = IXMLDOMNodeList_nextNode( list, &next );
312             ok( r == S_OK, "nextNode returned wrong code\n");
313         }
314         else
315             ok( FALSE, "no childlist\n");
316
317         if (next)
318         {
319             b = 1;
320             r = IXMLDOMNode_hasChildNodes( next, &b );
321             ok( r == S_FALSE, "hasChildNoes bad return\n");
322             ok( b == VARIANT_FALSE, "hasChildNoes wrong result\n");
323
324             type = NODE_INVALID;
325             r = IXMLDOMNode_get_nodeType( next, &type);
326             ok( r == S_OK, "getNamedItem returned wrong code\n");
327             ok( type == NODE_TEXT, "node not text\n");
328
329             str = (BSTR) 1;
330             r = IXMLDOMNode_get_baseName( next, &str );
331             ok( r == S_FALSE, "get_baseName returned wrong code\n");
332             ok( str == NULL, "basename was wrong\n");
333         }
334         else
335             ok( FALSE, "no next\n");
336
337         if (next)
338             IXMLDOMNode_Release( next );
339         next = NULL;
340         if (list)
341             IXMLDOMNodeList_Release( list );
342         list = NULL;
343         if (node)
344             IXMLDOMNode_Release( node );
345     }
346     else
347         ok( FALSE, "no node\n");
348     node = NULL;
349
350     if (map)
351         IXMLDOMNamedNodeMap_Release( map );
352
353     /* now traverse the tree from the root node */
354     if (element)
355     {
356         r = IXMLDOMNode_get_childNodes( element, &list );
357         ok( r == S_OK, "get_childNodes returned wrong code\n");
358     }
359     else
360         ok( FALSE, "no element\n");
361
362     if (list)
363     {
364         r = IXMLDOMNodeList_nextNode( list, &node );
365         ok( r == S_OK, "nextNode returned wrong code\n");
366     }
367     else
368         ok( FALSE, "no list\n");
369
370     if (node)
371     {
372         type = NODE_INVALID;
373         r = IXMLDOMNode_get_nodeType( node, &type);
374         ok( r == S_OK, "getNamedItem returned wrong code\n");
375         ok( type == NODE_ELEMENT, "node not text\n");
376
377         VariantInit(&var);
378         ok( V_VT(&var) == VT_EMPTY, "variant init failed\n");
379         r = IXMLDOMNode_get_nodeValue( node, &var );
380         ok( r == S_FALSE, "nextNode returned wrong code\n");
381         ok( V_VT(&var) == VT_NULL, "variant wasn't empty\n");
382         ok( V_BSTR(&var) == NULL, "variant value wasn't null\n");
383
384         r = IXMLDOMNode_hasChildNodes( node, NULL );
385         ok( r == E_INVALIDARG, "hasChildNoes bad return\n");
386
387         b = 1;
388         r = IXMLDOMNode_hasChildNodes( node, &b );
389         ok( r == S_OK, "hasChildNoes bad return\n");
390         ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
391
392         str = NULL;
393         r = IXMLDOMNode_get_baseName( node, &str );
394         ok( r == S_OK, "get_baseName returned wrong code\n");
395         ok( lstrcmpW(str,szbs) == 0, "basename was wrong\n");
396     }
397     else
398         ok( FALSE, "no node\n");
399
400     if (node)
401         IXMLDOMNode_Release( node );
402     if (list)
403         IXMLDOMNodeList_Release( list );
404     if (element)
405         IXMLDOMElement_Release( element );
406     if (doc)
407         IXMLDocument_Release( doc );
408 }
409
410 START_TEST(domdoc)
411 {
412     HRESULT r;
413
414     r = CoInitialize( NULL );
415     ok( r == S_OK, "failed to init com\n");
416
417     test_domdoc();
418     test_domnode();
419
420     CoUninitialize();
421 }