[PATCH 2/5] Implement IXMLElement::removeChild() with some tests
Nikolay Sivov
bunglehead at gmail.com
Thu Jan 14 15:13:50 CST 2010
---
dlls/msxml3/tests/xmlelem.c | 26 +++++++++++++++++++++++---
dlls/msxml3/xmlelem.c | 17 +++++++++++++++--
2 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/dlls/msxml3/tests/xmlelem.c b/dlls/msxml3/tests/xmlelem.c
index 38b621f..dec1464 100644
--- a/dlls/msxml3/tests/xmlelem.c
+++ b/dlls/msxml3/tests/xmlelem.c
@@ -478,7 +478,7 @@ static void test_xmlelem_children(void)
/* remove/add child and check what happens with collection */
hr = IXMLElement_removeChild(element, child);
- todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
length = -1;
hr = IXMLElementCollection_get_length(collection, &length);
@@ -522,14 +522,34 @@ static void test_xmlelem_children(void)
hr = IXMLElementCollection_item(collection, vIndex, vName, (IDispatch **)&child2);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
ok(child2 != NULL, "Expected not NULL child\n");
+ IXMLElementCollection_Release(collection);
+
+ /* add element->child->child2 structure, then remove child2 from node */
+ V_VT(&vType) = VT_I4;
+ V_I4(&vType) = XMLELEMTYPE_TEXT;
+ V_VT(&vName) = VT_NULL;
+ hr = IXMLDocument_createElement(doc, vType, vName, &child2);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(child2 != NULL, "Expected non-NULL child\n");
+
+ hr = IXMLElement_addChild(child, child2, 0, -1);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+ hr = IXMLElement_removeChild(element, child2);
+ ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+
+ hr = IXMLElement_removeChild(child, child2);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+
+ hr = IXMLElement_removeChild(child, NULL);
+ ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
IXMLElement_Release(element);
IXMLElement_Release(child);
- IXMLElementCollection_Release(collection);
+ IXMLElement_Release(child2);
IXMLDocument_Release(doc);
}
-
static BOOL test_try_xmldoc(void)
{
IXMLDocument *doc = NULL;
diff --git a/dlls/msxml3/xmlelem.c b/dlls/msxml3/xmlelem.c
index b91722c..8fe24eb 100644
--- a/dlls/msxml3/xmlelem.c
+++ b/dlls/msxml3/xmlelem.c
@@ -412,8 +412,21 @@ static HRESULT WINAPI xmlelem_addChild(IXMLElement *iface, IXMLElement *pChildEl
static HRESULT WINAPI xmlelem_removeChild(IXMLElement *iface, IXMLElement *pChildElem)
{
- FIXME("(%p, %p): stub\n", iface, pChildElem);
- return E_NOTIMPL;
+ xmlelem *This = impl_from_IXMLElement(iface);
+ xmlelem *childElem = impl_from_IXMLElement(pChildElem);
+
+ TRACE("(%p, %p)\n", This, childElem);
+
+ if (!pChildElem)
+ return E_INVALIDARG;
+
+ /* only supported for This is childElem parent case */
+ if (This->node != childElem->node->parent)
+ return E_INVALIDARG;
+
+ xmlUnlinkNode(childElem->node);
+
+ return S_OK;
}
static const struct IXMLElementVtbl xmlelem_vtbl =
--
1.5.6.5
--=-rHw4Bcc8d1EskN9TJ5F9--
More information about the wine-patches
mailing list