4 * Copyright 2005 Mike McCormack for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "wine/test.h"
32 static const WCHAR szEmpty[] = { 0 };
33 static const WCHAR szIncomplete[] = {
34 '<','?','x','m','l',' ',
35 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
37 static const WCHAR szComplete1[] = {
38 '<','?','x','m','l',' ',
39 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
40 '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
42 static const WCHAR szComplete2[] = {
43 '<','?','x','m','l',' ',
44 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
45 '<','o','>','<','/','o','>','\n',0
47 static const WCHAR szComplete3[] = {
48 '<','?','x','m','l',' ',
49 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
50 '<','a','>','<','/','a','>','\n',0
52 static const WCHAR szComplete4[] = {
53 '<','?','x','m','l',' ',
54 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>',
55 '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>',
56 '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ',
57 's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>',
58 '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ',
59 'v','r','=','\'','1','.','2','.','3','\'',' ',
60 'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>',
61 'f','n','2','.','t','x','t','<','/','p','r','>',
62 '<','/','l','c','>','\n',0
64 static const WCHAR 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 };
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}};
74 void test_domdoc( void )
77 IXMLDOMDocument *doc = NULL;
78 IXMLDOMElement *element = NULL;
82 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
83 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
87 /* try some stupid things */
88 r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
89 ok( r == S_FALSE, "loadXML failed\n");
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");
96 /* try load an empty document */
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 );
104 /* check that there's no document element */
106 r = IXMLDOMDocument_get_documentElement( doc, &element );
107 ok( r == S_FALSE, "should be no document element\n");
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 );
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");
122 /* try to load something valid */
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 );
130 /* try with a null out pointer - crashes */
133 r = IXMLDOMDocument_get_documentElement( doc, NULL );
134 ok( r == S_OK, "should be no document element\n");
137 /* check that there's no document element */
139 r = IXMLDOMDocument_get_documentElement( doc, &element );
140 ok( r == S_OK, "should be a document element\n");
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 );
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 );
159 /* check if the tag is still correct */
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 );
167 IXMLDOMElement_Release( element );
171 /* as soon as we call loadXML again, the document element will disappear */
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");
179 /* try to load something else simple and valid */
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 );
187 /* try something a little more complicated */
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 );
195 r = IXMLDocument_Release( doc );
196 ok( r == 0, "document ref count incorrect\n");
200 void test_domnode( void )
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;
213 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
214 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
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 );
228 r = IXMLDOMNode_hasChildNodes( doc, &b );
229 ok( r == S_OK, "hasChildNoes bad return\n");
230 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
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");
237 ok( FALSE, "no document\n");
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");
249 r = IXMLDOMNode_get_ownerDocument( element, &owner );
251 ok( r == S_OK, "get_ownerDocument return code\n");
253 ok( owner != doc, "get_ownerDocument return\n");
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");
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");
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");
270 r = IXMLDOMNode_hasChildNodes( element, &b );
271 ok( r == S_OK, "hasChildNoes bad return\n");
272 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
275 ok( FALSE, "no element\n");
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");
285 ok( FALSE, "no map\n");
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");
295 r = IXMLDOMNode_get_baseName( node, NULL );
296 ok( r == E_INVALIDARG, "get_baseName returned wrong code\n");
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");
303 r = IXMLDOMNode_get_childNodes( node, NULL );
304 ok( r == E_INVALIDARG, "get_childNodes returned wrong code\n");
306 r = IXMLDOMNode_get_childNodes( node, &list );
307 ok( r == S_OK, "get_childNodes returned wrong code\n");
311 r = IXMLDOMNodeList_nextNode( list, &next );
312 ok( r == S_OK, "nextNode returned wrong code\n");
315 ok( FALSE, "no childlist\n");
320 r = IXMLDOMNode_hasChildNodes( next, &b );
321 ok( r == S_FALSE, "hasChildNoes bad return\n");
322 ok( b == VARIANT_FALSE, "hasChildNoes wrong result\n");
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");
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");
335 ok( FALSE, "no next\n");
338 IXMLDOMNode_Release( next );
341 IXMLDOMNodeList_Release( list );
344 IXMLDOMNode_Release( node );
347 ok( FALSE, "no node\n");
351 IXMLDOMNamedNodeMap_Release( map );
353 /* now traverse the tree from the root node */
356 r = IXMLDOMNode_get_childNodes( element, &list );
357 ok( r == S_OK, "get_childNodes returned wrong code\n");
360 ok( FALSE, "no element\n");
364 r = IXMLDOMNodeList_nextNode( list, &node );
365 ok( r == S_OK, "nextNode returned wrong code\n");
368 ok( FALSE, "no list\n");
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");
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");
384 r = IXMLDOMNode_hasChildNodes( node, NULL );
385 ok( r == E_INVALIDARG, "hasChildNoes bad return\n");
388 r = IXMLDOMNode_hasChildNodes( node, &b );
389 ok( r == S_OK, "hasChildNoes bad return\n");
390 ok( b == VARIANT_TRUE, "hasChildNoes wrong result\n");
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");
398 ok( FALSE, "no node\n");
401 IXMLDOMNode_Release( node );
403 IXMLDOMNodeList_Release( list );
405 IXMLDOMElement_Release( element );
407 IXMLDocument_Release( doc );
414 r = CoInitialize( NULL );
415 ok( r == S_OK, "failed to init com\n");