Some refcount tests
Nikolay Sivov
bunglehead at gmail.com
Thu Feb 11 10:22:37 CST 2010
---
dlls/msxml3/domdoc.c | 4 ++
dlls/msxml3/tests/domdoc.c | 109 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 113 insertions(+), 0 deletions(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 77d1d2e..d4be6b6 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -1046,6 +1046,8 @@ static HRESULT WINAPI domdoc_createElement(
TRACE("%p->(%s,%p)\n", iface, debugstr_w(tagname), element);
+ if (!element) return E_INVALIDARG;
+
xml_name = xmlChar_from_wchar(tagname);
xmlnode = xmlNewDocNode(get_doc(This), NULL, xml_name, NULL);
xmldoc_add_orphan(xmlnode->doc, xmlnode);
@@ -1346,6 +1348,8 @@ static HRESULT WINAPI domdoc_createNode(
TRACE("(%p)->(type,%s,%s,%p)\n", This, debugstr_w(name), debugstr_w(namespaceURI), node);
+ if(!node) return E_INVALIDARG;
+
if(namespaceURI && namespaceURI[0])
FIXME("nodes with namespaces currently not supported.\n");
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 1b134af..61aa391 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -274,6 +274,29 @@ static WCHAR szStrangeChars[] = {'&','x',' ',0x2103, 0};
#define double_eq(x, y) ok((x)-(y)<=1e-14*(x) && (x)-(y)>=-1e-14*(x), "expected %.16g, got %.16g\n", x, y)
+static void check_refcount_(IUnknown *iface, LONG expected, int todo, int line)
+{
+ LONG ref;
+
+ ref = IUnknown_AddRef(iface);
+ IUnknown_Release(iface);
+ if (todo) {
+ todo_wine
+ ok_(__FILE__, line)((ref-1) == expected, "Expected %d, got %d\n", expected, ref-1);
+ }
+ else
+ ok_(__FILE__, line)((ref-1) == expected, "Expected %d, got %d\n", expected, ref-1);
+}
+
+#define check_refcount(iface, exp, todo) check_refcount_((IUnknown*)iface, exp, todo, __LINE__)
+
+static void release_iface_(IUnknown *iface)
+{
+ while(IUnknown_Release(iface)) {};
+}
+
+#define release_iface(iface) release_iface_((IUnknown*)iface)
+
static BSTR alloc_str_from_narrow(const char *str)
{
int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
@@ -969,6 +992,8 @@ static void test_domdoc( void )
/* test Create Comment */
r = IXMLDOMDocument_createComment(doc, NULL, NULL);
ok( r == E_INVALIDARG, "returns %08x\n", r );
+ r = IXMLDOMDocument_createComment(doc, szComment, NULL);
+ ok( r == E_INVALIDARG, "returns %08x\n", r );
r = IXMLDOMDocument_createComment(doc, szComment, &node_comment);
ok( r == S_OK, "returns %08x\n", r );
if(node_comment)
@@ -994,6 +1019,8 @@ static void test_domdoc( void )
/* test Create Attribute */
r = IXMLDOMDocument_createAttribute(doc, NULL, NULL);
ok( r == E_INVALIDARG, "returns %08x\n", r );
+ r = IXMLDOMDocument_createAttribute(doc, szAttribute, NULL);
+ ok( r == E_INVALIDARG, "returns %08x\n", r );
r = IXMLDOMDocument_createAttribute(doc, szAttribute, &node_attr);
ok( r == S_OK, "returns %08x\n", r );
IXMLDOMText_Release( node_attr);
@@ -1664,6 +1691,11 @@ static void test_create(void)
ok( r == S_OK, "returns %08x\n", r );
if( SUCCEEDED(r) ) IXMLDOMNode_Release( node );
+ V_VT(&var) = VT_I1;
+ V_I1(&var) = NODE_ELEMENT;
+ r = IXMLDOMDocument_createNode( doc, var, str, NULL, NULL );
+ ok( r == E_INVALIDARG, "returns %08x\n", r );
+
V_VT(&var) = VT_R4;
V_R4(&var) = NODE_ELEMENT;
r = IXMLDOMDocument_createNode( doc, var, str, NULL, &node );
@@ -3641,6 +3673,9 @@ static void test_nodeTypeTests( void )
if( hr != S_OK )
return;
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), NULL);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &pRoot);
ok(hr == S_OK, "ret %08x\n", hr );
if(hr == S_OK)
@@ -4673,6 +4708,79 @@ static void test_TransformWithLoadingLocalFile(void)
free_bstrs();
}
+static void test_refcount(void)
+{
+ IXMLDOMDocument *doc;
+ IXMLDOMElement *elem;
+ IXMLDOMAttribute *attr, *attr2;
+ IXMLDOMComment *comment;
+ IXMLDOMNode *node;
+ VARIANT var;
+ HRESULT hr;
+
+ hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc );
+ if( hr != S_OK )
+ return;
+
+ check_refcount(doc, 1, FALSE);
+
+ hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing1"), &elem);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ check_refcount(elem, 2, TRUE);
+ check_refcount(doc, 1, FALSE);
+
+ /* appendChild doesn't change refcount */
+ hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)elem, NULL);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ check_refcount(elem, 2, FALSE);
+ check_refcount(doc, 1, FALSE);
+
+ /* cloned node has 1 reference */
+ hr = IXMLDOMElement_cloneNode(elem, VARIANT_TRUE, &node);
+ ok( hr == S_OK, "ret %08x\n", hr );
+ check_refcount(elem, 2, FALSE);
+ check_refcount(node, 1, FALSE);
+ IXMLDOMNode_Release(node);
+
+ hr = IXMLDOMElement_cloneNode(elem, VARIANT_FALSE, &node);
+ ok( hr == S_OK, "ret %08x\n", hr );
+ check_refcount(elem, 2, FALSE);
+ check_refcount(node, 1, FALSE);
+ IXMLDOMNode_Release(node);
+
+ attr = (IXMLDOMAttribute*)0x1;
+ hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr1"), &attr);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ check_refcount(attr, 2, TRUE);
+
+ attr2 = (IXMLDOMAttribute*)0x1;
+ hr = IXMLDOMElement_setAttributeNode(elem, attr, &attr2);
+ todo_wine ok(hr == S_OK, "ret %08x\n", hr );
+ check_refcount(attr, 2, TRUE);
+ todo_wine ok(attr2 == NULL, "expected null iface\n" );
+
+ hr = IXMLDOMDocument_createComment(doc, _bstr_("Comment"), &comment);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ check_refcount(comment, 2, TRUE);
+
+ /* ::insertBefore() */
+ VariantInit(&var);
+ node = (IXMLDOMNode*)0x1;
+ /* comment refcount is increased */
+ check_refcount(elem, 2, FALSE);
+ hr = IXMLDOMElement_insertBefore(elem, (IXMLDOMNode*)comment, var, &node);
+ ok(hr == S_OK, "ret %08x\n", hr );
+ check_refcount(comment, 3, TRUE);
+ check_refcount(elem, 2, FALSE);
+
+ free_bstrs();
+
+ release_iface(comment);
+ release_iface(attr);
+ release_iface(elem);
+ IXMLDOMDocument_Release(doc);
+}
+
START_TEST(domdoc)
{
HRESULT r;
@@ -4703,6 +4811,7 @@ START_TEST(domdoc)
test_FormattingXML();
test_NodeTypeValue();
test_TransformWithLoadingLocalFile();
+ test_refcount();
CoUninitialize();
}
--
1.5.6.5
--=-JWcRdYVd4TEUvOez5hVK--
More information about the wine-patches
mailing list