Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
-- v2: msxml3/tests: Add more tests for supported interfaces. msxml3/tests: Add more tests for document properties. msxml3/tests: Add some tests for "xmldecl-encoding". msxml3/tests: Add some tests for IXMLDocument::get_charset(). msxml3/sax: Add basic support for startDTD()/endDTD(). msxml3/sax: Add processing instructions callback. msxml3/tests: Add some SAX tests for PI nodes.
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/saxreader.c | 41 +++++++++++++++++++++++++++++++++++ dlls/msxml6/tests/saxreader.c | 24 ++++++++++++++++++++ 2 files changed, 65 insertions(+)
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index cba3e5c6a63..06c0ad30037 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -595,6 +595,9 @@ static const char test2_cdata_xml[] = static const char test3_cdata_xml[] = "<?xml version=\"1.0\" ?><a><![CDATA[Some text data]]></a>";
+static const char test_pi_xml[] = +"<?xml version=\"1.0\" ?><a><?t some text ?></a>"; + static struct call_entry content_handler_test1[] = { { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK }, { CH_STARTDOCUMENT, 0, 0, S_OK }, @@ -928,6 +931,28 @@ static struct call_entry cdata_test3[] = { { CH_ENDTEST } };
+static struct call_entry pi_test[] = +{ + { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK }, + { CH_STARTDOCUMENT, 0, 0, S_OK }, + { CH_STARTELEMENT, 1, 26, S_OK, "", "a", "a" }, + { CH_PROCESSINGINSTRUCTION, 1, 30, S_OK, "t", "some text " }, + { CH_ENDELEMENT, 1, 44, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 0, 0, S_OK }, + { CH_ENDTEST } +}; + +static struct call_entry pi_test_v4[] = +{ + { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK }, + { CH_STARTDOCUMENT, 1, 22, S_OK }, + { CH_STARTELEMENT, 1, 25, S_OK, "", "a", "a" }, + { CH_PROCESSINGINSTRUCTION, 1, 41, S_OK, "t", "some text " }, + { CH_ENDELEMENT, 1, 45, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 1, 45, S_OK }, + { CH_ENDTEST } +}; + /* this is what MSXML6 does */ static struct call_entry cdata_test_alt[] = { { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK }, @@ -2513,6 +2538,22 @@ static void test_saxreader(void)
IStream_Release(stream);
+ /* PI */ + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown *)create_test_stream(test_pi_xml, -1); + + if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader40)) + test_seq = pi_test_v4; + else + test_seq = pi_test; + + set_expected_seq(test_seq); + hr = ISAXXMLReader_parse(reader, var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + sprintf(seqname, "%s: pi test", table->name); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, seqname, TRUE); + VariantClear(&var); + ISAXXMLReader_Release(reader); table++; } diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 3db2619e5ad..6daff9f400d 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -534,6 +534,9 @@ static const char test2_cdata_xml[] = static const char test3_cdata_xml[] = "<?xml version=\"1.0\" ?><a><![CDATA[Some text data]]></a>";
+static const char test_pi_xml[] = +"<?xml version=\"1.0\" ?><a><?t some text ?></a>"; + struct class_support { const GUID *clsid; @@ -3791,6 +3794,17 @@ static struct call_entry cdata_test3_alt[] = { CH_ENDTEST } };
+static struct call_entry pi_test[] = +{ + { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK }, + { CH_STARTDOCUMENT, 1, 22, S_OK }, + { CH_STARTELEMENT, 1, 25, S_OK, "", "a", "a" }, + { CH_PROCESSINGINSTRUCTION, 1, 41, S_OK, "t", "some text " }, + { CH_ENDELEMENT, 1, 45, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 1, 45, S_OK }, + { CH_ENDTEST } +}; + static int read_cnt;
static HRESULT WINAPI instream_Read(IStream *iface, void *pv, ULONG cb, ULONG *pcbRead) @@ -4579,6 +4593,16 @@ static void test_saxreader(void)
IStream_Release(stream);
+ /* PI */ + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown *)create_test_stream(test_pi_xml, -1); + test_seq = pi_test; + set_expected_seq(test_seq); + hr = ISAXXMLReader_parse(reader, var); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "pi test 1", TRUE); + VariantClear(&var); + ISAXXMLReader_Release(reader);
free_bstrs();
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/saxreader.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 71a7f334420..e9355c6bf6c 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2000,6 +2000,29 @@ static void libxml_cdatablock(void *ctx, const xmlChar *value, int len) format_error_message_from_id(locator, hr); }
+static void libxml_pi(void *ctx, const xmlChar *_target, const xmlChar *_data) +{ + saxlocator *locator = ctx; + struct saxcontenthandler_iface *handler = saxreader_get_contenthandler(locator->saxreader); + BSTR target, data; + HRESULT hr = S_OK; + + update_position(locator, FALSE); + if (!saxreader_has_handler(locator, SAXContentHandler)) return; + + target = pooled_bstr_from_xmlChar(&locator->saxreader->pool, _target); + data = pooled_bstr_from_xmlChar(&locator->saxreader->pool, _data); + + if (locator->vbInterface) + hr = IVBSAXContentHandler_processingInstruction(handler->vbhandler, &target, &data); + else + hr = ISAXContentHandler_processingInstruction(handler->handler, target, SysStringLen(target), + data, SysStringLen(data)); + + if (FAILED(hr)) + format_error_message_from_id(locator, hr); +} + static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid) { FIXME("entity resolving not implemented, %s, %s\n", publicid, systemid); @@ -3377,6 +3400,7 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, LPVOID *ppObj) reader->sax.fatalError = libxmlFatalError; reader->sax.cdataBlock = libxml_cdatablock; reader->sax.resolveEntity = libxmlresolveentity; + reader->sax.processingInstruction = libxml_pi;
*ppObj = &reader->IVBSAXXMLReader_iface;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/saxreader.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index e9355c6bf6c..0daf6d8425d 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2023,6 +2023,48 @@ static void libxml_pi(void *ctx, const xmlChar *_target, const xmlChar *_data) format_error_message_from_id(locator, hr); }
+static void libxml_internalsubset(void *ctx, const xmlChar *_name, const xmlChar *external_id, const xmlChar *system_id) +{ + saxlocator *locator = ctx; + struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader); + BSTR name, pubid, sysid; + HRESULT hr; + + update_position(locator, FALSE); + if (!saxreader_has_handler(locator, SAXLexicalHandler)) return; + + name = pooled_bstr_from_xmlChar(&locator->saxreader->pool, _name); + pubid = pooled_bstr_from_xmlChar(&locator->saxreader->pool, external_id); + sysid = pooled_bstr_from_xmlChar(&locator->saxreader->pool, system_id); + + if (locator->vbInterface) + hr = IVBSAXLexicalHandler_startDTD(lexical->vbhandler, &name, &pubid, &sysid); + else + hr = ISAXLexicalHandler_startDTD(lexical->handler, name, SysStringLen(name), + pubid, SysStringLen(pubid), sysid, SysStringLen(sysid)); + + if (FAILED(hr)) + format_error_message_from_id(locator, hr); +} + +static void libxml_externalsubset(void *ctx, const xmlChar *name, const xmlChar *external_id, const xmlChar *system_id) +{ + saxlocator *locator = ctx; + struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader); + HRESULT hr = S_OK; + + update_position(locator, FALSE); + if (!saxreader_has_handler(locator, SAXLexicalHandler)) return; + + if (locator->vbInterface) + hr = IVBSAXLexicalHandler_endDTD(lexical->vbhandler); + else + hr = ISAXLexicalHandler_endDTD(lexical->handler); + + if (FAILED(hr)) + format_error_message_from_id(locator, hr); +} + static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid) { FIXME("entity resolving not implemented, %s, %s\n", publicid, systemid); @@ -3401,6 +3443,8 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, LPVOID *ppObj) reader->sax.cdataBlock = libxml_cdatablock; reader->sax.resolveEntity = libxmlresolveentity; reader->sax.processingInstruction = libxml_pi; + reader->sax.internalSubset = libxml_internalsubset; + reader->sax.externalSubset = libxml_externalsubset;
*ppObj = &reader->IVBSAXXMLReader_iface;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/xmldoc.c | 97 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+)
diff --git a/dlls/msxml3/tests/xmldoc.c b/dlls/msxml3/tests/xmldoc.c index 484be6a86c1..47a987586c9 100644 --- a/dlls/msxml3/tests/xmldoc.c +++ b/dlls/msxml3/tests/xmldoc.c @@ -27,6 +27,7 @@ #include "msxml2did.h" #include "ocidl.h"
+#include "xmlparser.h" #include "wine/test.h"
/* Deprecated Error Code */ @@ -77,6 +78,33 @@ static void create_stream_on_file(IStream **stream, LPCSTR path) GlobalUnlock(hglobal); }
+static HRESULT load_document(IXMLDocument *doc, const void *data, unsigned int size) +{ + IPersistStreamInit *stream_init; + LARGE_INTEGER zero = { 0 }; + IStream *stream; + HRESULT hr; + + hr = IXMLDocument_QueryInterface(doc, &IID_IPersistStreamInit, (void **)&stream_init); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!!stream, "Failed to create a stream.\n"); + + hr = IStream_Write(stream, data, size, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IPersistStreamInit_Load(stream_init, stream); + + IPersistStreamInit_Release(stream_init); + IStream_Release(stream); + + return hr; +} + static void test_xmldoc(void) { IXMLElement *element = NULL, *child = NULL, *value = NULL; @@ -1073,6 +1101,74 @@ static void test_xmlelem(void) IXMLDocument_Release(doc); }
+static const char doc_data1[] = + "<?xml version=\"1.0\" encoding=\"uTf-8\"?><a/>"; + +static const char doc_data2[] = + "<?xml version=\"1.0\"?><a/>"; + +static const char doc_data3[] = + "<?xml version=\"1.0\" encoding=\"bad\"?><a/>"; + +static void test_xmldoc_charset(void) +{ + IXMLDocument *doc; + HRESULT hr; + BSTR s; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_charset(doc, NULL); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_charset(doc, &s); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + ok(!wcscmp(s, L"UTF-8"), "Unexpected %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + } + + hr = load_document(doc, doc_data1, sizeof(doc_data1) - 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_charset(doc, NULL); + todo_wine + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_charset(doc, &s); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + ok(!wcscmp(s, L"uTf-8"), "Unexpected %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + } + + /* Unspecified encoding, single-byte data */ + hr = load_document(doc, doc_data2, sizeof(doc_data2) - 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_charset(doc, &s); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + ok(!wcscmp(s, L"UTF-8"), "Unexpected %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + } + + /* Invalid encoding */ + hr = load_document(doc, doc_data3, sizeof(doc_data3) - 1); + todo_wine + ok(hr == XML_E_INVALIDENCODING, "Unexpected hr %#lx.\n", hr); + + IXMLDocument_Release(doc); +} + START_TEST(xmldoc) { HRESULT hr; @@ -1087,6 +1183,7 @@ START_TEST(xmldoc) }
test_xmldoc(); + test_xmldoc_charset(); test_createElement(); test_persiststreaminit(); test_xmlelem();
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/saxreader.c | 48 ++++++++++++++++++++ dlls/msxml6/tests/saxreader.c | 85 +++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+)
diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 06c0ad30037..9aa5ecf6782 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -2753,6 +2753,26 @@ static void test_saxreader_properties(void) ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
+ V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-encoding"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + todo_wine + ok(!V_BSTR(&v), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("charset"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + todo_wine + ok(!V_BSTR(&v), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + /* stream with declaration */ V_VT(&v) = VT_BSTR; V_BSTR(&v) = _bstr_("<?xml version=\"1.0\"?><element></element>"); @@ -2774,6 +2794,34 @@ static void test_saxreader_properties(void) ok(!lstrcmpW(V_BSTR(&v), L"1.0"), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
+ /* Encoding specified */ + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("<?xml version=\"1.0\" encoding=\"uTf-16\"?><element></element>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-encoding"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(!wcscmp(V_BSTR(&v), L"uTf-16"), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + } + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("charset"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + todo_wine + ok(!V_BSTR(&v), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + ISAXXMLReader_Release(reader); free_bstrs(); } diff --git a/dlls/msxml6/tests/saxreader.c b/dlls/msxml6/tests/saxreader.c index 6daff9f400d..52da4ef4460 100644 --- a/dlls/msxml6/tests/saxreader.c +++ b/dlls/msxml6/tests/saxreader.c @@ -4676,6 +4676,90 @@ static void test_saxreader_features(void) ISAXXMLReader_Release(reader); }
+static void test_saxreader_properties(void) +{ + ISAXXMLReader *reader; + HRESULT hr; + VARIANT v; + BSTR str; + + hr = CoCreateInstance(&CLSID_SAXXMLReader60, NULL, CLSCTX_INPROC_SERVER, &IID_ISAXXMLReader, (void **)&reader); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* xmldecl-version property */ + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + + /* stream without declaration */ + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("<element></element>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(V_BSTR(&v) == NULL, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-encoding"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + todo_wine + ok(!V_BSTR(&v), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + + /* stream with declaration */ + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("<?xml version=\"1.0\"?><element></element>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* VT_BSTR|VT_BYREF input type */ + str = _bstr_("<?xml version=\"1.0\"?><element></element>"); + V_VT(&v) = VT_BSTR|VT_BYREF; + V_BSTRREF(&v) = &str; + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-version"), &v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(!lstrcmpW(V_BSTR(&v), L"1.0"), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + /* Encoding specified */ + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("<?xml version=\"1.0\" encoding=\"uTf-16\"?><element></element>"); + hr = ISAXXMLReader_parse(reader, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_EMPTY; + V_BSTR(&v) = (void*)0xdeadbeef; + hr = ISAXXMLReader_getProperty(reader, _bstr_("xmldecl-encoding"), &v); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(!wcscmp(V_BSTR(&v), L"uTf-16"), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + } + + ISAXXMLReader_Release(reader); + free_bstrs(); +} + START_TEST(saxreader) { HRESULT hr; @@ -4690,6 +4774,7 @@ START_TEST(saxreader) if (is_class_supported(&CLSID_SAXXMLReader60)) { test_saxreader(); + test_saxreader_properties(); test_saxreader_features(); test_saxreader_encoding(); test_saxreader_dispex();
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/xmldoc.c | 129 +++++++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 19 deletions(-)
diff --git a/dlls/msxml3/tests/xmldoc.c b/dlls/msxml3/tests/xmldoc.c index 47a987586c9..d2997b1652a 100644 --- a/dlls/msxml3/tests/xmldoc.c +++ b/dlls/msxml3/tests/xmldoc.c @@ -162,25 +162,6 @@ static void test_xmldoc(void)
ok(stream != NULL, "Expected non-NULL stream\n");
- /* version field */ - hr = IXMLDocument_get_version(doc, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - - name = NULL; - hr = IXMLDocument_get_version(doc, &name); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!lstrcmpW(name, L"1.0"), "Expected 1.0, got %s\n", wine_dbgstr_w(name)); - SysFreeString(name); - - /* doctype */ - hr = IXMLDocument_get_doctype(doc, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - - hr = IXMLDocument_get_doctype(doc, &name); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!lstrcmpW(name, L"BANKACCOUNT"), "Expected BANKACCOUNT, got %s\n", wine_dbgstr_w(name)); - SysFreeString(name); - hr = IXMLDocument_get_root(doc, &element); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(element != NULL, "Expected non-NULL element\n"); @@ -1110,6 +1091,9 @@ static const char doc_data2[] = static const char doc_data3[] = "<?xml version=\"1.0\" encoding=\"bad\"?><a/>";
+static const char doc_data4[] = + "<?xml version=\"1.1\"?><a/>"; + static void test_xmldoc_charset(void) { IXMLDocument *doc; @@ -1169,6 +1153,111 @@ static void test_xmldoc_charset(void) IXMLDocument_Release(doc); }
+static void test_xmldoc_version(void) +{ + IXMLDocument *doc; + HRESULT hr; + BSTR s; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_version(doc, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + if (strcmp(winetest_platform, "wine")) + { + s = NULL; + hr = IXMLDocument_get_version(doc, &s); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(s, L"1.0"), "Unexpected version %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + } + + hr = load_document(doc, "<a/>", 4); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + s = NULL; + hr = IXMLDocument_get_version(doc, &s); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(s, L"1.0"), "Unexpected version %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + + hr = load_document(doc, doc_data4, sizeof(doc_data4) - 1); + todo_wine + ok(hr == XML_E_INVALID_VERSION, "Unexpected hr %#lx.\n", hr); + + IXMLDocument_Release(doc); +} + +static const char doc_data5[] = + "<?xml version=\"1.0\"?>\n" + "<!DOCTYPE name1 SYSTEM \"sys.url\">\n" + "<a/>"; + +static const char doc_data6[] = + "<?xml version=\"1.0\"?>\n" + "<!DOCTYPE name2 PUBLIC \"pudid\" \"pub.url\">\n" + "<a/>"; + +static const char doc_data7[] = + "<?xml version=\"1.0\"?>\n" + "<!DOCTYPE greeting [<!ELEMENT greeting (#PCDATA)>]>\n" + "<a/>"; + +static void test_xmldoc_doctype(void) +{ + IXMLDocument *doc; + HRESULT hr; + BSTR s; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (void **)&doc); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDocument_get_doctype(doc, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + /* Without doctype. */ + hr = load_document(doc, doc_data2, sizeof(doc_data2) - 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + s = (void *)0x1; + hr = IXMLDocument_get_doctype(doc, &s); + ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + todo_wine + ok(!s, "Unexpected doctype %s.\n", wine_dbgstr_w(s)); + + /* With doctype. */ + hr = load_document(doc, doc_data5, sizeof(doc_data5) - 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + s = NULL; + hr = IXMLDocument_get_doctype(doc, &s); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(s, L"NAME1"), "Unexpected doctype %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + + hr = load_document(doc, doc_data6, sizeof(doc_data6) - 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + s = NULL; + hr = IXMLDocument_get_doctype(doc, &s); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(s, L"NAME2"), "Unexpected doctype %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + + hr = load_document(doc, doc_data7, sizeof(doc_data7) - 1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + s = NULL; + hr = IXMLDocument_get_doctype(doc, &s); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!wcscmp(s, L"GREETING"), "Unexpected doctype %s.\n", wine_dbgstr_w(s)); + SysFreeString(s); + + IXMLDocument_Release(doc); +} + START_TEST(xmldoc) { HRESULT hr; @@ -1184,6 +1273,8 @@ START_TEST(xmldoc)
test_xmldoc(); test_xmldoc_charset(); + test_xmldoc_version(); + test_xmldoc_doctype(); test_createElement(); test_persiststreaminit(); test_xmlelem();
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/xmldoc.c | 56 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-)
diff --git a/dlls/msxml3/tests/xmldoc.c b/dlls/msxml3/tests/xmldoc.c index d2997b1652a..211186ee302 100644 --- a/dlls/msxml3/tests/xmldoc.c +++ b/dlls/msxml3/tests/xmldoc.c @@ -30,6 +30,21 @@ #include "xmlparser.h" #include "wine/test.h"
+#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) +static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) +{ + IUnknown *iface = iface_ptr; + HRESULT hr, expected_hr; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + if (SUCCEEDED(hr)) + IUnknown_Release(unk); +} + /* Deprecated Error Code */ #define XML_E_INVALIDATROOTLEVEL 0xc00ce556
@@ -112,8 +127,10 @@ static void test_xmldoc(void) IPersistStreamInit *psi = NULL; IXMLDocument *doc = NULL; IStream *stream = NULL; + IUnknown *unk1, *unk2; VARIANT vIndex, vName; LONG type, num_child; + IXMLDocument2 *doc2; CHAR path[MAX_PATH]; IDispatch *disp; ITypeInfo *ti; @@ -124,9 +141,45 @@ static void test_xmldoc(void) &IID_IXMLDocument, (void**)&doc); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ check_interface(doc, &IID_IUnknown, TRUE); + check_interface(doc, &IID_IDispatch, TRUE); + check_interface(doc, &IID_IXMLDocument, TRUE); + todo_wine + check_interface(doc, &IID_IXMLDocument2, TRUE); + check_interface(doc, &IID_IPersistStreamInit, TRUE); + check_interface(doc, &IID_IPersistStream, TRUE); + todo_wine + check_interface(doc, &IID_IPersistMoniker, TRUE); + todo_wine + check_interface(doc, &IID_IXMLError, TRUE); + check_interface(doc, &IID_IXMLDOMDocument, FALSE); + + hr = IXMLDocument_QueryInterface(doc, &IID_IXMLDocument2, (void **)&doc2); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (hr == S_OK) + { + hr = IXMLDocument2_QueryInterface(doc2, &IID_IDispatch, (void **)&disp); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(disp == (IDispatch *)doc2, "Unexpected pointer.\n"); + IDispatch_Release(disp); + hr = IXMLDocument2_QueryInterface(doc2, &IID_IUnknown, (void **)&unk2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(unk2 != (IUnknown *)doc2, "Unexpected pointer.\n"); + IXMLDocument2_Release(doc2); + + hr = IXMLDocument_QueryInterface(doc, &IID_IUnknown, (void **)&unk1); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(unk1 != (IUnknown *)doc, "Unexpected pointer.\n"); + ok(unk1 == unk2, "Unexpected pointer.\n"); + IUnknown_Release(unk1); + IUnknown_Release(unk2); + } + /* IDispatch */ hr = IXMLDocument_QueryInterface(doc, &IID_IDispatch, (void**)&disp); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(disp == (IDispatch *)doc, "Unexpected pointer.\n");
/* just to make sure we're on right type data */ hr = IDispatch_GetTypeInfo(disp, 0, 0, &ti); @@ -140,9 +193,6 @@ static void test_xmldoc(void) ITypeInfo_Release(ti); IDispatch_Release(disp);
- hr = IXMLDocument_QueryInterface(doc, &IID_IXMLDOMDocument, (void**)&disp); - ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr); - create_xml_file("bank.xml"); GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); create_stream_on_file(&stream, path);
v2: fixed msxml6 tests failures. Remaining failures are not related.