msxml3/tests: Run IXMLDOMNode::get_text whitespace tests on other msxml versions.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Piotr Caban 2015-11-20 08:38:17 +01:00 committed by Alexandre Julliard
parent e0d8003a9a
commit 1f2c20cff3

View File

@ -4137,36 +4137,41 @@ static void test_IXMLDOMDocument2(void)
ok_(__FILE__, line)(r == S_OK, "=> %i: " #expr " returned %08x\n", __LINE__, r); \ ok_(__FILE__, line)(r == S_OK, "=> %i: " #expr " returned %08x\n", __LINE__, r); \
} }
#define helper_ole_check_ver(expr) { \
HRESULT r = expr; \
ok_(__FILE__, line)(r == S_OK, "-> %i (%s): " #expr " returned %08x\n", __LINE__, ver, r); \
}
#define helper_expect_list_and_release(list, expstr) { \ #define helper_expect_list_and_release(list, expstr) { \
char *str = list_to_string(list); \ char *str = list_to_string(list); \
ok_(__FILE__, line)(strcmp(str, expstr)==0, "=> %i: Invalid node list: %s, expected %s\n", __LINE__, str, expstr); \ ok_(__FILE__, line)(strcmp(str, expstr)==0, "=> %i (%s): Invalid node list: %s, expected %s\n", __LINE__, ver, str, expstr); \
if (list) IXMLDOMNodeList_Release(list); \ if (list) IXMLDOMNodeList_Release(list); \
} }
#define helper_expect_bstr_and_release(bstr, str) { \ #define helper_expect_bstr_and_release(bstr, str) { \
ok_(__FILE__, line)(lstrcmpW(bstr, _bstr_(str)) == 0, \ ok_(__FILE__, line)(lstrcmpW(bstr, _bstr_(str)) == 0, \
"=> %i: got %s\n", __LINE__, wine_dbgstr_w(bstr)); \ "=> %i (%s): got %s\n", __LINE__, ver, wine_dbgstr_w(bstr)); \
SysFreeString(bstr); \ SysFreeString(bstr); \
} }
#define check_ws_ignored(doc, str) _check_ws_ignored(__LINE__, doc, str) #define check_ws_ignored(ver, doc, str) _check_ws_ignored(__LINE__, ver, doc, str)
static inline void _check_ws_ignored(int line, IXMLDOMDocument2* doc, char const* str) static inline void _check_ws_ignored(int line, const char *ver, IXMLDOMDocument2* doc, char const* str)
{ {
IXMLDOMNode *node1, *node2; IXMLDOMNode *node1, *node2;
IXMLDOMNodeList *list; IXMLDOMNodeList *list;
BSTR bstr; BSTR bstr;
helper_ole_check(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list)); helper_ole_check_ver(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list));
helper_ole_check(IXMLDOMNodeList_get_item(list, 0, &node1)); helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 0, &node1));
helper_ole_check(IXMLDOMNodeList_get_item(list, 1, &node2)); helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 1, &node2));
helper_ole_check(IXMLDOMNodeList_reset(list)); helper_ole_check_ver(IXMLDOMNodeList_reset(list));
helper_expect_list_and_release(list, "E1.E5.E1.E2.D1 E2.E5.E1.E2.D1"); helper_expect_list_and_release(list, "E1.E5.E1.E2.D1 E2.E5.E1.E2.D1");
helper_ole_check(IXMLDOMNode_get_childNodes(node1, &list)); helper_ole_check_ver(IXMLDOMNode_get_childNodes(node1, &list));
helper_expect_list_and_release(list, helper_expect_list_and_release(list,
"[4]1.E1.E5.E1.E2.D1 T2.E1.E5.E1.E2.D1 E3.E1.E5.E1.E2.D1 " "[4]1.E1.E5.E1.E2.D1 T2.E1.E5.E1.E2.D1 E3.E1.E5.E1.E2.D1 "
"E4.E1.E5.E1.E2.D1 E5.E1.E5.E1.E2.D1 E6.E1.E5.E1.E2.D1"); "E4.E1.E5.E1.E2.D1 E5.E1.E5.E1.E2.D1 E6.E1.E5.E1.E2.D1");
helper_ole_check(IXMLDOMNode_get_text(node1, &bstr)); helper_ole_check_ver(IXMLDOMNode_get_text(node1, &bstr));
if (str) if (str)
{ {
todo_wine helper_expect_bstr_and_release(bstr, str); todo_wine helper_expect_bstr_and_release(bstr, str);
@ -4177,32 +4182,35 @@ static inline void _check_ws_ignored(int line, IXMLDOMDocument2* doc, char const
} }
IXMLDOMNode_Release(node1); IXMLDOMNode_Release(node1);
helper_ole_check(IXMLDOMNode_get_childNodes(node2, &list)); helper_ole_check_ver(IXMLDOMNode_get_childNodes(node2, &list));
helper_expect_list_and_release(list, "T1.E2.E5.E1.E2.D1 E2.E2.E5.E1.E2.D1 T3.E2.E5.E1.E2.D1 E4.E2.E5.E1.E2.D1 T5.E2.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1 T7.E2.E5.E1.E2.D1"); helper_expect_list_and_release(list,
helper_ole_check(IXMLDOMNode_get_text(node2, &bstr)); "T1.E2.E5.E1.E2.D1 E2.E2.E5.E1.E2.D1 T3.E2.E5.E1.E2.D1 "
helper_expect_bstr_and_release(bstr, "\n This is a description with preserved whitespace. \n "); "E4.E2.E5.E1.E2.D1 T5.E2.E5.E1.E2.D1 E6.E2.E5.E1.E2.D1 T7.E2.E5.E1.E2.D1");
helper_ole_check_ver(IXMLDOMNode_get_text(node2, &bstr));
helper_expect_bstr_and_release(bstr,
"\n This is a description with preserved whitespace. \n ");
IXMLDOMNode_Release(node2); IXMLDOMNode_Release(node2);
} }
#define check_ws_preserved(doc, str) _check_ws_preserved(__LINE__, doc, str) #define check_ws_preserved(ver, doc, str) _check_ws_preserved(__LINE__, ver, doc, str)
static inline void _check_ws_preserved(int line, IXMLDOMDocument2* doc, char const* str) static inline void _check_ws_preserved(int line, const char *ver, IXMLDOMDocument2* doc, char const* str)
{ {
IXMLDOMNode *node1, *node2; IXMLDOMNode *node1, *node2;
IXMLDOMNodeList *list; IXMLDOMNodeList *list;
BSTR bstr; BSTR bstr;
helper_ole_check(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list)); helper_ole_check_ver(IXMLDOMDocument2_selectNodes(doc, _bstr_("//*[local-name()='html']"), &list));
helper_ole_check(IXMLDOMNodeList_get_item(list, 0, &node1)); helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 0, &node1));
helper_ole_check(IXMLDOMNodeList_get_item(list, 1, &node2)); helper_ole_check_ver(IXMLDOMNodeList_get_item(list, 1, &node2));
helper_ole_check(IXMLDOMNodeList_reset(list)); helper_ole_check_ver(IXMLDOMNodeList_reset(list));
helper_expect_list_and_release(list, "E2.E10.E2.E2.D1 E4.E10.E2.E2.D1"); helper_expect_list_and_release(list, "E2.E10.E2.E2.D1 E4.E10.E2.E2.D1");
helper_ole_check(IXMLDOMNode_get_childNodes(node1, &list)); helper_ole_check_ver(IXMLDOMNode_get_childNodes(node1, &list));
helper_expect_list_and_release(list, helper_expect_list_and_release(list,
"T1.E2.E10.E2.E2.D1 [4]2.E2.E10.E2.E2.D1 T3.E2.E10.E2.E2.D1 " "T1.E2.E10.E2.E2.D1 [4]2.E2.E10.E2.E2.D1 T3.E2.E10.E2.E2.D1 "
"E4.E2.E10.E2.E2.D1 T5.E2.E10.E2.E2.D1 E6.E2.E10.E2.E2.D1 " "E4.E2.E10.E2.E2.D1 T5.E2.E10.E2.E2.D1 E6.E2.E10.E2.E2.D1 "
"E7.E2.E10.E2.E2.D1 E8.E2.E10.E2.E2.D1 T9.E2.E10.E2.E2.D1"); "E7.E2.E10.E2.E2.D1 E8.E2.E10.E2.E2.D1 T9.E2.E10.E2.E2.D1");
helper_ole_check(IXMLDOMNode_get_text(node1, &bstr)); helper_ole_check_ver(IXMLDOMNode_get_text(node1, &bstr));
if (str) if (str)
{ {
todo_wine helper_expect_bstr_and_release(bstr, str); todo_wine helper_expect_bstr_and_release(bstr, str);
@ -4213,10 +4221,13 @@ static inline void _check_ws_preserved(int line, IXMLDOMDocument2* doc, char con
} }
IXMLDOMNode_Release(node1); IXMLDOMNode_Release(node1);
helper_ole_check(IXMLDOMNode_get_childNodes(node2, &list)); helper_ole_check_ver(IXMLDOMNode_get_childNodes(node2, &list));
helper_expect_list_and_release(list, "T1.E4.E10.E2.E2.D1 E2.E4.E10.E2.E2.D1 T3.E4.E10.E2.E2.D1 E4.E4.E10.E2.E2.D1 T5.E4.E10.E2.E2.D1 E6.E4.E10.E2.E2.D1 T7.E4.E10.E2.E2.D1"); helper_expect_list_and_release(list,
helper_ole_check(IXMLDOMNode_get_text(node2, &bstr)); "T1.E4.E10.E2.E2.D1 E2.E4.E10.E2.E2.D1 T3.E4.E10.E2.E2.D1 "
helper_expect_bstr_and_release(bstr, "\n This is a description with preserved whitespace. \n "); "E4.E4.E10.E2.E2.D1 T5.E4.E10.E2.E2.D1 E6.E4.E10.E2.E2.D1 T7.E4.E10.E2.E2.D1");
helper_ole_check_ver(IXMLDOMNode_get_text(node2, &bstr));
helper_expect_bstr_and_release(bstr,
"\n This is a description with preserved whitespace. \n ");
IXMLDOMNode_Release(node2); IXMLDOMNode_Release(node2);
} }
@ -4268,8 +4279,27 @@ static void test_preserve_charref(IXMLDOMDocument2 *doc, VARIANT_BOOL preserve)
IXMLDOMNodeList_Release(list); IXMLDOMNodeList_Release(list);
} }
struct whitespace_t {
const CLSID *clsid;
const char *name;
};
static const struct whitespace_t whitespace_test_data[] = {
{ &CLSID_DOMDocument, "CLSID_DOMDocument" },
{ &CLSID_DOMDocument2, "CLSID_DOMDocument2" },
{ &CLSID_DOMDocument26, "CLSID_DOMDocument26" },
{ &CLSID_DOMDocument30, "CLSID_DOMDocument30" },
{ &CLSID_DOMDocument40, "CLSID_DOMDocument40" },
{ &CLSID_DOMDocument60, "CLSID_DOMDocument60" },
{ 0 }
};
static void test_whitespace(void) static void test_whitespace(void)
{ {
const struct whitespace_t *class_ptr = whitespace_test_data;
while (class_ptr->clsid)
{
IXMLDOMDocument2 *doc1, *doc2, *doc3, *doc4; IXMLDOMDocument2 *doc1, *doc2, *doc3, *doc4;
IXMLDOMNodeList *list; IXMLDOMNodeList *list;
IXMLDOMElement *root; IXMLDOMElement *root;
@ -4277,9 +4307,19 @@ static void test_whitespace(void)
HRESULT hr; HRESULT hr;
LONG len; LONG len;
if (!is_clsid_supported(&CLSID_DOMDocument2, &IID_IXMLDOMDocument2)) return; if (!is_clsid_supported(class_ptr->clsid, &IID_IXMLDOMDocument2))
doc1 = create_document(&IID_IXMLDOMDocument2); {
doc2 = create_document(&IID_IXMLDOMDocument2); class_ptr++;
continue;
}
hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDOMDocument2, (void**)&doc1);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = CoCreateInstance(class_ptr->clsid, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDOMDocument2, (void**)&doc2);
ok(hr == S_OK, "got 0x%08x\n", hr);
ole_check(IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_TRUE)); ole_check(IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_TRUE));
ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b)); ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b));
@ -4296,8 +4336,8 @@ static void test_whitespace(void)
ole_check(IXMLDOMDocument2_setProperty(doc1, _bstr_("SelectionLanguage"), _variantbstr_("XPath"))); ole_check(IXMLDOMDocument2_setProperty(doc1, _bstr_("SelectionLanguage"), _variantbstr_("XPath")));
ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath"))); ole_check(IXMLDOMDocument2_setProperty(doc2, _bstr_("SelectionLanguage"), _variantbstr_("XPath")));
check_ws_ignored(doc1, NULL); check_ws_ignored(class_ptr->name, doc1, NULL);
check_ws_preserved(doc2, NULL); check_ws_preserved(class_ptr->name, doc2, NULL);
/* new instances copy the property */ /* new instances copy the property */
ole_check(IXMLDOMDocument2_QueryInterface(doc1, &IID_IXMLDOMDocument2, (void**) &doc3)); ole_check(IXMLDOMDocument2_QueryInterface(doc1, &IID_IXMLDOMDocument2, (void**) &doc3));
@ -4308,16 +4348,16 @@ static void test_whitespace(void)
ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b)); ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b));
ok(b == VARIANT_TRUE, "expected true\n"); ok(b == VARIANT_TRUE, "expected true\n");
check_ws_ignored(doc3, NULL); check_ws_ignored(class_ptr->name, doc3, NULL);
check_ws_preserved(doc4, NULL); check_ws_preserved(class_ptr->name, doc4, NULL);
/* setting after loading xml affects trimming of leading/trailing ws only */ /* setting after loading xml affects trimming of leading/trailing ws only */
ole_check(IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_TRUE)); ole_check(IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_TRUE));
ole_check(IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_FALSE)); ole_check(IXMLDOMDocument2_put_preserveWhiteSpace(doc2, VARIANT_FALSE));
/* the trailing "\n " isn't there, because it was ws-only node */ /* the trailing "\n " isn't there, because it was ws-only node */
check_ws_ignored(doc1, " This is a description. "); check_ws_ignored(class_ptr->name, doc1, " This is a description. ");
check_ws_preserved(doc2, " This is a description."); check_ws_preserved(class_ptr->name, doc2, " This is a description.");
/* it takes effect on reload */ /* it takes effect on reload */
ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b)); ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b));
@ -4330,8 +4370,8 @@ static void test_whitespace(void)
ole_check(IXMLDOMDocument2_loadXML(doc2, _bstr_(szExampleXML), &b)); ole_check(IXMLDOMDocument2_loadXML(doc2, _bstr_(szExampleXML), &b));
ok(b == VARIANT_TRUE, "failed to load XML string\n"); ok(b == VARIANT_TRUE, "failed to load XML string\n");
check_ws_preserved(doc1, NULL); check_ws_preserved(class_ptr->name, doc1, NULL);
check_ws_ignored(doc2, NULL); check_ws_ignored(class_ptr->name, doc2, NULL);
/* other instances follow suit */ /* other instances follow suit */
ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc3, &b)); ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc3, &b));
@ -4339,8 +4379,8 @@ static void test_whitespace(void)
ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b)); ole_check(IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b));
ok(b == VARIANT_FALSE, "expected false\n"); ok(b == VARIANT_FALSE, "expected false\n");
check_ws_preserved(doc3, NULL); check_ws_preserved(class_ptr->name, doc3, NULL);
check_ws_ignored(doc4, NULL); check_ws_ignored(class_ptr->name, doc4, NULL);
IXMLDOMDocument2_Release(doc2); IXMLDOMDocument2_Release(doc2);
IXMLDOMDocument2_Release(doc3); IXMLDOMDocument2_Release(doc3);
@ -4372,6 +4412,9 @@ static void test_whitespace(void)
IXMLDOMDocument2_Release(doc1); IXMLDOMDocument2_Release(doc1);
free_bstrs(); free_bstrs();
class_ptr++;
}
} }
typedef struct { typedef struct {