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

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Sun Feb 14 02:08:13 CST 2021


Now tests that the destination document is cleared when startDocument is 
called, that createElement no longer succeeds, and that changes are 
visible more or less immediately after the SAX events that create them.
-------------- next part --------------
From 142543897eef6df195b927044d35a6369611e24e 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..593e2ebf1bc 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);
+    todo_wine EXPECT_HR(hr, S_OK);
+    ok(root != NULL, "root == NULL\n");
+    if (!root) return;
+
+    hr = IXMLDOMElement_get_nodeName(root, &str);
+    todo_wine 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);
+    todo_wine EXPECT_HR(hr, S_OK);
+
+    hr = IXMLDOMNodeList_get_length(node_list, &list_length);
+    todo_wine 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