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 void test_domdoc( void )
35 IXMLDOMDocument *doc = NULL;
36 IXMLDOMElement *element = NULL;
37 static const GUID CLSID_DOMDocument =
38 { 0x2933BF90, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
39 static const GUID IID_IXMLDOMDocument =
40 { 0x2933BF81, 0x7B36, 0x11d2, {0xB2,0x0E,0x00,0xC0,0x4F,0x98,0x3E,0x60}};
43 static const WCHAR szEmpty[] = { 0 };
44 static const WCHAR szIncomplete[] = {
45 '<','?','x','m','l',' ',
46 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',0
48 static const WCHAR szComplete1[] = {
49 '<','?','x','m','l',' ',
50 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
51 '<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
53 static const WCHAR szComplete2[] = {
54 '<','?','x','m','l',' ',
55 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
56 '<','o','>','<','/','o','>','\n',0
58 static const WCHAR szComplete3[] = {
59 '<','?','x','m','l',' ',
60 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n',
61 '<','a','>','<','/','a','>','\n',0
63 static const WCHAR szComplete4[] = {
64 '<','?','x','m','l',' ',
65 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>',
66 '<','l','c',' ','d','l','=','\'','s','t','r','1','\'','>',
67 '<','b','s',' ','v','r','=','\'','s','t','r','2','\'',' ',
68 's','z','=','\'','1','2','3','4','\'','>','f','n','1','.','t','x','t','<','/','b','s','>',
69 '<','p','r',' ','i','d','=','\'','s','t','r','3','\'',' ',
70 'v','r','=','\'','1','.','2','.','3','\'',' ',
71 'p','n','=','\'','w','i','n','e',' ','2','0','0','5','0','8','0','4','\'','>',
72 'f','n','2','.','t','x','t','<','/','p','r','>',
73 '<','/','l','c','>','\n',0
75 static const WCHAR szOpen[] = { 'o','p','e','n',0 };
77 r = CoInitialize( NULL );
78 ok( r == S_OK, "failed to init com\n");
80 r = CoCreateInstance( &CLSID_DOMDocument, NULL,
81 CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
82 /* ok( r == S_OK, "failed to create an xml dom doc\n" ); */
86 /* try some stupid things */
87 r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
88 ok( r == S_FALSE, "loadXML failed\n");
91 r = IXMLDOMDocument_loadXML( doc, NULL, &b );
92 ok( r == S_FALSE, "loadXML failed\n");
93 ok( b == VARIANT_FALSE, "failed to load XML string\n");
95 /* try load an empty document */
97 str = SysAllocString( szEmpty );
98 r = IXMLDOMDocument_loadXML( doc, str, &b );
99 ok( r == S_FALSE, "loadXML failed\n");
100 ok( b == VARIANT_FALSE, "failed to load XML string\n");
101 SysFreeString( str );
103 /* check that there's no document element */
105 r = IXMLDOMDocument_get_documentElement( doc, &element );
106 ok( r == S_FALSE, "should be no document element\n");
109 str = SysAllocString( szIncomplete );
110 r = IXMLDOMDocument_loadXML( doc, str, &b );
111 ok( r == S_FALSE, "loadXML failed\n");
112 ok( b == VARIANT_FALSE, "failed to load XML string\n");
113 SysFreeString( str );
115 /* check that there's no document element */
116 element = (IXMLDOMElement*)1;
117 r = IXMLDOMDocument_get_documentElement( doc, &element );
118 ok( r == S_FALSE, "should be no document element\n");
119 ok( element == NULL, "Element should be NULL\n");
121 /* try to load something valid */
123 str = SysAllocString( szComplete1 );
124 r = IXMLDOMDocument_loadXML( doc, str, &b );
125 ok( r == S_OK, "loadXML failed\n");
126 ok( b == VARIANT_TRUE, "failed to load XML string\n");
127 SysFreeString( str );
129 /* try with a null out pointer - crashes */
132 r = IXMLDOMDocument_get_documentElement( doc, NULL );
133 ok( r == S_OK, "should be no document element\n");
136 /* check that there's no document element */
138 r = IXMLDOMDocument_get_documentElement( doc, &element );
139 ok( r == S_OK, "should be a document element\n");
144 /* check if the tag is correct */
145 r = IXMLDOMElement_get_tagName( element, &tag );
146 ok( r == S_OK, "couldn't get tag name\n");
147 ok( tag != NULL, "tag was null\n");
148 ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
149 SysFreeString( tag );
151 /* figure out what happens if we try to reload the document */
152 str = SysAllocString( szComplete2 );
153 r = IXMLDOMDocument_loadXML( doc, str, &b );
154 ok( r == S_OK, "loadXML failed\n");
155 ok( b == VARIANT_TRUE, "failed to load XML string\n");
156 SysFreeString( str );
158 /* check if the tag is still correct */
160 r = IXMLDOMElement_get_tagName( element, &tag );
161 ok( r == S_OK, "couldn't get tag name\n");
162 ok( tag != NULL, "tag was null\n");
163 ok( !lstrcmpW( tag, szOpen ), "incorrect tag name\n");
164 SysFreeString( tag );
166 IXMLDOMElement_Release( element );
170 /* as soon as we call loadXML again, the document element will disappear */
172 r = IXMLDOMDocument_loadXML( doc, NULL, NULL );
173 ok( r == S_FALSE, "loadXML failed\n");
174 ok( b == 2, "variant modified\n");
175 r = IXMLDOMDocument_get_documentElement( doc, &element );
176 ok( r == S_FALSE, "should be no document element\n");
178 /* try to load something else simple and valid */
180 str = SysAllocString( szComplete3 );
181 r = IXMLDOMDocument_loadXML( doc, str, &b );
182 ok( r == S_OK, "loadXML failed\n");
183 ok( b == VARIANT_TRUE, "failed to load XML string\n");
184 SysFreeString( str );
186 /* try something a little more complicated */
188 str = SysAllocString( szComplete4 );
189 r = IXMLDOMDocument_loadXML( doc, str, &b );
190 ok( r == S_OK, "loadXML failed\n");
191 ok( b == VARIANT_TRUE, "failed to load XML string\n");
192 SysFreeString( str );
194 r = IXMLDocument_Release( doc );
195 ok( r == 0, "document ref count incorrect\n");
198 ok( r == S_OK, "failed to uninit com\n");