[MSXML3_WINETEST]
[reactos.git] / rostests / winetests / msxml3 / domdoc.c
index de78b65..bc052be 100644 (file)
@@ -509,8 +509,8 @@ static char *list_to_string(IXMLDOMNodeList *list)
     return buf;
 }
 
-#define expect_node(node, expstr) { char str[4096]; node_to_string(node, str); ok(strcmp(str, expstr)==0, "Invalid node: %s, exptected %s\n", str, expstr); }
-#define expect_list_and_release(list, expstr) { char *str = list_to_string(list); ok(strcmp(str, expstr)==0, "Invalid node list: %s, exptected %s\n", str, expstr); if (list) IXMLDOMNodeList_Release(list); }
+#define expect_node(node, expstr) { char str[4096]; node_to_string(node, str); ok(strcmp(str, expstr)==0, "Invalid node: %s, expected %s\n", str, expstr); }
+#define expect_list_and_release(list, expstr) { char *str = list_to_string(list); ok(strcmp(str, expstr)==0, "Invalid node list: %s, expected %s\n", str, expstr); if (list) IXMLDOMNodeList_Release(list); }
 
 static void test_domdoc( void )
 {
@@ -868,6 +868,77 @@ static void test_domdoc( void )
         ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
         SysFreeString(str);
 
+        /* delete data */
+        /* invalid arguments */
+        r = IXMLDOMText_deleteData(nodetext, -1, 1);
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, 0, 0);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, 0, -1);
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 43, "expected 43 got %d\n", nLength);
+
+        r = IXMLDOMText_deleteData(nodetext, nLength, 1);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, nLength+1, 1);
+        ok(r == E_INVALIDARG, "ret %08x\n", r );
+
+        /* delete from start */
+        r = IXMLDOMText_deleteData(nodetext, 0, 5);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 38, "expected 38 got %d\n", nLength);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        /* whitespace preserving needs to be handled here */
+        todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* delete from end */
+        r = IXMLDOMText_deleteData(nodetext, 35, 3);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 35, "expected 35 got %d\n", nLength);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        todo_wine ok( !lstrcmpW( str, _bstr_("This &is a Middle; test <>\\Append") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* delete from inside */
+        r = IXMLDOMText_deleteData(nodetext, 1, 33);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        ok(nLength == 2, "expected 2 got %d\n", nLength);
+
+        r = IXMLDOMText_get_text(nodetext, &str);
+        ok(r == S_OK, "ret %08x\n", r );
+        todo_wine ok( !lstrcmpW( str, _bstr_("") ), "incorrect get_text string\n");
+        SysFreeString(str);
+
+        /* delete whole data ... */
+        r = IXMLDOMText_get_length(nodetext, &nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+
+        r = IXMLDOMText_deleteData(nodetext, 0, nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+        /* ... and try again with empty string */
+        r = IXMLDOMText_deleteData(nodetext, 0, nLength);
+        ok(r == S_OK, "ret %08x\n", r );
+
         /* test put_data */
         V_VT(&var) = VT_BSTR;
         V_BSTR(&var) = SysAllocString(szstr1);
@@ -1071,6 +1142,7 @@ static void test_domnode( void )
         r = IXMLDOMNode_get_ownerDocument( element, &owner );
         ok( r == S_OK, "get_ownerDocument return code\n");
         ok( owner != doc, "get_ownerDocument return\n");
+        IXMLDOMDocument_Release(owner);
 
         type = NODE_INVALID;
         r = IXMLDOMNode_get_nodeType( element, &type);
@@ -2926,6 +2998,76 @@ static void test_xmlTypes(void)
                 ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
                 SysFreeString(str);
 
+                /* delete data */
+                /* invalid arguments */
+                hr = IXMLDOMComment_deleteData(pComment, -1, 1);
+                ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_deleteData(pComment, 0, 0);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_deleteData(pComment, 0, -1);
+                ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_get_length(pComment, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 43, "expected 43 got %d\n", len);
+
+                hr = IXMLDOMComment_deleteData(pComment, len, 1);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_deleteData(pComment, len+1, 1);
+                ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+                /* delete from start */
+                hr = IXMLDOMComment_deleteData(pComment, 0, 5);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_get_length(pComment, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 38, "expected 38 got %d\n", len);
+
+                hr = IXMLDOMComment_get_text(pComment, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
+                SysFreeString(str);
+
+                /* delete from end */
+                hr = IXMLDOMComment_deleteData(pComment, 35, 3);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_get_length(pComment, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 35, "expected 35 got %d\n", len);
+
+                hr = IXMLDOMComment_get_text(pComment, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append ") ), "incorrect get_text string\n");
+                SysFreeString(str);
+
+                /* delete from inside */
+                hr = IXMLDOMComment_deleteData(pComment, 1, 33);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_get_length(pComment, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 2, "expected 2 got %d\n", len);
+
+                hr = IXMLDOMComment_get_text(pComment, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, _bstr_("  ") ), "incorrect get_text string\n");
+                SysFreeString(str);
+
+                /* delete whole data ... */
+                hr = IXMLDOMComment_get_length(pComment, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMComment_deleteData(pComment, 0, len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                /* ... and try again with empty string */
+                hr = IXMLDOMComment_deleteData(pComment, 0, len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
                 IXMLDOMComment_Release(pComment);
             }
 
@@ -3085,6 +3227,8 @@ static void test_xmlTypes(void)
                 IXMLDOMNode *pNextChild = (IXMLDOMNode *)0x1;
                 VARIANT var;
 
+                VariantInit(&var);
+
                 hr = IXMLDOMCDATASection_QueryInterface(pCDataSec, &IID_IXMLDOMElement, (LPVOID*)&pElement);
                 ok(hr == E_NOINTERFACE, "ret %08x\n", hr);
 
@@ -3155,7 +3299,8 @@ static void test_xmlTypes(void)
                 /* test get nodeValue */
                 hr = IXMLDOMCDATASection_get_nodeValue(pCDataSec, &var);
                 ok(hr == S_OK, "ret %08x\n", hr );
-                ok( !lstrcmpW( str, _bstr_("This &is a ; test <>\\") ), "incorrect text string\n");
+                ok(V_VT(&var) == VT_BSTR, "got vt %04x\n", V_VT(&var));
+                ok( !lstrcmpW( V_BSTR(&var), _bstr_("This &is a ; test <>\\") ), "incorrect text string\n");
                 VariantClear(&var);
 
                 /* test get data */
@@ -3266,6 +3411,77 @@ static void test_xmlTypes(void)
                 ok( !lstrcmpW( str, _bstr_("Begin This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
                 SysFreeString(str);
 
+                /* delete data */
+                /* invalid arguments */
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, -1, 1);
+                ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 0);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, -1);
+                ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 43, "expected 43 got %d\n", len);
+
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, len, 1);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, len+1, 1);
+                ok(hr == E_INVALIDARG, "ret %08x\n", hr );
+
+                /* delete from start */
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, 5);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 38, "expected 38 got %d\n", len);
+
+                hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append End") ), "incorrect get_text string\n");
+                SysFreeString(str);
+
+                /* delete from end */
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 35, 3);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 35, "expected 35 got %d\n", len);
+
+                hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, _bstr_(" This &is a Middle; test <>\\Append ") ), "incorrect get_text string\n");
+                SysFreeString(str);
+
+                /* delete from inside */
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 1, 33);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok(len == 2, "expected 2 got %d\n", len);
+
+                hr = IXMLDOMCDATASection_get_text(pCDataSec, &str);
+                ok(hr == S_OK, "ret %08x\n", hr );
+                ok( !lstrcmpW( str, _bstr_("  ") ), "incorrect get_text string\n");
+                SysFreeString(str);
+
+                /* delete whole data ... */
+                hr = IXMLDOMCDATASection_get_length(pCDataSec, &len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
+                /* ... and try again with empty string */
+                hr = IXMLDOMCDATASection_deleteData(pCDataSec, 0, len);
+                ok(hr == S_OK, "ret %08x\n", hr );
+
                 IXMLDOMCDATASection_Release(pCDataSec);
             }