[PATCH resend 1/4] msxml3/tests: Test for disabled node methods with writer domdoc dest.

Jefferson Carpenter jeffersoncarpenter2 at gmail.com
Mon May 31 15:06:29 CDT 2021


Feel free to comment only on 1/4, and I can extrapolate to 2/4 and 3/4.

I would be fine with dropping this patch set, if you don't think it's 
worthwhile to test these methods.


thanks,
Jefferson

-------------- next part --------------
From 5bbc8984fe1d12182b27d5447e129790752c16d2 Mon Sep 17 00:00:00 2001
From: Jefferson Carpenter <jeffersoncarpenter2 at gmail.com>
Date: Mon, 31 May 2021 20:04:04 +0000
Subject: [PATCH 1/4] msxml3/tests: Test for disabled node methods with writer
 domdoc dest.

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

diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c
index e401aafc87d..1bd9787cb92 100644
--- a/dlls/msxml3/tests/saxreader.c
+++ b/dlls/msxml3/tests/saxreader.c
@@ -4446,6 +4446,624 @@ static void test_mxwriter_stream(void)
     free_bstrs();
 }
 
+/* Indicates the kind of dom node tested for disabled methods */
+enum DOMNodeDisabledTest
+{
+    DOMNodeDisabled_domdoc,
+    DOMNodeDisabled_domdoc_fragment,
+    DOMNodeDisabled_element,
+    DOMNodeDisabled_text,
+    DOMNodeDisabled_created_text,
+    DOMNodeDisabled_created_comment,
+    DOMNodeDisabled_created_cdata_section,
+    DOMNodeDisabled_imported_element,
+    DOMNodeDisabled_imported_text,
+};
+
+static void check_domnode_methods_disabled(IXMLDOMDocument *locked_doc, IXMLDOMNode *locked_node, enum DOMNodeDisabledTest node_kind)
+{
+    HRESULT hr;
+    BSTR bstr;
+    IXMLDOMDocument *stylesheet;
+    VARIANT variant;
+    DOMNodeType type;
+    IXMLDOMDocument *document;
+    IXMLDOMNode *dom_node;
+    IXMLDOMNode *out_node;
+    IXMLDOMText *text;
+    IXMLDOMNodeList *node_list;
+    IXMLDOMNamedNodeMap *attributes;
+    VARIANT_BOOL variant_bool;
+
+    hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&stylesheet);
+    ok(hr == S_OK, "Failed to create a stylesheet, hr %#x.\n", hr);
+    hr = IXMLDOMDocument_loadXML(stylesheet, _bstr_("<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">"
+                                                      "</xsl:stylesheet>"), &variant_bool);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_nodeName(locked_node, &bstr);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    SysFreeString(bstr);
+
+    V_VT(&variant) = VT_NULL;
+    hr = IXMLDOMNode_get_nodeValue(locked_node, &variant);
+    switch (node_kind) {
+    case DOMNodeDisabled_text:
+    case DOMNodeDisabled_created_text:
+    case DOMNodeDisabled_created_comment:
+    case DOMNodeDisabled_created_cdata_section:
+    case DOMNodeDisabled_imported_text:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        ok(V_VT(&variant) == VT_BSTR, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, V_VT(&variant));
+        SysFreeString(V_BSTR(&variant));
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    V_VT(&variant) = VT_BSTR;
+    V_BSTR(&variant) = _bstr_("some value");
+    hr = IXMLDOMNode_put_nodeValue(locked_node, variant);
+    todo_wine_if(
+        node_kind == DOMNodeDisabled_element ||
+        node_kind == DOMNodeDisabled_created_text ||
+        node_kind == DOMNodeDisabled_created_comment ||
+        node_kind == DOMNodeDisabled_created_cdata_section ||
+        node_kind == DOMNodeDisabled_imported_element ||
+        node_kind == DOMNodeDisabled_imported_text
+    ) ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+
+    type = NODE_INVALID;
+    hr = IXMLDOMNode_get_nodeType(locked_node, &type);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+        ok(type == NODE_DOCUMENT, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, type);
+        break;
+    case DOMNodeDisabled_domdoc_fragment:
+        ok(type == NODE_DOCUMENT_FRAGMENT, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, type);
+        break;
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        ok(type == NODE_ELEMENT, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, type);
+        break;
+    case DOMNodeDisabled_created_comment:
+        ok(type == NODE_COMMENT, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, type);
+        break;
+    case DOMNodeDisabled_created_cdata_section:
+        ok(type == NODE_CDATA_SECTION, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, type);
+        break;
+    default:
+        ok(type == NODE_TEXT, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, type);
+        break;
+    }
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_parentNode(locked_node, &dom_node);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    switch (node_kind) {
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_text:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        IXMLDOMNode_Release(dom_node);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    node_list = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_childNodes(locked_node, &node_list);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(node_list != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, node_list);
+    IXMLDOMNodeList_Release(node_list);
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_firstChild(locked_node, &dom_node);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        todo_wine ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        if (dom_node) IXMLDOMNode_Release(dom_node);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_lastChild(locked_node, &dom_node);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        todo_wine ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        if (dom_node) IXMLDOMNode_Release(dom_node);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_previousSibling(locked_node, &dom_node);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    switch (node_kind) {
+    case DOMNodeDisabled_element:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        IXMLDOMNode_Release(dom_node);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_nextSibling(locked_node, &dom_node);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    switch (node_kind) {
+    case DOMNodeDisabled_element:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        IXMLDOMNode_Release(dom_node);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    attributes = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_attributes(locked_node, &attributes);
+    ok(attributes != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, attributes);
+    switch (node_kind) {
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        IXMLDOMNamedNodeMap_Release(attributes);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    /* insertBefore and appendChild tests are positioned after the
+       tests that look for child nodes because Wine currently creates
+       the nodes */
+
+    /* only domdocument and element have child nodes to attempt to
+       replace or remove */
+    if (node_kind == DOMNodeDisabled_domdoc ||
+        node_kind == DOMNodeDisabled_element ||
+        node_kind == DOMNodeDisabled_imported_element) {
+        dom_node = (void*)0xdeadbeef;
+        hr = IXMLDOMNode_get_firstChild(locked_node, &dom_node);
+        todo_wine ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+        /* dom_node used by next tests */
+
+        text = (void*)0xdeadbeef;
+        out_node = (void*)0xdeadbeef;
+        hr = IXMLDOMDocument_createTextNode(locked_doc, _bstr_("Some Element"), &text);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+        ok(text != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, text);
+        hr = IXMLDOMNode_replaceChild(locked_node, (IXMLDOMNode*)text, dom_node, &out_node);
+        todo_wine ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        ok(out_node == (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, out_node);
+        IXMLDOMText_Release(text);
+        if (out_node && out_node != (void*)0xdeadbeef) IXMLDOMNode_Release(out_node);
+
+        out_node = (void*)0xdeadbeef;
+        hr = IXMLDOMNode_removeChild(locked_node, dom_node, &out_node);
+        todo_wine ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        ok(out_node == (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, out_node);
+        if (out_node && out_node != (void*)0xdeadbeef) IXMLDOMNode_Release(out_node);
+
+        if (dom_node) IXMLDOMNode_Release(dom_node);
+    }
+
+    variant_bool = VARIANT_FALSE;
+    hr = IXMLDOMNode_hasChildNodes(locked_node, &variant_bool);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        todo_wine ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        todo_wine ok(variant_bool == VARIANT_TRUE, "DOMNodeDisabledTest(%d): Got %d.\n", node_kind, variant_bool);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+
+    text = (void*)0xdeadbeef;
+    out_node = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createTextNode(locked_doc, _bstr_("Some Element"), &text);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(text != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, text);
+    V_VT(&variant) = VT_NULL;
+    hr = IXMLDOMNode_insertBefore(locked_node, (IXMLDOMNode*)text, variant, &out_node);
+    todo_wine_if(
+        node_kind == DOMNodeDisabled_domdoc ||
+        node_kind == DOMNodeDisabled_domdoc_fragment ||
+        node_kind == DOMNodeDisabled_element ||
+        node_kind == DOMNodeDisabled_text ||
+        node_kind == DOMNodeDisabled_created_text ||
+        node_kind == DOMNodeDisabled_created_comment ||
+        node_kind == DOMNodeDisabled_imported_element ||
+        node_kind == DOMNodeDisabled_imported_text
+    ) ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    todo_wine ok(out_node == (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, out_node);
+    IXMLDOMText_Release(text);
+    if (out_node && out_node != (void*)0xdeadbeef) IXMLDOMNode_Release(out_node);
+
+    text = (void*)0xdeadbeef;
+    out_node = (void*)0xdeadbeef;
+    hr = IXMLDOMDocument_createTextNode(locked_doc, _bstr_("Some Element"), &text);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(text != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, text);
+    V_VT(&variant) = VT_NULL;
+    hr = IXMLDOMNode_appendChild(locked_node, (IXMLDOMNode*)text, &out_node);
+    todo_wine_if(
+        node_kind == DOMNodeDisabled_domdoc ||
+        node_kind == DOMNodeDisabled_domdoc_fragment ||
+        node_kind == DOMNodeDisabled_element ||
+        node_kind == DOMNodeDisabled_text ||
+        node_kind == DOMNodeDisabled_created_text ||
+        node_kind == DOMNodeDisabled_created_comment ||
+        node_kind == DOMNodeDisabled_imported_element ||
+        node_kind == DOMNodeDisabled_imported_text
+    ) ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    todo_wine ok(out_node == (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, out_node);
+    IXMLDOMText_Release(text);
+    if (out_node && out_node != (void*)0xdeadbeef) IXMLDOMNode_Release(out_node);
+
+    document = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_ownerDocument(locked_node, &document);
+    ok(document != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, document);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+        todo_wine ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        if (document) IXMLDOMDocument_Release(document);
+        break;
+    default:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        IXMLDOMDocument_Release(document);
+        break;
+    }
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_cloneNode(locked_node, VARIANT_FALSE, &dom_node);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    IXMLDOMNode_Release(dom_node);
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_cloneNode(locked_node, VARIANT_TRUE, &dom_node);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    IXMLDOMNode_Release(dom_node);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_nodeTypeString(locked_node, &bstr);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+        ok(!lstrcmpW(bstr, L"document"), "Incorrect node type\n");
+        break;
+    case DOMNodeDisabled_domdoc_fragment:
+        ok(!lstrcmpW(bstr, L"documentfragment"), "Incorrect node type\n");
+        break;
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        ok(!lstrcmpW(bstr, L"element"), "Incorrect node type\n");
+        break;
+    case DOMNodeDisabled_created_comment:
+        ok(!lstrcmpW(bstr, L"comment"), "Incorrect node type\n");
+        break;
+    case DOMNodeDisabled_created_cdata_section:
+        ok(!lstrcmpW(bstr, L"cdatasection"), "Incorrect node type\n");
+        break;
+    default:
+        ok(!lstrcmpW(bstr, L"text"), "Incorrect node type\n");
+        break;
+    }
+    SysFreeString(bstr);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_text(locked_node, &bstr);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    SysFreeString(bstr);
+
+    bstr = SysAllocStringLen(L"4321", 4);
+    hr = IXMLDOMNode_put_text(locked_node, bstr);
+    todo_wine_if(
+        node_kind == DOMNodeDisabled_domdoc_fragment ||
+        node_kind == DOMNodeDisabled_element ||
+        node_kind == DOMNodeDisabled_text ||
+        node_kind == DOMNodeDisabled_created_text ||
+        node_kind == DOMNodeDisabled_created_comment ||
+        node_kind == DOMNodeDisabled_created_cdata_section ||
+        node_kind == DOMNodeDisabled_imported_element ||
+        node_kind == DOMNodeDisabled_imported_text
+    ) ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    SysFreeString(bstr);
+
+    variant_bool = VARIANT_FALSE;
+    hr = IXMLDOMNode_get_specified(locked_node, &variant_bool);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(variant_bool == VARIANT_TRUE, "DOMNodeDisabledTest(%d): Got %d, expected %d\n", node_kind, variant_bool, VARIANT_TRUE);
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_definition(locked_node, &dom_node);
+    todo_wine ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    todo_wine ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    if (dom_node && dom_node != (void*)0xdeadbeef) IXMLDOMNode_Release(dom_node);
+
+    V_VT(&variant) = VT_NULL;
+    hr = IXMLDOMNode_get_nodeTypedValue(locked_node, &variant);
+    switch (node_kind) {
+    case DOMNodeDisabled_domdoc:
+    case DOMNodeDisabled_domdoc_fragment:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    default:
+        todo_wine_if(
+            node_kind == DOMNodeDisabled_text ||
+            node_kind == DOMNodeDisabled_created_text ||
+            node_kind == DOMNodeDisabled_imported_text
+        ) ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        todo_wine_if(
+            node_kind == DOMNodeDisabled_text ||
+            node_kind == DOMNodeDisabled_created_text ||
+            node_kind == DOMNodeDisabled_imported_text
+        ) ok(V_VT(&variant) == VT_BSTR, "DOMNodeDisabledTest(%d): Got %d, expected %d\n", node_kind, V_VT(&variant), VT_BSTR);
+        SysFreeString(V_BSTR(&variant));
+        break;
+    }
+
+    V_VT(&variant) = VT_BSTR;
+    V_BSTR(&variant) = _bstr_("1");
+    hr = IXMLDOMNode_put_nodeTypedValue(locked_node, variant);
+    todo_wine ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+
+    hr = IXMLDOMNode_get_dataType(locked_node, &variant);
+    ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+
+    bstr = _bstr_("char");
+    hr = IXMLDOMNode_put_dataType(locked_node, bstr);
+    todo_wine_if(
+        node_kind == DOMNodeDisabled_text ||
+        node_kind == DOMNodeDisabled_created_text ||
+        node_kind == DOMNodeDisabled_imported_text
+    ) ok(hr == E_FAIL, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_xml(locked_node, &bstr);
+    ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    SysFreeString(bstr);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_transformNode(locked_node, (IXMLDOMNode*)stylesheet, &bstr);
+    todo_wine ok(hr == E_PENDING, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    if (bstr) SysFreeString(bstr);
+
+    node_list = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_selectNodes(locked_node, _bstr_("."), &node_list);
+    todo_wine ok(hr == E_PENDING, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    todo_wine ok(node_list == (IXMLDOMNodeList*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, node_list);
+    if (node_list && node_list != (void*)0xdeadbeef) IXMLDOMNodeList_Release(node_list);
+
+    dom_node = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_selectSingleNode(locked_node, _bstr_("."), &dom_node);
+    todo_wine ok(hr == E_PENDING, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(dom_node != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, dom_node);
+    if (dom_node) IXMLDOMNode_Release(dom_node);
+
+    if (node_kind == DOMNodeDisabled_domdoc) {
+        variant_bool = VARIANT_TRUE;
+        hr = IXMLDOMNode_get_parsed(locked_node, &variant_bool);
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        todo_wine ok(variant_bool == VARIANT_FALSE, "DOMNodeDisabledTest(%d): Got %d, expected %d.\n", node_kind, variant_bool, VARIANT_FALSE);
+    } else {
+        variant_bool = VARIANT_FALSE;
+        hr = IXMLDOMNode_get_parsed(locked_node, &variant_bool);
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        ok(variant_bool == VARIANT_TRUE, "DOMNodeDisabledTest(%d): Got %d, expected %d.\n", node_kind, variant_bool, VARIANT_TRUE);
+    }
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_namespaceURI(locked_node, &bstr);
+    ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    SysFreeString(bstr);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_prefix(locked_node, &bstr);
+    ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    SysFreeString(bstr);
+
+    bstr = (void*)0xdeadbeef;
+    hr = IXMLDOMNode_get_baseName(locked_node, &bstr);
+    ok(bstr != (void*)0xdeadbeef, "DOMNodeDisabledTest(%d): Got %p.\n", node_kind, bstr);
+    switch (node_kind) {
+    case DOMNodeDisabled_element:
+    case DOMNodeDisabled_imported_element:
+        ok(hr == S_OK, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        ok(!lstrcmpW(bstr, L"BankAccount"), "DOMNodeDisabledTest(%d): Incorrect baseName\n", node_kind);
+        break;
+    default:
+        ok(hr == S_FALSE, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+        break;
+    }
+    SysFreeString(bstr);
+
+    hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&document);
+    ok(hr == S_OK, "Failed to create a stylesheet, hr %#x.\n", hr);
+    V_VT(&variant) = VT_DISPATCH;
+    V_DISPATCH(&variant) = (IDispatch*)document;
+    hr = IXMLDOMNode_transformNodeToObject(locked_node, (IXMLDOMNode*)stylesheet, variant);
+    todo_wine ok(hr == E_PENDING, "DOMNodeDisabledTest(%d): Unexpected hr %#x.\n", node_kind, hr);
+    IXMLDOMDocument_Release(document);
+
+    IXMLDOMDocument_Release(stylesheet);
+}
+
+static void test_mxwriter_domdoc_startDocument_disables_domdoc_methods(void)
+{
+    HRESULT hr;
+    VARIANT dest;
+    IMXWriter *writer;
+    ISAXContentHandler *content;
+    IXMLDOMDocument *domdoc;
+    /* for disabled node methods */
+    VARIANT_BOOL deep_clone;
+    IXMLDOMNode *temp_node = NULL;
+    IXMLDOMNodeList *temp_node_list = NULL;
+    IXMLDOMNode *element_node = NULL,
+        *text_node = NULL,
+        *import_text_node = NULL,
+        *import_element_node = NULL;
+    IXMLDOMDocumentFragment *document_fragment = NULL;
+    IXMLDOMText *text = NULL;
+    IXMLDOMComment *comment = NULL;
+    IXMLDOMCDATASection *cdata_section = NULL;
+    IXMLDOMDocument2 *domdoc2;
+    IXMLDOMDocument3 *domdoc3;
+
+    /* Create mxwriter and domdoc, set domdoc output, start document, add elements */
+    hr = CoCreateInstance(&CLSID_MXXMLWriter60, NULL, CLSCTX_INPROC_SERVER, &IID_IMXWriter, (void**)&writer);
+    ok(hr == S_OK, "Failed to create a writer, hr %#x.\n", hr);
+
+    hr = IMXWriter_QueryInterface(writer, &IID_ISAXContentHandler, (void**)&content);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&domdoc);
+    ok(hr == S_OK, "Failed to create a document, hr %#x.\n", hr);
+    hr = IXMLDOMDocument_QueryInterface(domdoc, &IID_IXMLDOMDocument2, (void**)&domdoc2);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    hr = IXMLDOMDocument_QueryInterface(domdoc, &IID_IXMLDOMDocument2, (void**)&domdoc3);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    V_VT(&dest) = VT_DISPATCH;
+    V_DISPATCH(&dest) = (IDispatch *)domdoc;
+
+    hr = IMXWriter_put_output(writer, dest);
+    todo_wine ok(hr == S_OK, "Failed to set writer output, hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_startDocument(content);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"Accounts", 8, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"BankAccount", 11, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"BankAccount", 11);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"BankAccount", 11, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_characters(content, L"12345", 5);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"BankAccount", 11);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_startElement(content, L"", 0, L"", 0, L"BankAccount", 11, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = ISAXContentHandler_endElement(content, L"", 0, L"", 0, L"BankAccount", 11);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+
+    /* Access created nodes. */
+    temp_node = NULL;
+    hr = IXMLDOMDocument_get_firstChild(domdoc, &temp_node);
+    todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    temp_node_list = NULL;
+    if (temp_node) {
+        hr = IXMLDOMNode_get_childNodes(temp_node, &temp_node_list);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    }
+
+    element_node = NULL;
+    if (temp_node_list) {
+        hr = IXMLDOMNodeList_get_item(temp_node_list, 1, &element_node);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    }
+
+    if (element_node) {
+        hr = IXMLDOMNode_get_firstChild(element_node, &text_node);
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    }
+
+    deep_clone = VARIANT_TRUE;
+    hr = IXMLDOMDocument3_importNode(domdoc3, text_node, deep_clone, &import_text_node);
+    todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IXMLDOMDocument3_importNode(domdoc3, element_node, deep_clone, &import_element_node);
+    todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    if (temp_node) IXMLDOMNode_Release(temp_node);
+    if (temp_node_list) IXMLDOMNodeList_Release(temp_node_list);
+
+
+    /*
+       Call IXMLDOMNode methods on various nodes that can be reached
+       from the document.
+    */
+    check_domnode_methods_disabled(domdoc, (IXMLDOMNode*)domdoc, DOMNodeDisabled_domdoc);
+
+    hr = IXMLDOMDocument_createDocumentFragment(domdoc, &document_fragment);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    check_domnode_methods_disabled(domdoc, (IXMLDOMNode*)document_fragment, DOMNodeDisabled_domdoc_fragment);
+    IXMLDOMDocumentFragment_Release(document_fragment);
+
+    if (element_node) check_domnode_methods_disabled(domdoc, element_node, DOMNodeDisabled_element);
+    if (text_node) check_domnode_methods_disabled(domdoc, text_node, DOMNodeDisabled_text);
+
+    hr = IXMLDOMDocument_createTextNode(domdoc, _bstr_("some text"), &text);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    check_domnode_methods_disabled(domdoc, (IXMLDOMNode*)text, DOMNodeDisabled_created_text);
+    IXMLDOMText_Release(text);
+
+    hr = IXMLDOMDocument_createComment(domdoc, _bstr_("some comment"), &comment);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    check_domnode_methods_disabled(domdoc, (IXMLDOMNode*)comment, DOMNodeDisabled_created_comment);
+    IXMLDOMComment_Release(comment);
+
+    hr = IXMLDOMDocument_createCDATASection(domdoc, _bstr_("some CDATA"), &cdata_section);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    check_domnode_methods_disabled(domdoc, (IXMLDOMNode*)cdata_section, DOMNodeDisabled_created_cdata_section);
+    IXMLDOMCDATASection_Release(cdata_section);
+
+    if (import_element_node) check_domnode_methods_disabled(domdoc, import_element_node, DOMNodeDisabled_imported_element);
+    if (import_text_node) check_domnode_methods_disabled(domdoc, import_text_node, DOMNodeDisabled_imported_text);
+
+
+    if (import_text_node) IXMLDOMNode_Release(import_text_node);
+    if (import_element_node) IXMLDOMNode_Release(import_element_node);
+    if (text_node) IXMLDOMNode_Release(text_node);
+    IXMLDOMDocument3_Release(domdoc3);
+    IXMLDOMDocument2_Release(domdoc2);
+    IXMLDOMDocument_Release(domdoc);
+    ISAXContentHandler_Release(content);
+    IMXWriter_Release(writer);
+    free_bstrs();
+}
 static void test_mxwriter_domdoc(void)
 {
     ISAXContentHandler *content;
@@ -6040,6 +6658,7 @@ START_TEST(saxreader)
         test_mxwriter_properties();
         test_mxwriter_flush();
         test_mxwriter_stream();
+        test_mxwriter_domdoc_startDocument_disables_domdoc_methods();
         test_mxwriter_domdoc();
         test_mxwriter_encoding();
         test_mxwriter_dispex();
-- 
2.26.2



More information about the wine-devel mailing list