2 * XMLLite IXmlWriter tests
4 * Copyright 2011 (C) Alistair Leslie-Hughes
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
21 #define WIN32_NO_STATUS
23 #define COM_NO_WINDOWS_H
37 #include <wine/test.h>
40 DEFINE_GUID(IID_IXmlWriterOutput
, 0xc1131708, 0x0f59, 0x477f, 0x93, 0x59, 0x7d, 0x33, 0x24, 0x51, 0xbc, 0x1a);
42 static HRESULT (WINAPI
*pCreateXmlWriter
)(REFIID riid
, void **ppvObject
, IMalloc
*pMalloc
);
43 static HRESULT (WINAPI
*pCreateXmlWriterOutputWithEncodingName
)(IUnknown
*stream
,
45 LPCWSTR encoding_name
,
46 IXmlWriterOutput
**output
);
47 static HRESULT (WINAPI
*pCreateXmlWriterOutputWithEncodingCodePage
)(IUnknown
*stream
,
50 IXmlWriterOutput
**output
);
52 static HRESULT WINAPI
testoutput_QueryInterface(IUnknown
*iface
, REFIID riid
, void **obj
)
54 if (IsEqualGUID(riid
, &IID_IUnknown
)) {
59 ok(0, "unknown riid=%s\n", wine_dbgstr_guid(riid
));
64 static ULONG WINAPI
testoutput_AddRef(IUnknown
*iface
)
69 static ULONG WINAPI
testoutput_Release(IUnknown
*iface
)
74 static const IUnknownVtbl testoutputvtbl
= {
75 testoutput_QueryInterface
,
80 static IUnknown testoutput
= { &testoutputvtbl
};
82 static HRESULT WINAPI
teststream_QueryInterface(ISequentialStream
*iface
, REFIID riid
, void **obj
)
84 if (IsEqualIID(riid
, &IID_IUnknown
) || IsEqualIID(riid
, &IID_ISequentialStream
))
94 static ULONG WINAPI
teststream_AddRef(ISequentialStream
*iface
)
99 static ULONG WINAPI
teststream_Release(ISequentialStream
*iface
)
104 static HRESULT WINAPI
teststream_Read(ISequentialStream
*iface
, void *pv
, ULONG cb
, ULONG
*pread
)
106 ok(0, "unexpected call\n");
110 static ULONG g_write_len
;
111 static HRESULT WINAPI
teststream_Write(ISequentialStream
*iface
, const void *pv
, ULONG cb
, ULONG
*written
)
118 static const ISequentialStreamVtbl teststreamvtbl
=
120 teststream_QueryInterface
,
127 static ISequentialStream teststream
= { &teststreamvtbl
};
129 static void test_writer_create(void)
138 pCreateXmlWriter(&IID_IXmlWriter
, NULL
, NULL
);
139 pCreateXmlWriter(NULL
, (void**)&writer
, NULL
);
142 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
143 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
145 /* check default properties values */
147 hr
= IXmlWriter_GetProperty(writer
, XmlWriterProperty_ByteOrderMark
, &value
);
148 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
149 ok(value
== TRUE
, "got %ld\n", value
);
152 hr
= IXmlWriter_GetProperty(writer
, XmlWriterProperty_Indent
, &value
);
153 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
154 ok(value
== FALSE
, "got %ld\n", value
);
157 hr
= IXmlWriter_GetProperty(writer
, XmlWriterProperty_OmitXmlDeclaration
, &value
);
158 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
159 ok(value
== FALSE
, "got %ld\n", value
);
161 value
= XmlConformanceLevel_Auto
;
162 hr
= IXmlWriter_GetProperty(writer
, XmlWriterProperty_ConformanceLevel
, &value
);
163 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
164 ok(value
== XmlConformanceLevel_Document
, "got %ld\n", value
);
166 IXmlWriter_Release(writer
);
169 static BOOL
init_pointers(void)
171 /* don't free module here, it's to be unloaded on exit */
172 HMODULE mod
= LoadLibraryA("xmllite.dll");
176 win_skip("xmllite library not available\n");
180 #define MAKEFUNC(f) if (!(p##f = (void*)GetProcAddress(mod, #f))) return FALSE;
181 MAKEFUNC(CreateXmlWriter
);
182 MAKEFUNC(CreateXmlWriterOutputWithEncodingName
);
183 MAKEFUNC(CreateXmlWriterOutputWithEncodingCodePage
);
189 static void test_writeroutput(void)
191 static const WCHAR utf16W
[] = {'u','t','f','-','1','6',0};
192 IXmlWriterOutput
*output
;
197 hr
= pCreateXmlWriterOutputWithEncodingName(&testoutput
, NULL
, NULL
, &output
);
198 ok(hr
== S_OK
, "got %08x\n", hr
);
199 IUnknown_Release(output
);
201 hr
= pCreateXmlWriterOutputWithEncodingName(&testoutput
, NULL
, utf16W
, &output
);
202 ok(hr
== S_OK
, "got %08x\n", hr
);
204 hr
= IUnknown_QueryInterface(output
, &IID_IXmlWriterOutput
, (void**)&unk
);
205 ok(hr
== S_OK
, "got %08x\n", hr
);
206 ok(unk
!= NULL
, "got %p\n", unk
);
207 /* releasing 'unk' crashes on native */
208 IUnknown_Release(output
);
211 hr
= pCreateXmlWriterOutputWithEncodingCodePage(&testoutput
, NULL
, ~0u, &output
);
212 ok(hr
== S_OK
, "got %08x\n", hr
);
213 IUnknown_Release(output
);
215 hr
= pCreateXmlWriterOutputWithEncodingCodePage(&testoutput
, NULL
, CP_UTF8
, &output
);
216 ok(hr
== S_OK
, "got %08x\n", hr
);
218 hr
= IUnknown_QueryInterface(output
, &IID_IXmlWriterOutput
, (void**)&unk
);
219 ok(hr
== S_OK
, "got %08x\n", hr
);
220 ok(unk
!= NULL
, "got %p\n", unk
);
221 /* releasing 'unk' crashes on native */
222 IUnknown_Release(output
);
225 static void test_writestartdocument(void)
227 static const char fullprolog
[] = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
228 static const char prologversion
[] = "<?xml version=\"1.0\"?>";
229 static const WCHAR versionW
[] = {'v','e','r','s','i','o','n','=','"','1','.','0','"',0};
230 static const WCHAR xmlW
[] = {'x','m','l',0};
237 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
238 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
241 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
242 ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
244 hr
= IXmlWriter_WriteProcessingInstruction(writer
, xmlW
, versionW
);
245 ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
247 hr
= IXmlWriter_Flush(writer
);
248 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
250 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
251 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
253 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
254 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
256 /* nothing written yet */
257 hr
= IXmlWriter_Flush(writer
);
258 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
260 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
261 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
263 hr
= IXmlWriter_Flush(writer
);
264 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
266 hr
= GetHGlobalFromStream(stream
, &hglobal
);
267 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
269 ptr
= GlobalLock(hglobal
);
270 ok(!strncmp(ptr
, fullprolog
, strlen(fullprolog
)), "got %s, expected %s\n", ptr
, fullprolog
);
271 GlobalUnlock(hglobal
);
274 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
275 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
276 IStream_Release(stream
);
278 /* now add PI manually, and try to start a document */
279 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
280 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
282 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
283 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
285 hr
= IXmlWriter_WriteProcessingInstruction(writer
, xmlW
, versionW
);
286 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
288 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
289 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
291 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
292 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
294 /* another attempt to add 'xml' PI */
295 hr
= IXmlWriter_WriteProcessingInstruction(writer
, xmlW
, versionW
);
296 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
298 hr
= IXmlWriter_Flush(writer
);
299 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
301 hr
= GetHGlobalFromStream(stream
, &hglobal
);
302 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
304 ptr
= GlobalLock(hglobal
);
305 ok(!strncmp(ptr
, prologversion
, strlen(prologversion
)), "got %s\n", ptr
);
306 GlobalUnlock(hglobal
);
308 IStream_Release(stream
);
309 IXmlWriter_Release(writer
);
312 static void test_flush(void)
317 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
318 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
320 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)&teststream
);
321 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
323 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
324 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
327 hr
= IXmlWriter_Flush(writer
);
328 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
329 ok(g_write_len
> 0, "got %d\n", g_write_len
);
332 hr
= IXmlWriter_Flush(writer
);
333 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
334 ok(g_write_len
== 0, "got %d\n", g_write_len
);
336 /* Release() flushes too */
338 IXmlWriter_Release(writer
);
339 ok(g_write_len
== 0, "got %d\n", g_write_len
);
342 static void test_omitxmldeclaration(void)
344 static const char prologversion
[] = "<?xml version=\"1.0\"?>";
345 static const WCHAR versionW
[] = {'v','e','r','s','i','o','n','=','"','1','.','0','"',0};
346 static const WCHAR xmlW
[] = {'x','m','l',0};
353 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
354 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
356 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
357 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
359 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
360 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
362 hr
= IXmlWriter_SetProperty(writer
, XmlWriterProperty_OmitXmlDeclaration
, TRUE
);
363 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
365 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
366 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
368 hr
= IXmlWriter_Flush(writer
);
369 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
371 hr
= GetHGlobalFromStream(stream
, &hglobal
);
372 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
374 ptr
= GlobalLock(hglobal
);
375 ok(!ptr
, "got %p\n", ptr
);
376 GlobalUnlock(hglobal
);
379 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
380 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
382 IStream_Release(stream
);
384 /* now add PI manually, and try to start a document */
385 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
386 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
388 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
389 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
391 hr
= IXmlWriter_WriteProcessingInstruction(writer
, xmlW
, versionW
);
392 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
394 hr
= IXmlWriter_Flush(writer
);
395 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
397 hr
= GetHGlobalFromStream(stream
, &hglobal
);
398 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
400 ptr
= GlobalLock(hglobal
);
401 ok(!strncmp(ptr
, prologversion
, strlen(prologversion
)), "got %s\n", ptr
);
402 GlobalUnlock(hglobal
);
404 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
405 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
407 hr
= IXmlWriter_Flush(writer
);
408 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
410 ptr
= GlobalLock(hglobal
);
411 ok(!strncmp(ptr
, prologversion
, strlen(prologversion
)), "got %s\n", ptr
);
412 GlobalUnlock(hglobal
);
414 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
415 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
417 hr
= IXmlWriter_Flush(writer
);
418 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
420 ptr
= GlobalLock(hglobal
);
421 ok(!strncmp(ptr
, prologversion
, strlen(prologversion
)), "got %s\n", ptr
);
422 GlobalUnlock(hglobal
);
424 /* another attempt to add 'xml' PI */
425 hr
= IXmlWriter_WriteProcessingInstruction(writer
, xmlW
, versionW
);
426 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
428 hr
= IXmlWriter_Flush(writer
);
429 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
431 IStream_Release(stream
);
432 IXmlWriter_Release(writer
);
435 static void test_bom(void)
437 static const WCHAR versionW
[] = {'v','e','r','s','i','o','n','=','"','1','.','0','"',0};
438 static const WCHAR utf16W
[] = {'u','t','f','-','1','6',0};
439 static const WCHAR xmlW
[] = {'x','m','l',0};
440 static const WCHAR aW
[] = {'a',0};
441 IXmlWriterOutput
*output
;
448 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
449 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
451 hr
= pCreateXmlWriterOutputWithEncodingName((IUnknown
*)stream
, NULL
, utf16W
, &output
);
452 ok(hr
== S_OK
, "got %08x\n", hr
);
454 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
455 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
457 hr
= IXmlWriter_SetProperty(writer
, XmlWriterProperty_OmitXmlDeclaration
, TRUE
);
458 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
460 hr
= IXmlWriter_SetOutput(writer
, output
);
461 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
463 /* BOM is on by default */
464 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
465 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
467 hr
= IXmlWriter_Flush(writer
);
468 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
470 hr
= GetHGlobalFromStream(stream
, &hglobal
);
471 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
473 ptr
= GlobalLock(hglobal
);
474 ok(ptr
[0] == 0xff && ptr
[1] == 0xfe, "got %x,%x\n", ptr
[0], ptr
[1]);
475 GlobalUnlock(hglobal
);
477 IStream_Release(stream
);
478 IUnknown_Release(output
);
481 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
482 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
484 hr
= pCreateXmlWriterOutputWithEncodingName((IUnknown
*)stream
, NULL
, utf16W
, &output
);
485 ok(hr
== S_OK
, "got %08x\n", hr
);
487 hr
= IXmlWriter_SetOutput(writer
, output
);
488 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
490 hr
= IXmlWriter_WriteProcessingInstruction(writer
, xmlW
, versionW
);
491 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
493 hr
= IXmlWriter_Flush(writer
);
494 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
496 hr
= GetHGlobalFromStream(stream
, &hglobal
);
497 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
499 ptr
= GlobalLock(hglobal
);
500 ok(ptr
[0] == 0xff && ptr
[1] == 0xfe, "got %x,%x\n", ptr
[0], ptr
[1]);
501 GlobalUnlock(hglobal
);
503 IUnknown_Release(output
);
504 IStream_Release(stream
);
506 /* start with element */
507 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
508 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
510 hr
= pCreateXmlWriterOutputWithEncodingName((IUnknown
*)stream
, NULL
, utf16W
, &output
);
511 ok(hr
== S_OK
, "got %08x\n", hr
);
513 hr
= IXmlWriter_SetOutput(writer
, output
);
514 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
516 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
517 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
519 hr
= IXmlWriter_Flush(writer
);
520 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
522 hr
= GetHGlobalFromStream(stream
, &hglobal
);
523 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
525 ptr
= GlobalLock(hglobal
);
526 ok(ptr
[0] == 0xff && ptr
[1] == 0xfe, "got %x,%x\n", ptr
[0], ptr
[1]);
527 GlobalUnlock(hglobal
);
529 IUnknown_Release(output
);
530 IStream_Release(stream
);
532 /* WriteElementString */
533 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
534 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
536 hr
= pCreateXmlWriterOutputWithEncodingName((IUnknown
*)stream
, NULL
, utf16W
, &output
);
537 ok(hr
== S_OK
, "got %08x\n", hr
);
539 hr
= IXmlWriter_SetOutput(writer
, output
);
540 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
542 hr
= IXmlWriter_WriteElementString(writer
, NULL
, aW
, NULL
, NULL
);
543 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
545 hr
= IXmlWriter_Flush(writer
);
546 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
548 hr
= GetHGlobalFromStream(stream
, &hglobal
);
549 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
551 ptr
= GlobalLock(hglobal
);
552 ok(ptr
[0] == 0xff && ptr
[1] == 0xfe, "got %x,%x\n", ptr
[0], ptr
[1]);
553 GlobalUnlock(hglobal
);
555 IUnknown_Release(output
);
556 IStream_Release(stream
);
558 IXmlWriter_Release(writer
);
561 static void test_writestartelement(void)
563 static const WCHAR valueW
[] = {'v','a','l','u','e',0};
564 static const char *str
= "<a><b>value</b>";
565 static const WCHAR aW
[] = {'a',0};
566 static const WCHAR bW
[] = {'b',0};
573 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
574 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
576 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
577 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
579 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
580 ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
582 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
583 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
585 hr
= IXmlWriter_WriteStartElement(writer
, aW
, NULL
, NULL
);
586 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
588 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, NULL
, NULL
);
589 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
591 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, NULL
, aW
);
592 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
594 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
595 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
597 hr
= GetHGlobalFromStream(stream
, &hglobal
);
598 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
600 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
601 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
603 hr
= IXmlWriter_Flush(writer
);
604 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
606 ptr
= GlobalLock(hglobal
);
607 ok(!strncmp(ptr
, "<a", 2), "got %s\n", ptr
);
608 GlobalUnlock(hglobal
);
610 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Yes
);
611 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
613 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, NULL
, NULL
);
614 ok(hr
== E_INVALIDARG
, "got 0x%08x\n", hr
);
616 hr
= IXmlWriter_WriteProcessingInstruction(writer
, aW
, aW
);
617 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
619 IStream_Release(stream
);
620 IXmlWriter_Release(writer
);
622 /* WriteElementString */
623 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
624 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
626 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
627 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
629 hr
= IXmlWriter_WriteElementString(writer
, NULL
, bW
, NULL
, valueW
);
630 ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
632 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
633 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
635 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
636 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
638 hr
= IXmlWriter_WriteElementString(writer
, NULL
, bW
, NULL
, valueW
);
639 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
641 hr
= IXmlWriter_Flush(writer
);
642 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
644 hr
= GetHGlobalFromStream(stream
, &hglobal
);
645 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
647 ptr
= GlobalLock(hglobal
);
648 ok(!strncmp(ptr
, str
, strlen(str
)), "got %s\n", ptr
);
649 GlobalUnlock(hglobal
);
651 IStream_Release(stream
);
652 IXmlWriter_Release(writer
);
655 static void test_writeendelement(void)
657 static const WCHAR aW
[] = {'a',0};
658 static const WCHAR bW
[] = {'b',0};
665 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
666 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
668 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
669 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
671 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
672 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
674 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
675 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
677 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, bW
, NULL
);
678 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
680 hr
= IXmlWriter_WriteEndElement(writer
);
681 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
683 hr
= IXmlWriter_WriteEndElement(writer
);
684 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
686 hr
= GetHGlobalFromStream(stream
, &hglobal
);
687 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
689 hr
= IXmlWriter_Flush(writer
);
690 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
692 ptr
= GlobalLock(hglobal
);
693 ok(!strncmp(ptr
, "<a><b /></a>", 12), "got %s\n", ptr
);
694 GlobalUnlock(hglobal
);
696 IXmlWriter_Release(writer
);
697 IStream_Release(stream
);
700 static void test_writeenddocument(void)
702 static const WCHAR aW
[] = {'a',0};
703 static const WCHAR bW
[] = {'b',0};
710 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
711 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
713 hr
= pCreateXmlWriter(&IID_IXmlWriter
, (void**)&writer
, NULL
);
714 ok(hr
== S_OK
, "Expected S_OK, got %08x\n", hr
);
716 hr
= IXmlWriter_WriteEndDocument(writer
);
717 ok(hr
== E_UNEXPECTED
, "got 0x%08x\n", hr
);
719 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
720 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
722 /* WriteEndDocument resets it to initial state */
723 hr
= IXmlWriter_WriteEndDocument(writer
);
724 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
726 hr
= IXmlWriter_WriteEndDocument(writer
);
727 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
729 hr
= IXmlWriter_WriteStartDocument(writer
, XmlStandalone_Omit
);
730 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
732 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
733 ok(hr
== WR_E_INVALIDACTION
, "got 0x%08x\n", hr
);
735 hr
= IXmlWriter_SetOutput(writer
, (IUnknown
*)stream
);
736 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
738 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, aW
, NULL
);
739 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
741 hr
= IXmlWriter_WriteStartElement(writer
, NULL
, bW
, NULL
);
742 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
744 hr
= IXmlWriter_WriteEndDocument(writer
);
745 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
747 hr
= GetHGlobalFromStream(stream
, &hglobal
);
748 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
750 ptr
= GlobalLock(hglobal
);
751 ok(ptr
== NULL
, "got %p\n", ptr
);
753 /* we still need to flush manually, WriteEndDocument doesn't do that */
754 hr
= IXmlWriter_Flush(writer
);
755 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
757 ptr
= GlobalLock(hglobal
);
758 ok(ptr
!= NULL
, "got %p\n", ptr
);
759 ok(!strncmp(ptr
, "<a><b /></a>", 12), "got %s\n", ptr
);
760 GlobalUnlock(hglobal
);
762 IXmlWriter_Release(writer
);
763 IStream_Release(stream
);
768 if (!init_pointers())
771 test_writer_create();
773 test_writestartdocument();
774 test_writestartelement();
775 test_writeendelement();
777 test_omitxmldeclaration();
779 test_writeenddocument();