[MSXML3_WINETEST]

* Sync with Wine 1.7.1.
CORE-7469
ROSTESTS-100 #resolve #comment Fixed by the r60340 sync.

svn path=/trunk/; revision=60340
This commit is contained in:
Amine Khaldi 2013-09-23 11:39:45 +00:00
parent eb591dfbc1
commit 1252ff634f
4 changed files with 347 additions and 59 deletions

View file

@ -1,6 +1,4 @@
add_definitions(-D__ROS_LONG64__)
list(APPEND SOURCE
domdoc.c
httpreq.c
@ -14,7 +12,6 @@ list(APPEND SOURCE
add_executable(msxml3_winetest ${SOURCE} rsrc.rc)
add_idl_headers(xmlparser_idlheader_test xmlparser.idl)
add_dependencies(msxml3_winetest xmlparser_idlheader_test)
target_link_libraries(msxml3_winetest wine)
set_module_type(msxml3_winetest win32cui)
add_importlibs(msxml3_winetest user32 ole32 oleaut32 msvcrt kernel32 ntdll)
add_cd_file(TARGET msxml3_winetest DESTINATION reactos/bin FOR all)

View file

@ -395,6 +395,15 @@ static const WCHAR szComplete6[] = {
'<','o','p','e','n','>','<','/','o','p','e','n','>','\n',0
};
static const char complete7[] = {
"<?xml version=\"1.0\"?>\n\t"
"<root>\n"
"\t<a/>\n"
"\t<b/>\n"
"\t<c/>\n"
"</root>"
};
#define DECL_WIN_1252 \
"<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
@ -445,6 +454,13 @@ static const char szExampleXML[] =
" </elem>\n"
"</root>\n";
static const char charrefsxml[] =
"<?xml version='1.0'?>"
"<a>"
"<b1> Text &#65; end </b1>"
"<b2>&#65;&#66; &#67; </b2>"
"</a>";
static const CHAR szNodeTypesXML[] =
"<?xml version='1.0'?>"
"<!-- comment node 0 -->"
@ -4190,10 +4206,62 @@ static inline void _check_ws_preserved(int line, IXMLDOMDocument2* doc, char con
IXMLDOMNode_Release(node2);
}
static void test_preserve_charref(IXMLDOMDocument2 *doc, VARIANT_BOOL preserve)
{
static const WCHAR b1_p[] = {' ','T','e','x','t',' ','A',' ','e','n','d',' ',0};
static const WCHAR b1_i[] = {'T','e','x','t',' ','A',' ','e','n','d',0};
static const WCHAR b2_p[] = {'A','B',' ','C',' ',0};
static const WCHAR b2_i[] = {'A','B',' ','C',0};
IXMLDOMNodeList *list;
IXMLDOMElement *root;
IXMLDOMNode *node;
const WCHAR *text;
VARIANT_BOOL b;
HRESULT hr;
BSTR s;
hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc, preserve);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMDocument2_loadXML(doc, _bstr_(charrefsxml), &b);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMDocument2_get_documentElement(doc, &root);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMElement_get_childNodes(root, &list);
ok(hr == S_OK, "got 0x%08x\n", hr);
IXMLDOMElement_Release(root);
text = preserve == VARIANT_TRUE ? b1_p : b1_i;
hr = IXMLDOMNodeList_get_item(list, 0, &node);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMNode_get_text(node, &s);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(s, text), "0x%x, got %s\n", preserve, wine_dbgstr_w(s));
SysFreeString(s);
IXMLDOMNode_Release(node);
text = preserve == VARIANT_TRUE ? b2_p : b2_i;
hr = IXMLDOMNodeList_get_item(list, 1, &node);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMNode_get_text(node, &s);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(s, text), "0x%x, got %s\n", preserve, wine_dbgstr_w(s));
SysFreeString(s);
IXMLDOMNode_Release(node);
IXMLDOMNodeList_Release(list);
}
static void test_whitespace(void)
{
VARIANT_BOOL b;
IXMLDOMDocument2 *doc1, *doc2, *doc3, *doc4;
IXMLDOMNodeList *list;
IXMLDOMElement *root;
VARIANT_BOOL b;
HRESULT hr;
LONG len;
doc1 = create_document(&IID_IXMLDOMDocument2);
doc2 = create_document(&IID_IXMLDOMDocument2);
@ -4260,10 +4328,35 @@ static void test_whitespace(void)
check_ws_preserved(doc3, NULL);
check_ws_ignored(doc4, NULL);
IXMLDOMDocument2_Release(doc1);
IXMLDOMDocument2_Release(doc2);
IXMLDOMDocument2_Release(doc3);
IXMLDOMDocument2_Release(doc4);
/* text with char references */
test_preserve_charref(doc1, VARIANT_TRUE);
test_preserve_charref(doc1, VARIANT_FALSE);
/* formatting whitespaces */
hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_FALSE);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMDocument2_loadXML(doc1, _bstr_(complete7), &b);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(b == VARIANT_TRUE, "for %x\n", b);
hr = IXMLDOMDocument2_get_documentElement(doc1, &root);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMElement_get_childNodes(root, &list);
ok(hr == S_OK, "got 0x%08x\n", hr);
len = 0;
hr = IXMLDOMNodeList_get_length(list, &len);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(len == 3, "got %d\n", len);
IXMLDOMNodeList_Release(list);
IXMLDOMElement_Release(root);
IXMLDOMDocument2_Release(doc1);
free_bstrs();
}
@ -4304,9 +4397,49 @@ static const selection_ns_t selection_ns_data[] = {
{ NULL }
};
typedef struct {
const char *query;
const char *list;
} xpath_test_t;
static const xpath_test_t xpath_test[] = {
{ "*/a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" },
{ "*/b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" },
{ "*/c", "E3.E1.E2.D1 E3.E2.E2.D1" },
{ "*/d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" },
{ "//a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" },
{ "//b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" },
{ "//c", "E3.E1.E2.D1 E3.E2.E2.D1" },
{ "//d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" },
{ "//c[@type]", "E3.E2.E2.D1" },
{ "//c[@type]/ancestor::node()[1]", "E2.E2.D1" },
{ "//c[@type]/ancestor-or-self::node()[1]", "E3.E2.E2.D1" },
{ "//c[@type]/attribute::node()[1]", "A'type'.E3.E2.E2.D1" },
{ "//c[@type]/child::node()[1]", "T1.E3.E2.E2.D1" },
{ "//c[@type]/descendant::node()[1]", "T1.E3.E2.E2.D1" },
{ "//c[@type]/descendant-or-self::node()[1]", "E3.E2.E2.D1" },
{ "//c[@type]/following::node()[1]", "E4.E2.E2.D1" },
{ "//c[@type]/following-sibling::node()[1]", "E4.E2.E2.D1" },
{ "//c[@type]/parent::node()[1]", "E2.E2.D1" },
{ "//c[@type]/preceding::node()[1]", "T1.E2.E2.E2.D1" },
{ "//c[@type]/self::node()[1]", "E3.E2.E2.D1" },
{ "child::*", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
{ "child::node()", "E1.E2.D1 E2.E2.D1 E3.E2.D1 E4.E2.D1" },
{ "child::text()", "" },
{ "child::*/..", "E2.D1" },
{ "child::*//@*/..", "E2.E5.E1.E2.D1 E3.E2.E2.D1" },
{ "self::node()", "E2.D1" },
{ "ancestor::node()", "D1" },
{ "elem[c][last()]/a", "E1.E2.E2.D1"},
{ "ancestor-or-self::node()[1]", "E2.D1" },
{ "((//a)[1])[last()]", "E1.E1.E2.D1" },
{ NULL }
};
static void test_XPath(void)
{
const selection_ns_t *ptr = selection_ns_data;
const xpath_test_t *xptest = xpath_test;
VARIANT var;
VARIANT_BOOL b;
IXMLDOMDocument2 *doc;
@ -4349,6 +4482,26 @@ static void test_XPath(void)
EXPECT_HR(hr, S_OK);
expect_list_and_release(list, "E2.D1");
/* peform xpath tests */
for ( ; xptest->query ; xptest++ )
{
char *str;
hr = IXMLDOMNode_selectNodes(rootNode, _bstr_(xptest->query), &list);
ok(hr == S_OK, "query evaluation failed for query=%s\n", xptest->query);
if (hr != S_OK)
continue;
str = list_to_string(list);
ok(strcmp(str, xptest->list)==0, "query=%s, invalid node list: %s, expected %s\n",
xptest->query, str, xptest->list);
if (list)
IXMLDOMNodeList_Release(list);
}
if (0)
{
/* namespace:: axis test is disabled until namespace definitions
@ -11475,6 +11628,99 @@ static void test_xsltext(void)
free_bstrs();
}
struct attrtest_t {
const char *name;
const char *uri;
const char *prefix;
const char *href;
};
static struct attrtest_t attrtests[] = {
{ "xmlns", "http://www.w3.org/2000/xmlns/", "xmlns", "xmlns" },
{ "xmlns", "nondefaulturi", "xmlns", "xmlns" },
{ "c", "http://www.w3.org/2000/xmlns/", NULL, "http://www.w3.org/2000/xmlns/" },
{ "c", "nsref1", NULL, "nsref1" },
{ "ns:c", "nsref1", "ns", "nsref1" },
{ "xmlns:c", "http://www.w3.org/2000/xmlns/", "xmlns", "" },
{ "xmlns:c", "nondefaulturi", "xmlns", "" },
{ 0 }
};
static void test_create_attribute(void)
{
struct attrtest_t *ptr = attrtests;
IXMLDOMElement *el;
IXMLDOMDocument *doc;
IXMLDOMNode *node, *node2;
VARIANT var;
HRESULT hr;
int i = 0;
BSTR str;
doc = create_document(&IID_IXMLDOMDocument);
while (ptr->name)
{
V_VT(&var) = VT_I1;
V_I1(&var) = NODE_ATTRIBUTE;
hr = IXMLDOMDocument_createNode(doc, var, _bstr_(ptr->name), _bstr_(ptr->uri), &node);
ok(hr == S_OK, "got 0x%08x\n", hr);
str = NULL;
hr = IXMLDOMNode_get_prefix(node, &str);
if (ptr->prefix)
{
ok(hr == S_OK, "%d: got 0x%08x\n", i, hr);
ok(!lstrcmpW(str, _bstr_(ptr->prefix)), "%d: got prefix %s, expected %s\n", i, wine_dbgstr_w(str), ptr->prefix);
}
else
{
ok(hr == S_FALSE, "%d: got 0x%08x\n", i, hr);
ok(str == NULL, "%d: got prefix %s\n", i, wine_dbgstr_w(str));
}
str = NULL;
hr = IXMLDOMNode_get_namespaceURI(node, &str);
ok(hr == S_OK, "%d: got 0x%08x\n", i, hr);
ok(!lstrcmpW(str, _bstr_(ptr->href)), "%d: got uri %s, expected %s\n", i, wine_dbgstr_w(str), ptr->href);
SysFreeString(str);
IXMLDOMNode_Release(node);
free_bstrs();
i++;
ptr++;
}
V_VT(&var) = VT_I1;
V_I1(&var) = NODE_ELEMENT;
hr = IXMLDOMDocument_createNode(doc, var, _bstr_("e"), NULL, &node2);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMNode_QueryInterface(node2, &IID_IXMLDOMElement, (void**)&el);
ok(hr == S_OK, "got 0x%08x\n", hr);
IXMLDOMNode_Release(node2);
V_VT(&var) = VT_I1;
V_I1(&var) = NODE_ATTRIBUTE;
hr = IXMLDOMDocument_createNode(doc, var, _bstr_("xmlns:a"), _bstr_("http://www.w3.org/2000/xmlns/"), &node);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IXMLDOMElement_setAttributeNode(el, (IXMLDOMAttribute*)node, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
/* for some reason default namespace uri is not reported */
hr = IXMLDOMNode_get_namespaceURI(node, &str);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(!lstrcmpW(str, _bstr_("")), "got uri %s\n", wine_dbgstr_w(str));
SysFreeString(str);
IXMLDOMNode_Release(node);
IXMLDOMElement_Release(el);
IXMLDOMDocument_Release(doc);
free_bstrs();
}
START_TEST(domdoc)
{
IXMLDOMDocument *doc;
@ -11531,6 +11777,7 @@ START_TEST(domdoc)
test_setAttributeNode();
test_put_dataType();
test_createNode();
test_create_attribute();
test_get_prefix();
test_default_properties();
test_selectSingleNode();

View file

@ -1443,12 +1443,6 @@ static void test_XMLHTTP(void)
HRESULT hr;
HGLOBAL g;
if (!winetest_interactive)
{
skip("test_XMLHTTP skipped, ROSTESTS-100\n");
return;
}
xhr = create_xhr();
VariantInit(&dummy);
@ -1699,58 +1693,28 @@ static void test_XMLHTTP(void)
IDispatch_Release(event);
/* interaction with object site */
EXPECT_REF(xhr, 1);
hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site);
EXPECT_HR(hr, S_OK);
todo_wine {
EXPECT_REF(xhr, 1);
EXPECT_REF(obj_site, 1);
}
hr = IObjectWithSite_SetSite(obj_site, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
IObjectWithSite_AddRef(obj_site);
todo_wine {
EXPECT_REF(obj_site, 2);
EXPECT_REF(xhr, 1);
}
IObjectWithSite_Release(obj_site);
hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site2);
EXPECT_HR(hr, S_OK);
todo_wine {
EXPECT_REF(xhr, 1);
EXPECT_REF(obj_site, 1);
EXPECT_REF(obj_site2, 1);
ok(obj_site != obj_site2, "expected new instance\n");
}
IObjectWithSite_Release(obj_site);
ok(obj_site == obj_site2 || broken(obj_site != obj_site2), "got new instance\n");
IObjectWithSite_Release(obj_site2);
set_xhr_site(xhr);
/* try to set site another time */
/* to be removed once IObjectWithSite is properly separated */
SET_EXPECT(site_qi_IServiceProvider);
SET_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2);
hr = IObjectWithSite_SetSite(obj_site2, &testsite);
hr = IObjectWithSite_SetSite(obj_site, &testsite);
EXPECT_HR(hr, S_OK);
todo_wine EXPECT_REF(xhr, 1);
IObjectWithSite_Release(obj_site);
IXMLHttpRequest_Release(xhr);
/* still works after request is released */
/* to be removed once IObjectWithSite is properly separated */
SET_EXPECT(site_qi_IServiceProvider);
SET_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2);
hr = IObjectWithSite_SetSite(obj_site2, &testsite);
EXPECT_HR(hr, S_OK);
IObjectWithSite_Release(obj_site2);
free_bstrs();
}

View file

@ -39,6 +39,7 @@
//#include "ocidl.h"
#include <dispex.h>
static const WCHAR emptyW[] = {0};
#define EXPECT_HR(hr,hr_exp) \
ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
@ -891,10 +892,10 @@ static struct call_entry xmlspaceattr_test_alternate[] = {
/* attribute value normalization test */
static const char attribute_normalize[] =
"<?xml version=\"1.0\" ?>\n"
"<a attr1=\" \r \n \tattr_value &#65; \t \r \n\r\n \n\"/>\n";
"<a attr1=\" \r \n \tattr_value &#65; &#38; &amp;\t \r \n\r\n \n\"/>\n";
static struct attribute_entry attribute_norm_attrs[] = {
{ "", "attr1", "attr1", " attr_value A " },
{ "", "attr1", "attr1", " attr_value A & & " },
{ NULL }
};
@ -1556,8 +1557,8 @@ static HRESULT WINAPI isaxattributes_getValue(ISAXAttributes* iface, int index,
{
static const WCHAR attrvaluesW[][10] = {{'a','1','j','u','n','k',0},
{'a','2','j','u','n','k',0},
{'<','&','"','>',0}};
static const int attrvalueslen[] = {2, 2, 4};
{'<','&','"','>','\'',0}};
static const int attrvalueslen[] = {2, 2, 5};
ok(index >= 0 && index <= 2, "invalid index received %d\n", index);
@ -2895,7 +2896,6 @@ static void test_mxwriter_default_properties(const struct mxwriter_props_t *tabl
static void test_mxwriter_properties(void)
{
static const WCHAR utf16W[] = {'U','T','F','-','1','6',0};
static const WCHAR emptyW[] = {0};
static const WCHAR testW[] = {'t','e','s','t',0};
ISAXContentHandler *content;
IMXWriter *writer;
@ -3046,7 +3046,6 @@ static void test_mxwriter_properties(void)
static void test_mxwriter_flush(void)
{
static const WCHAR emptyW[] = {0};
ISAXContentHandler *content;
IMXWriter *writer;
LARGE_INTEGER pos;
@ -3336,9 +3335,9 @@ struct writer_startendelement_t {
ISAXAttributes *attr;
};
static const char startelement_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"&lt;&amp;&quot;&gt;\">";
static const char startendelement_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"&lt;&amp;&quot;&gt;\"/>";
static const char startendelement_noescape_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&\">\"/>";
static const char startelement_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"&lt;&amp;&quot;&gt;\'\">";
static const char startendelement_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"&lt;&amp;&quot;&gt;\'\"/>";
static const char startendelement_noescape_xml[] = "<uri:local a:attr1=\"a1\" attr2=\"a2\" attr3=\"<&\">\'\"/>";
static const struct writer_startendelement_t writer_startendelement[] = {
/* 0 */
@ -3717,7 +3716,8 @@ static void test_mxwriter_startendelement(void)
ok(!lstrcmpW(_bstr_("<abc>"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest)));
VariantClear(&dest);
ISAXContentHandler_endDocument(content);
hr = ISAXContentHandler_endDocument(content);
EXPECT_HR(hr, S_OK);
IMXWriter_flush(writer);
hr = ISAXContentHandler_endElement(content, _bstr_(""), 0, _bstr_(""), 0, _bstr_("abdcdef"), 3);
@ -3755,10 +3755,10 @@ struct writer_characters_t {
};
static const struct writer_characters_t writer_characters[] = {
{ &CLSID_MXXMLWriter, "< > & \"", "&lt; &gt; &amp; \"" },
{ &CLSID_MXXMLWriter30, "< > & \"", "&lt; &gt; &amp; \"" },
{ &CLSID_MXXMLWriter40, "< > & \"", "&lt; &gt; &amp; \"" },
{ &CLSID_MXXMLWriter60, "< > & \"", "&lt; &gt; &amp; \"" },
{ &CLSID_MXXMLWriter, "< > & \" \'", "&lt; &gt; &amp; \" \'" },
{ &CLSID_MXXMLWriter30, "< > & \" \'", "&lt; &gt; &amp; \" \'" },
{ &CLSID_MXXMLWriter40, "< > & \" \'", "&lt; &gt; &amp; \" \'" },
{ &CLSID_MXXMLWriter60, "< > & \" \'", "&lt; &gt; &amp; \" \'" },
{ NULL }
};
@ -4743,6 +4743,28 @@ static void test_mxwriter_dtd(void)
ok(!lstrcmpW(_bstr_("<!ENTITY name \"value\">\r\n"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest)));
VariantClear(&dest);
/* external entities */
V_VT(&dest) = VT_EMPTY;
hr = IMXWriter_put_output(writer, dest);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = ISAXDeclHandler_externalEntityDecl(decl, NULL, 0, NULL, 0, NULL, 0);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), -1, NULL, 0, NULL, 0);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
hr = ISAXDeclHandler_externalEntityDecl(decl, _bstr_("name"), strlen("name"), _bstr_("pubid"), strlen("pubid"),
_bstr_("sysid"), strlen("sysid"));
ok(hr == S_OK, "got 0x%08x\n", hr);
V_VT(&dest) = VT_EMPTY;
hr = IMXWriter_get_output(writer, &dest);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest));
ok(!lstrcmpW(_bstr_("<!ENTITY name PUBLIC \"pubid\" \"sysid\">\r\n"), V_BSTR(&dest)), "got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest)));
VariantClear(&dest);
ISAXContentHandler_Release(content);
ISAXLexicalHandler_Release(lexical);
ISAXDeclHandler_Release(decl);
@ -5249,6 +5271,63 @@ static void test_mxattr_localname(void)
}
}
static void test_mxwriter_indent(void)
{
ISAXContentHandler *content;
IMXWriter *writer;
VARIANT dest;
HRESULT hr;
hr = CoCreateInstance(&CLSID_MXXMLWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void**)&writer);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
hr = IMXWriter_put_indent(writer, VARIANT_TRUE);
ok(hr == S_OK, "got %08x\n", hr);
hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&content);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_startDocument(content);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_startElement(content, emptyW, 0, emptyW, 0, _bstr_("a"), -1, NULL);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_characters(content, _bstr_(""), 0);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_startElement(content, emptyW, 0, emptyW, 0, _bstr_("b"), -1, NULL);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_startElement(content, emptyW, 0, emptyW, 0, _bstr_("c"), -1, NULL);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_endElement(content, emptyW, 0, emptyW, 0, _bstr_("c"), -1);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_endElement(content, emptyW, 0, emptyW, 0, _bstr_("b"), -1);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_endElement(content, emptyW, 0, emptyW, 0, _bstr_("a"), -1);
ok(hr == S_OK, "got %08x\n", hr);
hr = ISAXContentHandler_endDocument(content);
ok(hr == S_OK, "got %08x\n", hr);
V_VT(&dest) = VT_EMPTY;
hr = IMXWriter_get_output(writer, &dest);
ok(hr == S_OK, "got %08x\n", hr);
ok(V_VT(&dest) == VT_BSTR, "got %d\n", V_VT(&dest));
ok(!lstrcmpW(_bstr_("<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\r\n<a><b>\r\n\t\t<c/>\r\n\t</b>\r\n</a>"), V_BSTR(&dest)),
"got wrong content %s\n", wine_dbgstr_w(V_BSTR(&dest)));
VariantClear(&dest);
ISAXContentHandler_Release(content);
IMXWriter_Release(writer);
free_bstrs();
}
START_TEST(saxreader)
{
ISAXXMLReader *reader;
@ -5296,6 +5375,7 @@ START_TEST(saxreader)
test_mxwriter_stream();
test_mxwriter_encoding();
test_mxwriter_dispex();
test_mxwriter_indent();
}
else
win_skip("MXXMLWriter not supported\n");