[PATCH v5] msxml3/tests: Test mxwriter domdoc output.

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Mon Feb 15 12:04:17 CST 2021


Removed todo_wine from passing tests as per Francois's comment.
-------------- next part --------------
From 928e4a33932a498233a3ecea8b2fa44531b6ffe4 Mon Sep 17 00:00:00 2001
From: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
Date: Sun, 14 Feb 2021 10:03:31 +0000
Subject: [PATCH] msxml3/tests: Test mxwriter domdoc output.

Signed-off-by: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
---
 dlls/msxml3/tests/saxreader.c | 191 ++++++++++++++++++++++++++++++++++
 1 file changed, 191 insertions(+)

diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index ab814c5f764..08de97b1ccb 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -4367,6 +4367,196 @@ static void test_mxwriter_stream(void)
     free_bstrs();
 }
 
+static void test_mxwriter_domdoc(void)
+{
+    IMXWriter *writer;
+    ISAXContentHandler *content;
+    IXMLDOMDocument3 *domdoc;
+    IDispatch *dispatch;
+    HRESULT hr;
+    VARIANT dest;
+
+    IXMLDOMElement *root = NULL;
+    IXMLDOMNodeList *node_list = NULL;
+    IXMLDOMNode *node = NULL;
+    LONG list_length = 0;
+    BSTR str;
+
+    /* Create writer and attach DOMDocument output */
+    hr = CoCreateInstance(&CLSID_MXXMLWriter60, NULL, CLSCTX_INPROC_SERVER,
+                          &IID_IMXWriter, (void**)&writer);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&content);
+    EXPECT_HR(hr, S_OK);
+
+    hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER,
+                          &IID_IXMLDOMDocument3, (void**)&domdoc);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMDocument3_QueryInterface(domdoc, &IID_IDispatch, (void**)&dispatch);
+    EXPECT_HR(hr, S_OK);
+
+    V_VT(&dest) = VT_DISPATCH;
+    V_DISPATCH(&dest) = dispatch;
+
+    hr = IMXWriter_put_output(writer, dest);
+    todo_wine EXPECT_HR(hr, S_OK);
+
+
+    /* Add root element to document. */
+    hr = IXMLDOMDocument3_createElement(domdoc, _bstr_("TestElement"), &root);
+    EXPECT_HR(hr, S_OK);
+    hr = IXMLDOMDocument3_appendChild(domdoc, (IXMLDOMNode*)root, NULL);
+    EXPECT_HR(hr, S_OK);
+    IXMLDOMElement_Release(root);
+
+    hr = IXMLDOMDocument3_get_documentElement(domdoc, &root);
+    EXPECT_HR(hr, S_OK);
+    ok(root != NULL, "root == NULL\n");
+    if (!root) return;
+    IXMLDOMElement_Release(root);
+
+
+    /* startDocument clears root element and disables methods. */
+    hr = ISAXContentHandler_startDocument(content);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMDocument3_get_documentElement(domdoc, &root);
+    todo_wine EXPECT_HR(hr, S_FALSE);
+
+    hr = IXMLDOMDocument3_createElement(domdoc, _bstr_("TestElement"), &root);
+    todo_wine EXPECT_HR(hr, E_FAIL);
+
+
+    /* startElement allows document root node to be accessed. */
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"BankAccount", 11, NULL);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMDocument3_get_documentElement(domdoc, &root);
+    EXPECT_HR(hr, S_OK);
+    ok(root != NULL, "root == NULL\n");
+    if (!root) return;
+
+    hr = IXMLDOMElement_get_nodeName(root, &str);
+    EXPECT_HR(hr, S_OK);
+    todo_wine ok(!lstrcmpW(L"BankAccount", str), "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+
+    /* startElement immediately updates previous node. */
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"Number", 6, NULL);
+    EXPECT_HR(hr, S_OK);
+
+
+    hr = IXMLDOMElement_get_childNodes(root, &node_list);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMNodeList_get_length(node_list, &list_length);
+    EXPECT_HR(hr, S_OK);
+    todo_wine ok(1 == list_length, "list length %i, expected 1\n", list_length);
+
+    hr = IXMLDOMNodeList_get_item(node_list, 0, &node);
+    todo_wine EXPECT_HR(hr, S_OK);
+    if (!node) return;
+
+    hr = IXMLDOMNode_get_nodeName(node, &str);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(!lstrcmpW(L"Number", str), "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+
+    /* characters not immediately visible. */
+    hr = ISAXContentHandler_characters(content, L"12345", 5);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMNode_get_text(node, &str);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(!lstrcmpW(L"", str), "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+
+    /* characters visible after endElement. */
+    hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"Number", 6);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMNode_get_text(node, &str);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(!lstrcmpW(L"12345", str), "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    IXMLDOMNode_Release(node);
+
+
+    /* second startElement updates the existing node list. */
+
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"Name", 4, NULL);
+    EXPECT_HR(hr, S_OK);
+
+    hr = ISAXContentHandler_characters(content, L"Captain Ahab", 12);
+    EXPECT_HR(hr, S_OK);
+
+    hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"Name", 4);
+    EXPECT_HR(hr, S_OK);
+
+    hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"BankAccount", 11);
+    EXPECT_HR(hr, S_OK);
+
+
+    hr = IXMLDOMNodeList_get_length(node_list, &list_length);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(2 == list_length, "list length %i, expected 2\n", list_length);
+
+    hr = IXMLDOMNodeList_get_item(node_list, 1, &node);
+    todo_wine EXPECT_HR(hr, S_OK);
+    if (!node) return;
+
+    hr = IXMLDOMNode_get_nodeName(node, &str);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(!lstrcmpW(L"Name", str), "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    hr = IXMLDOMNode_get_text(node, &str);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(!lstrcmpW(L"Captain Ahab", str), "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    IXMLDOMNode_Release(node);
+    IXMLDOMNodeList_Release(node_list);
+    IXMLDOMElement_Release(root);
+
+
+    /* endDocument makes document modifiable again. */
+
+    hr = ISAXContentHandler_endDocument(content);
+    EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMDocument3_createElement(domdoc, _bstr_("TestElement"), &root);
+    EXPECT_HR(hr, S_OK);
+    IXMLDOMElement_Release(root);
+
+
+    /* finally check doc output */
+    hr = IXMLDOMDocument3_get_xml(domdoc, &str);
+    todo_wine EXPECT_HR(hr, S_OK);
+    todo_wine ok(
+        !lstrcmpW(
+            L"<BankAccount>"
+            "<Number>12345</Number>"
+            "<Name>Captain Ahab</Name>"
+            "</BankAccount>\r\n",
+            str),
+        "got %s\n", wine_dbgstr_w(str));
+    SysFreeString(str);
+
+    IDispatch_Release(dispatch);
+    IXMLDOMDocument3_Release(domdoc);
+    ISAXContentHandler_Release(content);
+    IMXWriter_Release(writer);
+
+    free_bstrs();
+}
+
 static const char *encoding_names[] = {
     "iso-8859-1",
     "iso-8859-2",
@@ -5768,6 +5958,7 @@ START_TEST(saxreader)
         test_mxwriter_properties();
         test_mxwriter_flush();
         test_mxwriter_stream();
+        test_mxwriter_domdoc();
         test_mxwriter_encoding();
         test_mxwriter_dispex();
         test_mxwriter_indent();
-- 
2.26.2



More information about the wine-devel mailing list