4 * Copyright 2007 James Hawkins
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #define EXPECT_HR(hr,hr_exp) \
24 ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
26 /* Deprecated Error Code */
27 #define XML_E_INVALIDATROOTLEVEL 0xc00ce556
29 static void create_xml_file(LPCSTR filename
)
31 DWORD dwNumberOfBytesWritten
;
32 HANDLE hf
= CreateFileA(filename
, GENERIC_WRITE
, 0, NULL
,
33 CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL
, NULL
);
35 static const char data
[] =
36 "<?xml version=\"1.0\" ?>\n"
37 "<!DOCTYPE BankAccount>\n"
39 " <Number>1234</Number>\n"
40 " <Name>Captain Ahab</Name>\n"
43 WriteFile(hf
, data
, sizeof(data
) - 1, &dwNumberOfBytesWritten
, NULL
);
47 static void create_stream_on_file(IStream
**stream
, LPCSTR path
)
53 DWORD file_size
, read
;
55 hfile
= CreateFileA(path
, GENERIC_READ
, FILE_SHARE_READ
, NULL
,
56 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
57 ok(hfile
!= INVALID_HANDLE_VALUE
, "Expected a valid file handle\n");
58 file_size
= GetFileSize(hfile
, NULL
);
60 hglobal
= GlobalAlloc(GHND
, file_size
);
61 ptr
= GlobalLock(hglobal
);
63 ReadFile(hfile
, ptr
, file_size
, &read
, NULL
);
64 ok(file_size
== read
, "Expected to read the whole file, read %d\n", read
);
66 hr
= CreateStreamOnHGlobal(hglobal
, TRUE
, stream
);
67 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
68 ok(*stream
!= NULL
, "Expected non-NULL stream\n");
71 GlobalUnlock(hglobal
);
74 static void test_xmldoc(void)
76 IXMLElement
*element
= NULL
, *child
= NULL
, *value
= NULL
;
77 IXMLElementCollection
*collection
= NULL
, *inner
= NULL
;
78 IPersistStreamInit
*psi
= NULL
;
79 IXMLDocument
*doc
= NULL
;
80 IStream
*stream
= NULL
;
81 VARIANT vIndex
, vName
;
89 static const WCHAR szBankAccount
[] = {'B','A','N','K','A','C','C','O','U','N','T',0};
90 static const WCHAR szNumber
[] = {'N','U','M','B','E','R',0};
91 static const WCHAR szNumVal
[] = {'1','2','3','4',0};
92 static const WCHAR szName
[] = {'N','A','M','E',0};
93 static const WCHAR szNameVal
[] = {'C','a','p','t','a','i','n',' ','A','h','a','b',0};
94 static const WCHAR szVersion
[] = {'1','.','0',0};
95 static const WCHAR rootW
[] = {'r','o','o','t',0};
97 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
98 &IID_IXMLDocument
, (void**)&doc
);
102 hr
= IXMLDocument_QueryInterface(doc
, &IID_IDispatch
, (void**)&disp
);
105 /* just to make sure we're on right type data */
106 hr
= IDispatch_GetTypeInfo(disp
, 0, 0, &ti
);
109 hr
= ITypeInfo_GetDocumentation(ti
, DISPID_XMLDOCUMENT_ROOT
, &name
, NULL
, NULL
, NULL
);
111 ok(!lstrcmpW(name
, rootW
), "got name %s\n", wine_dbgstr_w(name
));
114 ITypeInfo_Release(ti
);
115 IDispatch_Release(disp
);
117 hr
= IXMLDocument_QueryInterface(doc
, &IID_IXMLDOMDocument
, (void**)&disp
);
118 EXPECT_HR(hr
, E_NOINTERFACE
);
120 create_xml_file("bank.xml");
121 GetFullPathNameA("bank.xml", MAX_PATH
, path
, NULL
);
122 create_stream_on_file(&stream
, path
);
124 hr
= IXMLDocument_QueryInterface(doc
, &IID_IPersistStreamInit
, (void**)&psi
);
125 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
126 ok(psi
!= NULL
, "Expected non-NULL psi\n");
128 hr
= IXMLDocument_get_root(doc
, &element
);
129 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
130 ok(element
== NULL
, "Expected NULL element\n");
132 hr
= IPersistStreamInit_Load(psi
, stream
);
133 ok(hr
== S_OK
|| hr
== XML_E_INVALIDATROOTLEVEL
, "Expected S_OK, got %08x\n", hr
);
134 if(hr
== XML_E_INVALIDATROOTLEVEL
)
137 ok(stream
!= NULL
, "Expected non-NULL stream\n");
140 hr
= IXMLDocument_get_version(doc
, NULL
);
141 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
144 hr
= IXMLDocument_get_version(doc
, &name
);
145 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
146 ok(!lstrcmpW(name
, szVersion
), "Expected 1.0, got %s\n", wine_dbgstr_w(name
));
150 hr
= IXMLDocument_get_doctype(doc
, NULL
);
151 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
153 hr
= IXMLDocument_get_doctype(doc
, &name
);
154 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
155 ok(!lstrcmpW(name
, szBankAccount
), "Expected BANKACCOUNT, got %s\n", wine_dbgstr_w(name
));
158 hr
= IXMLDocument_get_root(doc
, &element
);
159 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
160 ok(element
!= NULL
, "Expected non-NULL element\n");
162 /* ::root() returns new instance each time */
163 hr
= IXMLDocument_get_root(doc
, &child
);
164 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
165 ok(child
!= NULL
, "Expected non-NULL element\n");
166 ok(child
!= element
, "Expected new element instance\n");
167 IXMLElement_Release(child
);
169 hr
= IXMLElement_get_type(element
, &type
);
170 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
171 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
173 hr
= IXMLElement_get_tagName(element
, &name
);
174 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
175 ok(!lstrcmpW(name
, szBankAccount
), "Expected BANKACCOUNT\n");
178 hr
= IXMLElement_get_children(element
, &collection
);
179 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
180 ok(collection
!= NULL
, "Expected non-NULL collection\n");
182 hr
= IXMLElementCollection_get_length(collection
, &num_child
);
183 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
184 ok(num_child
== 2, "Expected 2, got %d\n", num_child
);
186 V_VT(&vIndex
) = VT_I4
;
188 V_VT(&vName
) = VT_ERROR
;
189 V_ERROR(&vName
) = DISP_E_PARAMNOTFOUND
;
190 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child
);
191 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
192 ok(child
!= NULL
, "Expected non-NULL child\n");
194 hr
= IXMLElement_get_type(child
, &type
);
195 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
196 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
198 hr
= IXMLElement_get_tagName(child
, &name
);
199 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
200 ok(!lstrcmpW(name
, szNumber
), "Expected NUMBER\n");
203 hr
= IXMLElement_get_children(child
, &inner
);
204 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
205 ok(inner
!= NULL
, "Expected non-NULL inner\n");
207 hr
= IXMLElementCollection_get_length(inner
, &num_child
);
208 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
209 ok(num_child
== 1, "Expected 1, got %d\n", num_child
);
211 hr
= IXMLElementCollection_item(inner
, vIndex
, vName
, (IDispatch
**)&value
);
212 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
213 ok(value
!= NULL
, "Expected non-NULL value\n");
215 hr
= IXMLElement_get_type(value
, &type
);
216 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
217 ok(type
== XMLELEMTYPE_TEXT
, "Expected XMLELEMTYPE_TEXT, got %d\n", type
);
219 hr
= IXMLElement_get_text(value
, &name
);
220 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
221 ok(!lstrcmpW(name
, szNumVal
), "Expected '1234'\n");
224 IXMLElementCollection_Release(inner
);
226 inner
= (IXMLElementCollection
*)0xdeadbeef;
227 hr
= IXMLElement_get_children(value
, &inner
);
228 ok(hr
== 1, "Expected 1, got %08x\n", hr
);
229 ok(inner
== NULL
, "Expected NULL inner, got %p\n", inner
);
231 IXMLElement_Release(value
);
232 IXMLElement_Release(child
);
237 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child
);
238 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
239 ok(child
!= NULL
, "Expected non-NULL child\n");
241 hr
= IXMLElement_get_type(child
, &type
);
242 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
243 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
245 hr
= IXMLElement_get_tagName(child
, &name
);
246 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
247 ok(!lstrcmpW(name
, szName
), "Expected NAME\n");
250 hr
= IXMLElement_get_children(child
, &inner
);
251 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
252 ok(inner
!= NULL
, "Expected non-NULL inner\n");
254 hr
= IXMLElementCollection_get_length(inner
, &num_child
);
255 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
256 ok(num_child
== 1, "Expected 1, got %d\n", num_child
);
259 hr
= IXMLElementCollection_item(inner
, vIndex
, vName
, (IDispatch
**)&value
);
260 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
261 ok(value
!= NULL
, "Expected non-NULL value\n");
263 hr
= IXMLElement_get_type(value
, &type
);
264 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
265 ok(type
== XMLELEMTYPE_TEXT
, "Expected XMLELEMTYPE_TEXT, got %d\n", type
);
267 hr
= IXMLElement_get_text(value
, &name
);
268 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
269 ok(!lstrcmpW(name
, szNameVal
), "Expected 'Captain Ahab'\n");
272 IXMLElementCollection_Release(inner
);
274 inner
= (IXMLElementCollection
*)0xdeadbeef;
275 hr
= IXMLElement_get_children(value
, &inner
);
276 ok(hr
== 1, "Expected 1, got %08x\n", hr
);
277 ok(inner
== NULL
, "Expected NULL inner, got %p\n", inner
);
279 IXMLElement_Release(value
);
280 IXMLElement_Release(child
);
281 IXMLElementCollection_Release(collection
);
282 IXMLElement_Release(element
);
284 IStream_Release(stream
);
285 IPersistStreamInit_Release(psi
);
286 IXMLDocument_Release(doc
);
288 DeleteFileA("bank.xml");
291 static void test_createElement(void)
294 IXMLDocument
*doc
= NULL
;
295 IXMLElement
*element
= NULL
, *root
= NULL
;
296 VARIANT vType
, vName
;
299 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
300 &IID_IXMLDocument
, (LPVOID
*)&doc
);
301 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
303 /* invalid vType type */
304 V_VT(&vType
) = VT_NULL
;
305 V_VT(&vName
) = VT_NULL
;
306 element
= (IXMLElement
*)0xdeadbeef;
307 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &element
);
308 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
309 ok(element
== NULL
, "Expected NULL element\n");
311 /* invalid vType value */
312 V_VT(&vType
) = VT_I4
;
314 V_VT(&vName
) = VT_NULL
;
315 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &element
);
316 /* Up to and including SP7, createElement returns an element. */
319 ok(element
!= NULL
, "Expected element\n");
322 hr
= IXMLElement_get_type(element
, &type
);
323 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
324 /* SP7 returns an XMLELEMTYPE_ELEMENT */
325 ok(type
== XMLELEMTYPE_OTHER
|| type
== XMLELEMTYPE_ELEMENT
,
326 "Expected XMLELEMTYPE_OTHER || XMLELEMTYPE_ELEMENT, got %d\n", type
);
328 IXMLElement_Release(element
);
333 ok(hr
== E_NOTIMPL
, "Expected E_NOTIMPL, got %08x\n", hr
);
334 ok(element
== NULL
, "Expected NULL element\n");
337 /* invalid vName type */
338 V_VT(&vType
) = VT_I4
;
339 V_I4(&vType
) = XMLELEMTYPE_ELEMENT
;
340 V_VT(&vName
) = VT_I4
;
341 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &element
);
342 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
343 ok(element
!= NULL
, "Expected non-NULL element\n");
345 hr
= IXMLElement_get_type(element
, &type
);
346 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
347 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
349 IXMLElement_Release(element
);
352 V_VT(&vType
) = VT_I4
;
353 V_I4(&vType
) = XMLELEMTYPE_ELEMENT
;
354 V_VT(&vName
) = VT_I4
;
355 hr
= IXMLDocument_createElement(doc
, vType
, vName
, NULL
);
356 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
358 root
= (IXMLElement
*)0xdeadbeef;
359 hr
= IXMLDocument_get_root(doc
, &root
);
360 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
361 ok(root
== NULL
, "Expected NULL root\n");
363 V_VT(&vType
) = VT_I4
;
364 V_I4(&vType
) = XMLELEMTYPE_ELEMENT
;
365 V_VT(&vName
) = VT_NULL
;
366 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &element
);
367 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
368 ok(element
!= NULL
, "Expected non-NULL element\n");
370 /* createElement does not set the new element as root */
371 root
= (IXMLElement
*)0xdeadbeef;
372 hr
= IXMLDocument_get_root(doc
, &root
);
373 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
374 ok(root
== NULL
, "Expected NULL root\n");
376 IXMLElement_Release(element
);
377 IXMLDocument_Release(doc
);
380 static void test_persiststreaminit(void)
382 IXMLDocument
*doc
= NULL
;
383 IXMLElement
*element
= NULL
;
384 IPersistStreamInit
*psi
= NULL
;
385 IStream
*stream
= NULL
;
392 static const WCHAR testW
[] = {'t','e','s','t',0};
394 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
395 &IID_IXMLDocument
, (LPVOID
*)&doc
);
396 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
398 hr
= IXMLDocument_QueryInterface(doc
, &IID_IPersistStreamInit
, (LPVOID
*)&psi
);
399 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
400 ok(psi
!= NULL
, "Expected non-NULL psi\n");
403 hr
= IPersistStreamInit_GetSizeMax(psi
, NULL
);
404 ok(hr
== E_NOTIMPL
, "Expected E_NOTIMPL, got %08x\n", hr
);
406 hr
= IPersistStreamInit_Load(psi
, NULL
);
407 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
409 hr
= IPersistStreamInit_Save(psi
, NULL
, FALSE
);
410 todo_wine
ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
412 hr
= IPersistStreamInit_GetClassID(psi
, NULL
);
413 ok(hr
== E_POINTER
, "Expected E_POINTER, got %08x\n", hr
);
415 hr
= IPersistStreamInit_IsDirty(psi
);
416 todo_wine
ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
418 create_xml_file("bank.xml");
419 GetFullPathNameA("bank.xml", MAX_PATH
, path
, NULL
);
420 create_stream_on_file(&stream
, path
);
422 /* GetSizeMax not implemented */
424 hr
= IPersistStreamInit_GetSizeMax(psi
, &size
);
425 ok(hr
== E_NOTIMPL
, "Expected E_NOTIMPL, got %08x\n", hr
);
426 ok(size
.QuadPart
== 0, "Expected 0\n");
428 hr
= IPersistStreamInit_Load(psi
, stream
);
429 IStream_Release(stream
);
430 ok(hr
== S_OK
|| hr
== XML_E_INVALIDATROOTLEVEL
, "Expected S_OK, got %08x\n", hr
);
431 if(hr
== XML_E_INVALIDATROOTLEVEL
)
434 hr
= IPersistStreamInit_IsDirty(psi
);
435 todo_wine
ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
437 /* try to save document */
439 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
440 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
441 hr
= IPersistStreamInit_Save(psi
, stream
, FALSE
);
442 todo_wine
ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
444 stat
.cbSize
.QuadPart
= 0;
445 hr
= IStream_Stat(stream
, &stat
, 0);
446 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
447 todo_wine
ok(stat
.cbSize
.QuadPart
> 0, "Expected >0\n");
448 IStream_Release(stream
);
450 str
= SysAllocString(testW
);
451 hr
= IXMLDocument_get_root(doc
, &element
);
452 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
453 hr
= IXMLElement_put_text(element
, str
);
454 ok(hr
== E_NOTIMPL
, "Expected E_NOTIMPL, got %08x\n", hr
);
455 IXMLElement_Release(element
);
458 hr
= IPersistStreamInit_IsDirty(psi
);
459 todo_wine
ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
461 create_stream_on_file(&stream
, path
);
462 hr
= IPersistStreamInit_Load(psi
, stream
);
463 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
464 IStream_Release(stream
);
466 hr
= IPersistStreamInit_IsDirty(psi
);
467 todo_wine
ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
469 /* reset internal stream */
470 hr
= IPersistStreamInit_InitNew(psi
);
471 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
473 hr
= IPersistStreamInit_IsDirty(psi
);
474 todo_wine
ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
477 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
478 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
480 hr
= IPersistStreamInit_Save(psi
, stream
, FALSE
);
481 todo_wine
ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
483 stat
.cbSize
.QuadPart
= 0;
484 hr
= IStream_Stat(stream
, &stat
, 0);
485 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
486 todo_wine
ok(stat
.cbSize
.QuadPart
> 0, "Expected >0\n");
487 IStream_Release(stream
);
489 memset(&id
, 0, sizeof(id
));
490 hr
= IPersistStreamInit_GetClassID(psi
, &id
);
491 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
492 ok(IsEqualCLSID(&id
, &CLSID_XMLDocument
), "Expected CLSID_XMLDocument\n");
495 IPersistStreamInit_Release(psi
);
496 IXMLDocument_Release(doc
);
497 DeleteFileA("bank.xml");
500 static BOOL
test_try_xmldoc(void)
502 IXMLDocument
*doc
= NULL
;
505 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
506 &IID_IXMLDocument
, (LPVOID
*)&doc
);
509 win_skip("Failed to create XMLDocument instance\n");
513 IXMLDocument_Release(doc
);
517 static void test_xmlelem_children(void)
519 IXMLDocument
*doc
= NULL
;
520 IXMLElement
*element
= NULL
, *child
= NULL
, *child2
= NULL
;
521 IXMLElementCollection
*collection
= NULL
;
522 VARIANT vType
, vName
, vIndex
;
526 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
527 &IID_IXMLDocument
, (LPVOID
*)&doc
);
528 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
530 V_VT(&vType
) = VT_I4
;
531 V_I4(&vType
) = XMLELEMTYPE_ELEMENT
;
532 V_VT(&vName
) = VT_NULL
;
533 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &element
);
534 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
535 ok(element
!= NULL
, "Expected non-NULL element\n");
537 V_VT(&vType
) = VT_I4
;
538 V_I4(&vType
) = XMLELEMTYPE_TEXT
;
539 V_VT(&vName
) = VT_NULL
;
540 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &child
);
541 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
542 ok(child
!= NULL
, "Expected non-NULL child\n");
544 V_VT(&vType
) = VT_I4
;
545 V_I4(&vType
) = XMLELEMTYPE_TEXT
;
546 V_VT(&vName
) = VT_NULL
;
547 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &child2
);
548 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
549 ok(child2
!= NULL
, "Expected non-NULL child\n");
551 hr
= IXMLElement_addChild(element
, child
, 0, -1);
552 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
554 hr
= IXMLElement_get_children(element
, &collection
);
555 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
556 ok(collection
!= NULL
, "Expected non-NULL collection\n");
559 hr
= IXMLElementCollection_get_length(collection
, &length
);
560 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
561 ok(length
== 1, "Expected 1, got %08x\n", length
);
563 /* remove/add child and check what happens with collection */
564 hr
= IXMLElement_removeChild(element
, child
);
565 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
568 hr
= IXMLElementCollection_get_length(collection
, &length
);
569 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
570 ok(length
== 0, "Expected 0, got %08x\n", length
);
571 IXMLElementCollection_Release(collection
);
573 hr
= IXMLElement_AddRef(child
);
574 ok(hr
== 2, "Expected 2, got %08x\n", hr
);
575 IXMLElement_Release(child
);
576 hr
= IXMLElement_addChild(element
, child
, 0, -1);
577 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
578 hr
= IXMLElement_AddRef(child
);
579 ok(hr
== 2, "Expected 2, got %08x\n", hr
);
580 IXMLElement_Release(child
);
581 hr
= IXMLElement_addChild(element
, child2
, 0, -1);
582 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
584 hr
= IXMLElement_get_children(element
, &collection
);
585 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
586 ok(collection
!= NULL
, "Expected non-NULL collection\n");
588 hr
= IXMLElement_AddRef(child
);
589 ok(hr
== 2, "Expected 2, got %08x\n", hr
);
590 IXMLElement_Release(child
);
593 hr
= IXMLElementCollection_get_length(collection
, &length
);
594 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
595 ok(length
== 2, "Expected 2, got %08x\n", length
);
597 IXMLElement_Release(child2
);
600 hr
= IXMLElementCollection_get_length(collection
, &length
);
601 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
602 ok(length
== 2, "Expected 2, got %08x\n", length
);
604 V_VT(&vIndex
) = VT_I4
;
606 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child2
);
607 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
608 ok(child2
!= NULL
, "Expected not NULL child\n");
609 IXMLElementCollection_Release(collection
);
610 IXMLElement_Release(child2
);
612 /* add element->child->child2 structure, then remove child2 from node */
613 V_VT(&vType
) = VT_I4
;
614 V_I4(&vType
) = XMLELEMTYPE_TEXT
;
615 V_VT(&vName
) = VT_NULL
;
616 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &child2
);
617 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
618 ok(child2
!= NULL
, "Expected non-NULL child\n");
620 hr
= IXMLElement_addChild(child
, child2
, 0, -1);
621 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
623 hr
= IXMLElement_removeChild(element
, child2
);
624 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
626 hr
= IXMLElement_removeChild(child
, child2
);
627 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
629 hr
= IXMLElement_removeChild(child
, NULL
);
630 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
632 IXMLElement_Release(element
);
633 IXMLElement_Release(child
);
634 IXMLElement_Release(child2
);
635 IXMLDocument_Release(doc
);
638 static void test_xmlelem_collection(void)
641 IUnknown
*unk
= NULL
;
642 IXMLDocument
*doc
= NULL
;
643 IXMLElement
*element
= NULL
, *child
;
644 IXMLElementCollection
*collection
= NULL
;
645 IEnumVARIANT
*enumVar
= NULL
;
646 CHAR pathA
[MAX_PATH
];
647 WCHAR path
[MAX_PATH
];
650 VARIANT var
, dummy
, vIndex
, vName
;
652 static const CHAR szBankXML
[] = "bank.xml";
653 static const WCHAR szNumber
[] = {'N','U','M','B','E','R',0};
654 static const WCHAR szName
[] = {'N','A','M','E',0};
656 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
657 &IID_IXMLDocument
, (LPVOID
*)&doc
);
658 ok(hr
== S_OK
, "Expected S_OK, got 0x%08x\n", hr
);
660 create_xml_file(szBankXML
);
661 GetFullPathNameA(szBankXML
, MAX_PATH
, pathA
, NULL
);
662 MultiByteToWideChar(CP_ACP
, 0, pathA
, -1, path
, MAX_PATH
);
664 url
= SysAllocString(path
);
665 hr
= IXMLDocument_put_URL(doc
, url
);
666 ok(hr
== S_OK
, "Expected S_OK, got 0x%08x\n", hr
);
672 hr
= IXMLDocument_get_root(doc
, &element
);
673 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
674 ok(element
!= NULL
, "Expected non-NULL element\n");
676 hr
= IXMLElement_get_children(element
, &collection
);
677 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
678 ok(collection
!= NULL
, "Expected non-NULL collection\n");
680 hr
= IXMLElementCollection_get_length(collection
, NULL
);
681 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
683 hr
= IXMLElementCollection_get_length(collection
, &length
);
684 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
685 ok(length
== 2, "Expected 2, got %d\n", length
);
687 /* IXMLElementCollection:put_length does nothing */
688 hr
= IXMLElementCollection_put_length(collection
, -1);
689 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
691 hr
= IXMLElementCollection_put_length(collection
, 0);
692 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
694 hr
= IXMLElementCollection_put_length(collection
, 1);
695 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
697 hr
= IXMLElementCollection_put_length(collection
, 2);
698 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
700 hr
= IXMLElementCollection_put_length(collection
, 3);
701 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
703 hr
= IXMLElementCollection_put_length(collection
, 50);
704 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
706 /* make sure the length hasn't changed */
707 hr
= IXMLElementCollection_get_length(collection
, &length
);
708 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
709 ok(length
== 2, "Expected 2, got %d\n", length
);
711 /* IXMLElementCollection implements IEnumVARIANT */
712 hr
= IXMLElementCollection_QueryInterface(collection
, &IID_IEnumVARIANT
, (LPVOID
*)&enumVar
);
713 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
714 ok(enumVar
!= NULL
, "Expected non-NULL enumVar\n");
715 IEnumVARIANT_Release(enumVar
);
717 hr
= IXMLElementCollection_get__newEnum(collection
, &unk
);
718 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
719 ok(unk
!= NULL
, "Expected non-NULL unk\n");
721 enumVar
= (void *)0xdeadbeef;
722 hr
= IUnknown_QueryInterface(unk
, &IID_IXMLElementCollection
, (LPVOID
*)&enumVar
);
723 ok(hr
== E_NOINTERFACE
, "Expected E_NOINTERFACE, got %08x\n", hr
);
724 ok(enumVar
== NULL
|| broken(enumVar
== (void *)0xdeadbeef) /* XP */, "Expected NULL, got %p\n", enumVar
);
726 hr
= IUnknown_QueryInterface(unk
, &IID_IEnumVARIANT
, (LPVOID
*)&enumVar
);
727 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
728 ok(enumVar
!= NULL
, "Expected non-NULL enumVar\n");
729 IUnknown_Release(unk
);
731 /* <Number>1234</Number> */
732 hr
= IEnumVARIANT_Next(enumVar
, 1, &var
, &num_vars
);
733 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
734 ok(V_VT(&var
) == VT_DISPATCH
, "Expected VT_DISPATCH, got %d\n", V_VT(&var
));
735 ok(num_vars
== 1, "Expected 1, got %d\n", num_vars
);
737 hr
= IDispatch_QueryInterface(V_DISPATCH(&var
), &IID_IXMLElement
, (LPVOID
*)&child
);
738 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
739 ok(child
!= NULL
, "Expected non-NULL child\n");
743 hr
= IXMLElement_get_type(child
, &type
);
744 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
745 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
747 hr
= IXMLElement_get_tagName(child
, &str
);
748 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
749 ok(!lstrcmpW(str
, szNumber
), "Expected NUMBER\n");
751 IXMLElement_Release(child
);
753 /* <Name>Captain Ahab</Name> */
754 hr
= IEnumVARIANT_Next(enumVar
, 1, &var
, &num_vars
);
755 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
756 ok(V_VT(&var
) == VT_DISPATCH
, "Expected VT_DISPATCH, got %d\n", V_VT(&var
));
757 ok(num_vars
== 1, "Expected 1, got %d\n", num_vars
);
759 /* try advance further, no children left */
760 V_VT(&dummy
) = VT_I4
;
761 hr
= IEnumVARIANT_Next(enumVar
, 1, &dummy
, &num_vars
);
762 ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
763 ok(V_VT(&dummy
) == VT_EMPTY
, "Expected 0, got %d\n", V_VT(&dummy
));
764 ok(num_vars
== 0, "Expected 0, got %d\n", num_vars
);
766 V_VT(&dummy
) = VT_I4
;
767 hr
= IEnumVARIANT_Next(enumVar
, 1, &dummy
, NULL
);
768 ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
769 ok(V_VT(&dummy
) == VT_EMPTY
, "Expected 0, got %d\n", V_VT(&dummy
));
771 hr
= IDispatch_QueryInterface(V_DISPATCH(&var
), &IID_IXMLElement
, (LPVOID
*)&child
);
772 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
773 ok(child
!= NULL
, "Expected non-NULL child\n");
777 hr
= IXMLElement_get_type(child
, &type
);
778 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
779 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
781 hr
= IXMLElement_get_tagName(child
, &str
);
782 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
783 ok(!lstrcmpW(str
, szName
), "Expected NAME\n");
785 IXMLElement_Release(child
);
787 /* <Number>1234</Number> */
788 V_VT(&vIndex
) = VT_I4
;
790 V_VT(&vName
) = VT_ERROR
;
791 V_ERROR(&vName
) = DISP_E_PARAMNOTFOUND
;
792 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child
);
793 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
794 ok(child
!= NULL
, "Expected non-NULL child\n");
796 hr
= IXMLElement_get_type(child
, &type
);
797 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
798 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
800 hr
= IXMLElement_get_tagName(child
, &str
);
801 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
802 ok(!lstrcmpW(str
, szNumber
), "Expected NUMBER\n");
804 IXMLElement_Release(child
);
806 /* <Name>Captain Ahab</Name> */
807 V_VT(&vIndex
) = VT_I4
;
809 V_VT(&vName
) = VT_ERROR
;
810 V_ERROR(&vName
) = DISP_E_PARAMNOTFOUND
;
811 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child
);
812 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
813 ok(child
!= NULL
, "Expected non-NULL child\n");
815 hr
= IXMLElement_get_type(child
, &type
);
816 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
817 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
819 hr
= IXMLElement_get_tagName(child
, &str
);
820 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
821 ok(!lstrcmpW(str
, szName
), "Expected NAME\n");
823 IXMLElement_Release(child
);
826 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child
);
827 ok(hr
== E_FAIL
, "Expected E_FAIL, got %08x\n", hr
);
828 ok(child
== NULL
, "Expected NULL child\n");
831 child
= (IXMLElement
*)0xdeadbeef;
832 hr
= IXMLElementCollection_item(collection
, vIndex
, vName
, (IDispatch
**)&child
);
833 ok(hr
== E_INVALIDARG
, "Expected E_INVALIDARG, got %08x\n", hr
);
834 ok(child
== NULL
, "Expected NULL child\n");
836 IEnumVARIANT_Release(enumVar
);
837 IXMLElement_Release(element
);
838 IXMLElementCollection_Release(collection
);
840 IXMLDocument_Release(doc
);
841 DeleteFileA("bank.xml");
844 static void test_xmlelem(void)
847 IXMLDocument
*doc
= NULL
;
848 IXMLElement
*element
= NULL
, *parent
;
849 IXMLElement
*child
, *child2
;
850 IXMLElementCollection
*children
;
851 VARIANT vType
, vName
;
852 VARIANT vIndex
, vValue
;
854 LONG type
, num_child
;
858 static const WCHAR propName
[] = {'p','r','o','p',0};
859 static const WCHAR propVal
[] = {'v','a','l',0};
860 static const WCHAR nextVal
[] = {'n','e','x','t',0};
861 static const WCHAR noexist
[] = {'n','o','e','x','i','s','t',0};
862 static const WCHAR crazyCase1
[] = {'C','R','a','z','Y','c','A','S','E',0};
863 static const WCHAR crazyCase2
[] = {'C','R','A','Z','Y','C','A','S','E',0};
865 hr
= CoCreateInstance(&CLSID_XMLDocument
, NULL
, CLSCTX_INPROC_SERVER
,
866 &IID_IXMLDocument
, (LPVOID
*)&doc
);
869 V_VT(&vType
) = VT_I4
;
870 V_I4(&vType
) = XMLELEMTYPE_ELEMENT
;
871 V_VT(&vName
) = VT_NULL
;
872 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &element
);
874 ok(element
!= NULL
, "Expected non-NULL element\n");
876 /* test for IDispatch */
878 hr
= IXMLElement_QueryInterface(element
, &IID_IDispatch
, (void**)&disp
);
881 hr
= IDispatch_GetTypeInfo(disp
, 0, 0, &ti
);
885 hr
= ITypeInfo_GetDocumentation(ti
, DISPID_XMLELEMENT_TAGNAME
, &name
, NULL
, NULL
, NULL
);
889 ITypeInfo_Release(ti
);
890 IDispatch_Release(disp
);
892 hr
= IXMLElement_get_tagName(element
, &str
);
894 ok(!str
, "Expected empty tag name, got %s\n", wine_dbgstr_w(str
));
897 parent
= (IXMLElement
*)0xdeadbeef;
898 hr
= IXMLElement_get_parent(element
, &parent
);
899 ok(hr
== 1, "Expected 1, got %08x\n", hr
);
900 ok(parent
== NULL
, "Expected NULL parent\n");
902 str
= SysAllocString(noexist
);
903 hr
= IXMLElement_getAttribute(element
, str
, &vValue
);
904 ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
905 ok(V_VT(&vValue
) == VT_EMPTY
, "Expected VT_EMPTY, got %d\n", V_VT(&vValue
));
906 ok(V_BSTR(&vValue
) == NULL
, "Expected null value\n");
907 VariantClear(&vValue
);
910 str
= SysAllocString(crazyCase1
);
911 val
= SysAllocString(propVal
);
912 V_VT(&vValue
) = VT_BSTR
;
913 V_BSTR(&vValue
) = val
;
914 hr
= IXMLElement_setAttribute(element
, str
, vValue
);
915 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
919 str
= SysAllocString(crazyCase2
);
920 hr
= IXMLElement_getAttribute(element
, str
, &vValue
);
921 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
922 ok(V_VT(&vValue
) == VT_BSTR
, "Expected VT_BSTR, got %d\n", V_VT(&vValue
));
923 ok(!lstrcmpW(V_BSTR(&vValue
), propVal
), "Expected 'val'\n");
924 VariantClear(&vValue
);
927 str
= SysAllocString(propName
);
928 val
= SysAllocString(propVal
);
929 V_VT(&vValue
) = VT_BSTR
;
930 V_BSTR(&vValue
) = val
;
931 hr
= IXMLElement_setAttribute(element
, str
, vValue
);
932 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
935 hr
= IXMLElement_getAttribute(element
, str
, &vValue
);
936 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
937 ok(V_VT(&vValue
) == VT_BSTR
, "Expected VT_BSTR, got %d\n", V_VT(&vValue
));
938 ok(!lstrcmpW(V_BSTR(&vValue
), propVal
), "Expected 'val'\n");
939 VariantClear(&vValue
);
941 hr
= IXMLElement_removeAttribute(element
, str
);
942 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
944 /* remove now nonexistent attribute */
945 hr
= IXMLElement_removeAttribute(element
, str
);
946 ok(hr
== S_FALSE
, "Expected S_FALSE, got %08x\n", hr
);
948 hr
= IXMLElement_getAttribute(element
, str
, &vValue
);
949 ok(hr
== 1, "Expected 1, got %08x\n", hr
);
950 ok(V_VT(&vValue
) == VT_EMPTY
, "Expected VT_EMPTY, got %d\n", V_VT(&vValue
));
951 ok(V_BSTR(&vValue
) == NULL
, "Expected null value\n");
953 VariantClear(&vValue
);
955 children
= (IXMLElementCollection
*)0xdeadbeef;
956 hr
= IXMLElement_get_children(element
, &children
);
957 ok(hr
== 1, "Expected 1, got %08x\n", hr
);
958 ok(children
== NULL
, "Expected NULL collection\n");
960 hr
= IXMLElement_get_type(element
, &type
);
961 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
962 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
964 hr
= IXMLElement_get_text(element
, &str
);
965 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
966 ok(lstrlenW(str
) == 0, "Expected empty text\n");
969 /* put_text with an ELEMENT */
970 str
= SysAllocString(propVal
);
971 hr
= IXMLElement_put_text(element
, str
);
972 ok(hr
== E_NOTIMPL
, "Expected E_NOTIMPL, got %08x\n", hr
);
975 V_VT(&vType
) = VT_I4
;
976 V_I4(&vType
) = XMLELEMTYPE_TEXT
;
977 V_VT(&vName
) = VT_NULL
;
978 hr
= IXMLDocument_createElement(doc
, vType
, vName
, &child
);
979 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
980 ok(child
!= NULL
, "Expected non-NULL child\n");
982 hr
= IXMLElement_addChild(element
, child
, 0, -1);
983 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
985 str
= SysAllocString(propVal
);
986 hr
= IXMLElement_put_text(child
, str
);
987 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
990 parent
= (IXMLElement
*)0xdeadbeef;
991 hr
= IXMLElement_get_parent(child
, &parent
);
992 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
993 ok(parent
!= element
, "Expected parent != element\n");
995 hr
= IXMLElement_get_type(parent
, &type
);
996 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
997 ok(type
== XMLELEMTYPE_ELEMENT
, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type
);
999 children
= (IXMLElementCollection
*)0xdeadbeef;
1000 hr
= IXMLElement_get_children(element
, &children
);
1001 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1002 ok(children
!= NULL
, "Expected non-NULL collection\n");
1004 hr
= IXMLElementCollection_get_length(children
, &num_child
);
1005 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1006 ok(num_child
== 1, "Expected 1, got %d\n", num_child
);
1008 V_VT(&vIndex
) = VT_I4
;
1010 V_VT(&vName
) = VT_ERROR
;
1011 V_ERROR(&vName
) = DISP_E_PARAMNOTFOUND
;
1012 hr
= IXMLElementCollection_item(children
, vIndex
, vName
, (IDispatch
**)&child2
);
1013 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1014 ok(child2
!= NULL
, "Expected non-NULL child\n");
1016 hr
= IXMLElement_get_type(child2
, &type
);
1017 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1018 ok(type
== XMLELEMTYPE_TEXT
, "Expected XMLELEMTYPE_TEXT, got %d\n", type
);
1020 hr
= IXMLElement_get_text(element
, &str
);
1021 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1022 ok(!lstrcmpW(str
, propVal
), "Expected 'val'\n");
1025 hr
= IXMLElement_get_text(child2
, &str
);
1026 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1027 ok(!lstrcmpW(str
, propVal
), "Expected 'val'\n");
1030 /* try put_text on ELEMENT again, now that it has a text child */
1031 str
= SysAllocString(nextVal
);
1032 hr
= IXMLElement_put_text(element
, str
);
1033 ok(hr
== E_NOTIMPL
, "Expected E_NOTIMPL, got %08x\n", hr
);
1036 str
= SysAllocString(nextVal
);
1037 hr
= IXMLElement_put_text(child2
, str
);
1038 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1041 hr
= IXMLElement_get_text(element
, &str
);
1042 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
1043 ok(!lstrcmpW(str
, nextVal
), "Expected 'val'\n");
1046 IXMLElement_Release(child2
);
1047 IXMLElementCollection_Release(children
);
1048 IXMLElement_Release(parent
);
1049 IXMLElement_Release(child
);
1050 IXMLElement_Release(element
);
1051 IXMLDocument_Release(doc
);
1058 hr
= CoInitialize(NULL
);
1059 ok(hr
== S_OK
, "failed to init com\n");
1061 if (!test_try_xmldoc())
1068 test_createElement();
1069 test_persiststreaminit();
1071 test_xmlelem_collection();
1072 test_xmlelem_children();