From: Christoph von Wittich Date: Sat, 6 Feb 2010 21:35:37 +0000 (+0000) Subject: [MSXML3_WINETEST] X-Git-Tag: backups/jcatena-branch@60647^2~93 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=1829c939ad1205e7e99784f44ebbbdc00b38f8ed;ds=sidebyside [MSXML3_WINETEST] sync msxml3_winetest to wine 1.1.38 svn path=/trunk/; revision=45471 --- diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index 87ad9b563d6..bc052bea53f 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -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); } @@ -3269,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); } diff --git a/rostests/winetests/msxml3/saxreader.c b/rostests/winetests/msxml3/saxreader.c index dd0e42c282b..a932bf99354 100644 --- a/rostests/winetests/msxml3/saxreader.c +++ b/rostests/winetests/msxml3/saxreader.c @@ -520,6 +520,8 @@ static void test_saxreader(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); test_expect_call(CH_ENDTEST); + VariantClear(&var); + SADim[0].lLbound= 0; SADim[0].cElements= sizeof(szTestXML)-1; pSA = SafeArrayCreate(VT_UI1, 1, SADim); @@ -560,6 +562,8 @@ static void test_saxreader(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); test_expect_call(CH_ENDTEST); + VariantClear(&var); + file = CreateFileA(testXmlA, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); WriteFile(file, szTestXML, sizeof(szTestXML)-1, &bytesWritten, NULL); @@ -591,6 +595,7 @@ static void test_saxreader(void) IXMLDOMDocument_Release(domDocument); ISAXXMLReader_Release(reader); + SysFreeString(bstrData); } START_TEST(saxreader) diff --git a/rostests/winetests/msxml3/xmldoc.c b/rostests/winetests/msxml3/xmldoc.c index d2d99fc23f1..bc7422d2a10 100644 --- a/rostests/winetests/msxml3/xmldoc.c +++ b/rostests/winetests/msxml3/xmldoc.c @@ -39,6 +39,7 @@ static void create_xml_file(LPCSTR filename) static const char data[] = "\n" + "\n" "\n" " 1234\n" " Captain Ahab\n" @@ -48,6 +49,33 @@ static void create_xml_file(LPCSTR filename) CloseHandle(hf); } +static void create_stream_on_file(IStream **stream, LPCSTR path) +{ + HANDLE hfile; + HGLOBAL hglobal; + LPVOID ptr; + HRESULT hr; + DWORD file_size, read; + + hfile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + ok(hfile != INVALID_HANDLE_VALUE, "Expected a valid file handle\n"); + file_size = GetFileSize(hfile, NULL); + + hglobal = GlobalAlloc(GHND, file_size); + ptr = GlobalLock(hglobal); + + ReadFile(hfile, ptr, file_size, &read, NULL); + ok(file_size == read, "Expected to read the whole file, read %d\n", read); + + hr = CreateStreamOnHGlobal(hglobal, TRUE, stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(*stream != NULL, "Expected non-NULL stream\n"); + + CloseHandle(hfile); + GlobalUnlock(hglobal); +} + static void test_xmldoc(void) { HRESULT hr; @@ -56,10 +84,6 @@ static void test_xmldoc(void) IXMLElementCollection *collection = NULL, *inner = NULL; IPersistStreamInit *psi = NULL; IStream *stream = NULL; - HGLOBAL hglobal; - HANDLE hfile; - LPVOID ptr; - DWORD file_size, read; CHAR path[MAX_PATH]; LONG type, num_child; VARIANT vIndex, vName; @@ -70,35 +94,15 @@ static void test_xmldoc(void) static const WCHAR szNumVal[] = {'1','2','3','4',0}; static const WCHAR szName[] = {'N','A','M','E',0}; static const WCHAR szNameVal[] = {'C','a','p','t','a','i','n',' ','A','h','a','b',0}; + static const WCHAR szVersion[] = {'1','.','0',0}; hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); create_xml_file("bank.xml"); GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); - - hfile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - ok(hfile != INVALID_HANDLE_VALUE, "Expected a valid file handle\n"); - file_size = GetFileSize(hfile, NULL); - - hglobal = GlobalAlloc(GHND, file_size); - ptr = GlobalLock(hglobal); - - ReadFile(hfile, ptr, file_size, &read, NULL); - ok(file_size == read, "Expected to read the whole file, read %d\n", read); - - hr = CreateStreamOnHGlobal(hglobal, TRUE, &stream); - ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - ok(stream != NULL, "Expected non-NULL stream\n"); - - CloseHandle(hfile); - GlobalUnlock(hglobal); + create_stream_on_file(&stream, path); hr = IXMLDocument_QueryInterface(doc, &IID_IPersistStreamInit, (LPVOID *)&psi); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -115,10 +119,35 @@ static void test_xmldoc(void) ok(stream != NULL, "Expected non-NULL stream\n"); + /* version field */ + hr = IXMLDocument_get_version(doc, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IXMLDocument_get_version(doc, &name); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!lstrcmpW(name, szVersion), "Expected 1.0, got %s\n", wine_dbgstr_w(name)); + SysFreeString(name); + + /* doctype */ + hr = IXMLDocument_get_doctype(doc, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IXMLDocument_get_doctype(doc, &name); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(!lstrcmpW(name, szBankAccount), "Expected BANKACCOUNT, got %s\n", wine_dbgstr_w(name)); + SysFreeString(name); + hr = IXMLDocument_get_root(doc, &element); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(element != NULL, "Expected non-NULL element\n"); + /* ::root() returns new instance each time */ + hr = IXMLDocument_get_root(doc, &child); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child != NULL, "Expected non-NULL element\n"); + ok(child != element, "Expected new element instance\n"); + IXMLElement_Release(child); + hr = IXMLElement_get_type(element, &type); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(type == XMLELEMTYPE_ELEMENT, "Expected XMLELEMTYPE_ELEMENT, got %d\n", type); @@ -251,11 +280,7 @@ static void test_createElement(void) hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); /* invalid vType type */ V_VT(&vType) = VT_NULL; @@ -334,6 +359,142 @@ static void test_createElement(void) IXMLDocument_Release(doc); } +static void test_persiststreaminit(void) +{ + IXMLDocument *doc = NULL; + IXMLElement *element = NULL; + IPersistStreamInit *psi = NULL; + IStream *stream = NULL; + STATSTG stat; + HRESULT hr; + ULARGE_INTEGER size; + CHAR path[MAX_PATH]; + CLSID id; + BSTR str; + static const WCHAR testW[] = {'t','e','s','t',0}; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLDocument_QueryInterface(doc, &IID_IPersistStreamInit, (LPVOID *)&psi); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(psi != NULL, "Expected non-NULL psi\n"); + + /* null arguments */ + hr = IPersistStreamInit_GetSizeMax(psi, NULL); + ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); + + hr = IPersistStreamInit_Load(psi, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IPersistStreamInit_Save(psi, NULL, FALSE); + todo_wine ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IPersistStreamInit_GetClassID(psi, NULL); + ok(hr == E_POINTER, "Expected E_POINTER, got %08x\n", hr); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + create_xml_file("bank.xml"); + GetFullPathNameA("bank.xml", MAX_PATH, path, NULL); + create_stream_on_file(&stream, path); + + /* GetSizeMax not implemented */ + size.QuadPart = 0; + hr = IPersistStreamInit_GetSizeMax(psi, &size); + ok(hr == E_NOTIMPL, "Expected E_NOTIMPL, got %08x\n", hr); + ok(size.QuadPart == 0, "Expected 0\n"); + + hr = IPersistStreamInit_Load(psi, stream); + IStream_Release(stream); + ok(hr == S_OK || hr == XML_E_INVALIDATROOTLEVEL, "Expected S_OK, got %08x\n", hr); + if(hr == XML_E_INVALIDATROOTLEVEL) + goto cleanup; + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + /* try to save document */ + stream = NULL; + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + hr = IPersistStreamInit_Save(psi, stream, FALSE); + todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + stat.cbSize.QuadPart = 0; + hr = IStream_Stat(stream, &stat, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + todo_wine ok(stat.cbSize.QuadPart > 0, "Expected >0\n"); + IStream_Release(stream); + + str = SysAllocString(testW); + hr = IXMLDocument_get_root(doc, &element); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + hr = IXMLElement_put_text(element, str); + IXMLElement_Release(element); + SysFreeString(str); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + create_stream_on_file(&stream, path); + hr = IPersistStreamInit_Load(psi, stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IStream_Release(stream); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + /* reset internal stream */ + hr = IPersistStreamInit_InitNew(psi); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IPersistStreamInit_IsDirty(psi); + todo_wine ok(hr == S_FALSE, "Expected S_FALSE, got %08x\n", hr); + + stream = NULL; + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IPersistStreamInit_Save(psi, stream, FALSE); + todo_wine ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + stat.cbSize.QuadPart = 0; + hr = IStream_Stat(stream, &stat, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + todo_wine ok(stat.cbSize.QuadPart > 0, "Expected >0\n"); + IStream_Release(stream); + + memset(&id, 0, sizeof(id)); + hr = IPersistStreamInit_GetClassID(psi, &id); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(IsEqualCLSID(&id, &CLSID_XMLDocument), "Expected CLSID_XMLDocument\n"); + +cleanup: + IPersistStreamInit_Release(psi); + IXMLDocument_Release(doc); + DeleteFileA("bank.xml"); +} + +static BOOL test_try_xmldoc(void) +{ + IXMLDocument *doc = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + if (FAILED(hr)) + { + skip("Failed to create XMLDocument instance\n"); + return FALSE; + } + + IXMLDocument_Release(doc); + return TRUE; +} + START_TEST(xmldoc) { HRESULT hr; @@ -341,8 +502,15 @@ START_TEST(xmldoc) hr = CoInitialize(NULL); ok(hr == S_OK, "failed to init com\n"); + if (!test_try_xmldoc()) + { + CoUninitialize(); + return; + } + test_xmldoc(); test_createElement(); + test_persiststreaminit(); CoUninitialize(); } diff --git a/rostests/winetests/msxml3/xmlelem.c b/rostests/winetests/msxml3/xmlelem.c index 1738b2ce50b..3304d5a59bd 100644 --- a/rostests/winetests/msxml3/xmlelem.c +++ b/rostests/winetests/msxml3/xmlelem.c @@ -53,11 +53,7 @@ static void test_xmlelem(void) hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); V_VT(&vType) = VT_I4; V_I4(&vType) = XMLELEMTYPE_ELEMENT; @@ -265,11 +261,7 @@ static void test_xmlelem_collection(void) hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDocument, (LPVOID*)&doc); - if (FAILED(hr)) - { - skip("Failed to create XMLDocument instance\n"); - return; - } + ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); create_xml_file(szBankXML); GetFullPathNameA(szBankXML, MAX_PATH, pathA, NULL); @@ -438,6 +430,144 @@ cleanup: DeleteFileA("bank.xml"); } +static void test_xmlelem_children(void) +{ + IXMLDocument *doc = NULL; + IXMLElement *element = NULL, *child = NULL, *child2 = NULL; + IXMLElementCollection *collection = NULL; + VARIANT vType, vName, vIndex; + LONG length; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + V_VT(&vType) = VT_I4; + V_I4(&vType) = XMLELEMTYPE_ELEMENT; + V_VT(&vName) = VT_NULL; + hr = IXMLDocument_createElement(doc, vType, vName, &element); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(element != NULL, "Expected non-NULL element\n"); + + V_VT(&vType) = VT_I4; + V_I4(&vType) = XMLELEMTYPE_TEXT; + V_VT(&vName) = VT_NULL; + hr = IXMLDocument_createElement(doc, vType, vName, &child); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(child != NULL, "Expected non-NULL child\n"); + + 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(element, child, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLElement_get_children(element, &collection); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(collection != NULL, "Expected non-NULL collection\n"); + + length = 0; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 1, "Expected 1, got %08x\n", length); + + /* remove/add child and check what happens with collection */ + hr = IXMLElement_removeChild(element, child); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + length = -1; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 0, "Expected 0, got %08x\n", length); + IXMLElementCollection_Release(collection); + + hr = IXMLElement_AddRef(child); + ok(hr == 2, "Expected 2, got %08x\n", hr); + IXMLElement_Release(child); + hr = IXMLElement_addChild(element, child, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + hr = IXMLElement_AddRef(child); + ok(hr == 2, "Expected 2, got %08x\n", hr); + IXMLElement_Release(child); + hr = IXMLElement_addChild(element, child2, 0, -1); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IXMLElement_get_children(element, &collection); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(collection != NULL, "Expected non-NULL collection\n"); + + hr = IXMLElement_AddRef(child); + ok(hr == 2, "Expected 2, got %08x\n", hr); + IXMLElement_Release(child); + + length = 0; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 2, "Expected 2, got %08x\n", length); + + IXMLElement_Release(child2); + + length = 0; + hr = IXMLElementCollection_get_length(collection, &length); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(length == 2, "Expected 2, got %08x\n", length); + + V_VT(&vIndex) = VT_I4; + V_I4(&vIndex) = 1; + 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); + IXMLElement_Release(child2); + + /* 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); + IXMLElement_Release(child2); + IXMLDocument_Release(doc); +} + +static BOOL test_try_xmldoc(void) +{ + IXMLDocument *doc = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDocument, (LPVOID*)&doc); + if (FAILED(hr)) + { + skip("Failed to create XMLDocument instance\n"); + return FALSE; + } + + IXMLDocument_Release(doc); + return TRUE; +} + START_TEST(xmlelem) { HRESULT hr; @@ -445,8 +575,15 @@ START_TEST(xmlelem) hr = CoInitialize(NULL); ok(hr == S_OK, "failed to init com\n"); + if (!test_try_xmldoc()) + { + CoUninitialize(); + return; + } + test_xmlelem(); test_xmlelem_collection(); + test_xmlelem_children(); CoUninitialize(); }