From 2f0e73f896a2a161e05fe117628fee72b11cd002 Mon Sep 17 00:00:00 2001 From: Adam Martinson Date: Wed, 24 Nov 2010 13:52:54 -0600 Subject: [PATCH] msxml3/tests: Move domdoc.c schema-related tests to schema.c. --- dlls/msxml3/tests/domdoc.c | 1264 ------------------------------------ dlls/msxml3/tests/schema.c | 1263 +++++++++++++++++++++++++++++++++++ 2 files changed, 1263 insertions(+), 1264 deletions(-) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index dda63a267e7..6c2bf253b6d 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -545,277 +545,6 @@ SZ_EMAIL_DTD " 0001-msxml3-tests-DTD-validation.patch" ""; -static const CHAR szDatatypeXDR[] = -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -""; - -static const CHAR szDatatypeXML[] = -"\n" -"\n" -" \n" -" testBase64\n" -" \n" -" +HugeNumber+\n" -" \n" -" \n" -" \n" -" testHex\n" -" \n" -" deadbeef\n" -" \n" -" \n" -" \n" -" testBool\n" -" \n" -" 1\n" -" \n" -" \n" -" \n" -" testChar\n" -" \n" -" u\n" -" \n" -" \n" -" \n" -" testDate\n" -" \n" -" 1998-02-01\n" -" \n" -" \n" -" \n" -" testDateTime\n" -" \n" -" 1998-02-01T12:34:56\n" -" \n" -" \n" -" \n" -" testDateTimeTz\n" -" \n" -" 1998-02-01T12:34:56-06:00\n" -" \n" -" \n" -" \n" -" testFixed\n" -" \n" -" 3.1416\n" -" \n" -" \n" -" \n" -" testFloat\n" -" \n" -" 3.14159\n" -" \n" -" \n" -" \n" -" testI1\n" -" \n" -" 42\n" -" \n" -" \n" -" \n" -" testI2\n" -" \n" -" 420\n" -" \n" -" \n" -" \n" -" testI4\n" -" \n" -" -420000000\n" -" \n" -" \n" -" \n" -" testI8\n" -" \n" -" -4200000000\n" -" \n" -" \n" -" \n" -" testInt\n" -" \n" -" 42\n" -" \n" -" \n" -" \n" -" testNmtoken\n" -" \n" -" tok1\n" -" \n" -" \n" -" \n" -" testNmtokens\n" -" \n" -" tok1 tok2 tok3\n" -" \n" -" \n" -" \n" -" testNumber\n" -" \n" -" 3.14159\n" -" \n" -" \n" -" \n" -" testR4\n" -" \n" -" 3.14159265\n" -" \n" -" \n" -" \n" -" testR8\n" -" \n" -" 3.14159265358979323846\n" -" \n" -" \n" -" \n" -" testString\n" -" \n" -" foo bar\n" -" \n" -" \n" -" \n" -" testTime\n" -" \n" -" 12:34:56\n" -" \n" -" \n" -" \n" -" testTimeTz\n" -" \n" -" 12:34:56-06:00\n" -" \n" -" \n" -" \n" -" testU1\n" -" \n" -" 255\n" -" \n" -" \n" -" \n" -" testU2\n" -" \n" -" 65535\n" -" \n" -" \n" -" \n" -" testU4\n" -" \n" -" 4294967295\n" -" \n" -" \n" -" \n" -" testU8\n" -" \n" -" 18446744073709551615\n" -" \n" -" \n" -" \n" -" testURI\n" -" \n" -" urn:schemas-microsoft-com:datatypes\n" -" \n" -" \n" -" \n" -" testUUID\n" -" \n" -" 2933BF81-7B36-11D2-B20E-00C04F983E60\n" -" \n" -" \n" -""; - -static const CHAR szOpenSeqXDR[] = -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -""; - -static const CHAR szOpenSeqXML1[] = ""; -static const CHAR szOpenSeqXML2[] = ""; -static const CHAR szOpenSeqXML3[] = ""; -static const CHAR szOpenSeqXML4[] = ""; - static const WCHAR szNonExistentFile[] = { 'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', '.', 'x', 'm', 'l', 0 }; @@ -884,17 +613,6 @@ 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) -#define _expect64(expr, str, base, TYPE, CONV) { \ - TYPE v1 = expr; \ - TYPE v2 = CONV(str, NULL, base); \ - ok(v1 == v2, #expr "returned 0x%08x%08x, expected 0x%08x%08x\n", \ - (ULONG)((ULONG64)v1 >> 32), (ULONG)((ULONG64)v2 & (ULONG64)0xffffffff), \ - (ULONG)((ULONG64)v1 >> 32), (ULONG)((ULONG64)v2 & (ULONG64)0xffffffff)); \ -} - -#define expect_int64(expr, x, base) _expect64(expr, #x, base, LONG64, strtoll) -#define expect_uint64(expr, x, base) _expect64(expr, #x, base, ULONG64, strtoull) - static void* _create_object(const GUID *clsid, const char *name, const IID *iid, int line) { void *obj = NULL; @@ -7554,986 +7272,6 @@ static void test_setAttributeNode(void) free_bstrs(); } -static void test_XDR_schemas(void) -{ - IXMLDOMDocument2 *doc, *schema; - IXMLDOMSchemaCollection* cache; - IXMLDOMParseError* err; - VARIANT_BOOL b; - VARIANT v; - BSTR bstr; - - doc = create_document(&IID_IXMLDOMDocument2); - schema = create_document(&IID_IXMLDOMDocument2); - cache = create_cache(&IID_IXMLDOMSchemaCollection); - - if (!doc || !schema || !cache) - { - if (doc) IXMLDOMDocument2_Release(doc); - if (schema) IXMLDOMDocument2_Release(schema); - if (cache) IXMLDOMSchemaCollection_Release(cache); - - return; - } - - VariantInit(&v); - - ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML1), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - ole_check(IXMLDOMDocument2_loadXML(schema, _bstr_(szOpenSeqXDR), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - /* load the schema */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_(""), v)); - VariantClear(&v); - - /* associate the cache to the doc */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); - VariantClear(&v); - - /* validate the doc - * only declared elements in the declared order - * this is fine */ - err = NULL; - bstr = NULL; - ole_check(IXMLDOMDocument2_validate(doc, &err)); - ok(err != NULL, "domdoc_validate() should always set err\n"); - ole_expect(IXMLDOMParseError_get_reason(err, &bstr), S_FALSE); - ok(IXMLDOMParseError_get_reason(err, &bstr) == S_FALSE, "got error: %s\n", wine_dbgstr_w(bstr)); - SysFreeString(bstr); - IXMLDOMParseError_Release(err); - - /* load the next doc */ - IXMLDOMDocument2_Release(doc); - doc = create_document(&IID_IXMLDOMDocument2); - ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML2), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - /* associate the cache to the doc */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); - VariantClear(&v); - - /* validate the doc - * declared elements in the declared order, with an extra declared element at the end - * this is fine */ - err = NULL; - bstr = NULL; - ole_check(IXMLDOMDocument2_validate(doc, &err)); - ok(err != NULL, "domdoc_validate() should always set err\n"); - ole_expect(IXMLDOMParseError_get_reason(err, &bstr), S_FALSE); - ok(IXMLDOMParseError_get_reason(err, &bstr) == S_FALSE, "got error: %s\n", wine_dbgstr_w(bstr)); - SysFreeString(bstr); - IXMLDOMParseError_Release(err); - - /* load the next doc */ - IXMLDOMDocument2_Release(doc); - doc = create_document(&IID_IXMLDOMDocument2); - ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML3), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - /* associate the cache to the doc */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); - VariantClear(&v); - - /* validate the doc - * fails, extra elements are only allowed at the end */ - err = NULL; - bstr = NULL; - ole_expect(IXMLDOMDocument2_validate(doc, &err), S_FALSE); - ok(err != NULL, "domdoc_validate() should always set err\n"); - todo_wine ok(IXMLDOMParseError_get_reason(err, &bstr) == S_OK, "got error: %s\n", wine_dbgstr_w(bstr)); - SysFreeString(bstr); - IXMLDOMParseError_Release(err); - - /* load the next doc */ - IXMLDOMDocument2_Release(doc); - doc = create_document(&IID_IXMLDOMDocument2); - ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML4), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - /* associate the cache to the doc */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); - VariantClear(&v); - - /* validate the doc - * fails, undeclared elements are not allowed */ - err = NULL; - bstr = NULL; - ole_expect(IXMLDOMDocument2_validate(doc, &err), S_FALSE); - ok(err != NULL, "domdoc_validate() should always set err\n"); - todo_wine ok(IXMLDOMParseError_get_reason(err, &bstr) == S_OK, "got error: %s\n", wine_dbgstr_w(bstr)); - SysFreeString(bstr); - IXMLDOMParseError_Release(err); - - IXMLDOMDocument2_Release(doc); - IXMLDOMDocument2_Release(schema); - IXMLDOMSchemaCollection_Release(cache); - - free_bstrs(); -} - -static void test_get_dataType(void) -{ - IXMLDOMDocument2 *doc, *schema; - IXMLDOMSchemaCollection* cache; - IXMLDOMNode* node; - IXMLDOMParseError* err; - VARIANT_BOOL b; - VARIANT v, vtmp; - LONG l; - BSTR bstr; - - VariantInit(&v); - - doc = create_document(&IID_IXMLDOMDocument2); - schema = create_document(&IID_IXMLDOMDocument2); - cache = create_cache(&IID_IXMLDOMSchemaCollection); - - if (!doc || !schema || !cache) - { - if (doc) IXMLDOMDocument2_Release(doc); - if (schema) IXMLDOMDocument2_Release(schema); - if (cache) IXMLDOMSchemaCollection_Release(cache); - - return; - } - - ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szDatatypeXML), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - ole_check(IXMLDOMDocument2_loadXML(schema, _bstr_(szDatatypeXDR), &b)); - ok(b == VARIANT_TRUE, "failed to load XML string\n"); - - err = NULL; - ole_expect(IXMLDOMDocument2_validate(doc, &err), S_FALSE); - ok(err != NULL, "domdoc_validate() should always set err\n"); - ole_check(IXMLDOMParseError_get_errorCode(err, &l)); - ok(l == E_XML_NODTD, "got %08x\n", l); - IXMLDOMParseError_Release(err); - - /* check data types without the schema */ - node = NULL; - memset(&vtmp, -1, sizeof(VARIANT)); - V_VT(&vtmp) = VT_NULL; - V_BSTR(&vtmp) = NULL; - memset(&v, -1, sizeof(VARIANT)); - V_VT(&v) = VT_EMPTY; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBase64']/Value/base64Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - /* when returning VT_NULL, the pointer is set to NULL */ - ok(memcmp(&v, &vtmp, sizeof(VARIANT)) == 0, "got %p\n", V_BSTR(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testHex']/Value/hexData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBool']/Value/boolData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testChar']/Value/charData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDate']/Value/dateData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTime']/Value/dateTimeData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTimeTz']/Value/dateTimeTzData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFixed']/Value/fixedData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFloat']/Value/floatData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI1']/Value/i1Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI2']/Value/i2Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI4']/Value/i4Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI8']/Value/i8Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testInt']/Value/intData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtoken']/Value/nmtokData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtokens']/Value/nmtoksData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNumber']/Value/numData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR4']/Value/r4Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR8']/Value/r8Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testString']/Value/stringData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTime']/Value/timeData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTimeTz']/Value/timeTzData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU1']/Value/u1Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU2']/Value/u2Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU4']/Value/u4Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU8']/Value/u8Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testURI']/Value/uriData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testUUID']/Value/uuidData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - /* now load the schema */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_("urn:x-schema:datatype-test-xdr"), v)); - VariantClear(&v); - - /* associate the cache to the doc */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); - VariantClear(&v); - - /* validate the doc */ - err = NULL; - l = 0; - bstr = NULL; - ole_check(IXMLDOMDocument2_validate(doc, &err)); - ok(err != NULL, "domdoc_validate() should always set err\n"); - ole_expect(IXMLDOMParseError_get_errorCode(err, &l), S_FALSE); - ole_expect(IXMLDOMParseError_get_reason(err, &bstr), S_FALSE); - ok(l == 0, "got %08x : %s\n", l, wine_dbgstr_w(bstr)); - SysFreeString(bstr); - IXMLDOMParseError_Release(err); - - /* check the data types again */ - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBase64']/Value/base64Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("bin.base64")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == (VT_ARRAY|VT_UI1), "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testHex']/Value/hexData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("bin.hex")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == (VT_ARRAY|VT_UI1), "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBool']/Value/boolData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("boolean")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BOOL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BOOL) - ok(V_BOOL(&v) == VARIANT_TRUE, "got %04x\n", V_BOOL(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testChar']/Value/charData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("char")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - todo_wine ok(V_VT(&v) == VT_I4, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_I4) - ok(V_I4(&v) == 'u', "got %08x\n", V_I4(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDate']/Value/dateData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("date")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTime']/Value/dateTimeData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("dateTime")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTimeTz']/Value/dateTimeTzData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("dateTime.tz")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFixed']/Value/fixedData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("fixed.14.4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_CY, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFloat']/Value/floatData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("float")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_R8, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_R8) - ok(V_R8(&v) == (double)3.14159, "got %f\n", V_R8(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI1']/Value/i1Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("i1")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_I1, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_I1) - ok(V_I1(&v) == 42, "got %i\n", V_I1(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI2']/Value/i2Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("i2")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_I2, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_I2) - ok(V_I2(&v) == 420, "got %i\n", V_I2(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI4']/Value/i4Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("i4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_I4, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_I4) - ok(V_I4(&v) == -420000000, "got %i\n", V_I4(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI8']/Value/i8Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("i8")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - /* TODO: which platforms return VT_I8? */ - todo_wine ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_I8) - expect_int64(V_I8(&v), -4200000000, 10); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testInt']/Value/intData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("int")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_I4, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_I4) - ok(V_I4(&v) == 42, "got %i\n", V_I4(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - /* nmtoken does not return a bstr for get_dataType() */ - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtoken']/Value/nmtokData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - /* nmtokens does not return a bstr for get_dataType() */ - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtokens']/Value/nmtoksData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNumber']/Value/numData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("number")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR4']/Value/r4Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("r4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_R4, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_R4) - ok(V_R4(&v) == (float)3.14159265, "got %f\n", V_R4(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR8']/Value/r8Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("r8")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_R8, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_R8) - todo_wine ok(V_R8(&v) == (double)3.14159265358979323846, "got %.20f\n", V_R8(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - /* dt:string is the default, does not return a bstr for get_dataType() */ - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testString']/Value/stringData"), &node)); - ok(node != NULL, "expected node\n"); - ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); - ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTime']/Value/timeData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("time")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTimeTz']/Value/timeTzData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("time.tz")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU1']/Value/u1Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("ui1")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_UI1, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_UI1) - ok(V_UI1(&v) == 0xFF, "got %02x\n", V_UI1(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU2']/Value/u2Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("ui2")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_UI2, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_UI2) - ok(V_UI2(&v) == 0xFFFF, "got %04x\n", V_UI2(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU4']/Value/u4Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("ui4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_UI4, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_UI4) - ok(V_UI4(&v) == 0xFFFFFFFF, "got %08x\n", V_UI4(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU8']/Value/u8Data"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("ui8")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - /* TODO: which platforms return VT_UI8? */ - todo_wine ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_UI8) - expect_uint64(V_UI8(&v), 0xFFFFFFFFFFFFFFFF, 16); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testURI']/Value/uriData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("uri")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - node = NULL; - ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testUUID']/Value/uuidData"), &node)); - ok(node != NULL, "expected node\n"); - ole_check(IXMLDOMNode_get_dataType(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - if (V_VT(&v) == VT_BSTR) - ok(lstrcmpW(V_BSTR(&v), _bstr_("uuid")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); - VariantClear(&v); - ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); - ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); - VariantClear(&v); - IXMLDOMNode_Release(node); - - ok(IXMLDOMDocument2_Release(schema) == 0, "schema not released\n"); - ok(IXMLDOMDocument2_Release(doc) == 0, "doc not released\n"); - ok(IXMLDOMSchemaCollection_Release(cache) == 0, "cache not released\n"); - - free_bstrs(); -} - static void test_put_dataType(void) { IXMLDOMCDATASection *cdata; @@ -8975,8 +7713,6 @@ START_TEST(domdoc) test_removeQualifiedItem(); test_get_ownerDocument(); test_setAttributeNode(); - test_XDR_schemas(); - test_get_dataType(); test_put_dataType(); test_createNode(); test_get_prefix(); diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c index 12257e10b93..9e8494a2c1b 100644 --- a/dlls/msxml3/tests/schema.c +++ b/dlls/msxml3/tests/schema.c @@ -132,6 +132,276 @@ static const CHAR xsd_schema3_xml[] = " " ""; +static const CHAR szDatatypeXDR[] = +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +""; + +static const CHAR szDatatypeXML[] = +"\n" +"\n" +" \n" +" testBase64\n" +" \n" +" +HugeNumber+\n" +" \n" +" \n" +" \n" +" testHex\n" +" \n" +" deadbeef\n" +" \n" +" \n" +" \n" +" testBool\n" +" \n" +" 1\n" +" \n" +" \n" +" \n" +" testChar\n" +" \n" +" u\n" +" \n" +" \n" +" \n" +" testDate\n" +" \n" +" 1998-02-01\n" +" \n" +" \n" +" \n" +" testDateTime\n" +" \n" +" 1998-02-01T12:34:56\n" +" \n" +" \n" +" \n" +" testDateTimeTz\n" +" \n" +" 1998-02-01T12:34:56-06:00\n" +" \n" +" \n" +" \n" +" testFixed\n" +" \n" +" 3.1416\n" +" \n" +" \n" +" \n" +" testFloat\n" +" \n" +" 3.14159\n" +" \n" +" \n" +" \n" +" testI1\n" +" \n" +" 42\n" +" \n" +" \n" +" \n" +" testI2\n" +" \n" +" 420\n" +" \n" +" \n" +" \n" +" testI4\n" +" \n" +" -420000000\n" +" \n" +" \n" +" \n" +" testI8\n" +" \n" +" -4200000000\n" +" \n" +" \n" +" \n" +" testInt\n" +" \n" +" 42\n" +" \n" +" \n" +" \n" +" testNmtoken\n" +" \n" +" tok1\n" +" \n" +" \n" +" \n" +" testNmtokens\n" +" \n" +" tok1 tok2 tok3\n" +" \n" +" \n" +" \n" +" testNumber\n" +" \n" +" 3.14159\n" +" \n" +" \n" +" \n" +" testR4\n" +" \n" +" 3.14159265\n" +" \n" +" \n" +" \n" +" testR8\n" +" \n" +" 3.14159265358979323846\n" +" \n" +" \n" +" \n" +" testString\n" +" \n" +" foo bar\n" +" \n" +" \n" +" \n" +" testTime\n" +" \n" +" 12:34:56\n" +" \n" +" \n" +" \n" +" testTimeTz\n" +" \n" +" 12:34:56-06:00\n" +" \n" +" \n" +" \n" +" testU1\n" +" \n" +" 255\n" +" \n" +" \n" +" \n" +" testU2\n" +" \n" +" 65535\n" +" \n" +" \n" +" \n" +" testU4\n" +" \n" +" 4294967295\n" +" \n" +" \n" +" \n" +" testU8\n" +" \n" +" 18446744073709551615\n" +" \n" +" \n" +" \n" +" testURI\n" +" \n" +" urn:schemas-microsoft-com:datatypes\n" +" \n" +" \n" +" \n" +" testUUID\n" +" \n" +" 2933BF81-7B36-11D2-B20E-00C04F983E60\n" +" \n" +" \n" +""; + +static const CHAR szOpenSeqXDR[] = +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +""; + +static const CHAR szOpenSeqXML1[] = ""; +static const CHAR szOpenSeqXML2[] = ""; +static const CHAR szOpenSeqXML3[] = ""; +static const CHAR szOpenSeqXML4[] = ""; #define check_ref_expr(expr, n) { \ LONG ref = expr; \ @@ -155,6 +425,17 @@ static const CHAR xsd_schema3_xml[] = ok(r == (expect), #expr " returned %x, expected %x\n", r, expect); \ } +#define _expect64(expr, str, base, TYPE, CONV) { \ + TYPE v1 = expr; \ + TYPE v2 = CONV(str, NULL, base); \ + ok(v1 == v2, #expr "returned 0x%08x%08x, expected 0x%08x%08x\n", \ + (ULONG)((ULONG64)v1 >> 32), (ULONG)((ULONG64)v2 & (ULONG64)0xffffffff), \ + (ULONG)((ULONG64)v1 >> 32), (ULONG)((ULONG64)v2 & (ULONG64)0xffffffff)); \ +} + +#define expect_int64(expr, x, base) _expect64(expr, #x, base, LONG64, strtoll) +#define expect_uint64(expr, x, base) _expect64(expr, #x, base, ULONG64, strtoull) + static BSTR alloced_bstrs[256]; static int alloced_bstrs_count; @@ -677,6 +958,986 @@ static void test_collection_content(void) free_bstrs(); } +static void test_XDR_schemas(void) +{ + IXMLDOMDocument2 *doc, *schema; + IXMLDOMSchemaCollection* cache; + IXMLDOMParseError* err; + VARIANT_BOOL b; + VARIANT v; + BSTR bstr; + + doc = create_document(&IID_IXMLDOMDocument2); + schema = create_document(&IID_IXMLDOMDocument2); + cache = create_cache(&IID_IXMLDOMSchemaCollection); + + if (!doc || !schema || !cache) + { + if (doc) IXMLDOMDocument2_Release(doc); + if (schema) IXMLDOMDocument2_Release(schema); + if (cache) IXMLDOMSchemaCollection_Release(cache); + + return; + } + + VariantInit(&v); + + ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML1), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + ole_check(IXMLDOMDocument2_loadXML(schema, _bstr_(szOpenSeqXDR), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + /* load the schema */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_(""), v)); + VariantClear(&v); + + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); + VariantClear(&v); + + /* validate the doc + * only declared elements in the declared order + * this is fine */ + err = NULL; + bstr = NULL; + ole_check(IXMLDOMDocument2_validate(doc, &err)); + ok(err != NULL, "domdoc_validate() should always set err\n"); + ole_expect(IXMLDOMParseError_get_reason(err, &bstr), S_FALSE); + ok(IXMLDOMParseError_get_reason(err, &bstr) == S_FALSE, "got error: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + /* load the next doc */ + IXMLDOMDocument2_Release(doc); + doc = create_document(&IID_IXMLDOMDocument2); + ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML2), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); + VariantClear(&v); + + /* validate the doc + * declared elements in the declared order, with an extra declared element at the end + * this is fine */ + err = NULL; + bstr = NULL; + ole_check(IXMLDOMDocument2_validate(doc, &err)); + ok(err != NULL, "domdoc_validate() should always set err\n"); + ole_expect(IXMLDOMParseError_get_reason(err, &bstr), S_FALSE); + ok(IXMLDOMParseError_get_reason(err, &bstr) == S_FALSE, "got error: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + /* load the next doc */ + IXMLDOMDocument2_Release(doc); + doc = create_document(&IID_IXMLDOMDocument2); + ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML3), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); + VariantClear(&v); + + /* validate the doc + * fails, extra elements are only allowed at the end */ + err = NULL; + bstr = NULL; + ole_expect(IXMLDOMDocument2_validate(doc, &err), S_FALSE); + ok(err != NULL, "domdoc_validate() should always set err\n"); + todo_wine ok(IXMLDOMParseError_get_reason(err, &bstr) == S_OK, "got error: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + /* load the next doc */ + IXMLDOMDocument2_Release(doc); + doc = create_document(&IID_IXMLDOMDocument2); + ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szOpenSeqXML4), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); + VariantClear(&v); + + /* validate the doc + * fails, undeclared elements are not allowed */ + err = NULL; + bstr = NULL; + ole_expect(IXMLDOMDocument2_validate(doc, &err), S_FALSE); + ok(err != NULL, "domdoc_validate() should always set err\n"); + todo_wine ok(IXMLDOMParseError_get_reason(err, &bstr) == S_OK, "got error: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + IXMLDOMDocument2_Release(doc); + IXMLDOMDocument2_Release(schema); + IXMLDOMSchemaCollection_Release(cache); + + free_bstrs(); +} + +static void test_XDR_datatypes(void) +{ + IXMLDOMDocument2 *doc, *schema; + IXMLDOMSchemaCollection* cache; + IXMLDOMNode* node; + IXMLDOMParseError* err; + VARIANT_BOOL b; + VARIANT v, vtmp; + LONG l; + BSTR bstr; + + VariantInit(&v); + + doc = create_document(&IID_IXMLDOMDocument2); + schema = create_document(&IID_IXMLDOMDocument2); + cache = create_cache(&IID_IXMLDOMSchemaCollection); + + if (!doc || !schema || !cache) + { + if (doc) IXMLDOMDocument2_Release(doc); + if (schema) IXMLDOMDocument2_Release(schema); + if (cache) IXMLDOMSchemaCollection_Release(cache); + + return; + } + + ole_check(IXMLDOMDocument2_loadXML(doc, _bstr_(szDatatypeXML), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + ole_check(IXMLDOMDocument2_loadXML(schema, _bstr_(szDatatypeXDR), &b)); + ok(b == VARIANT_TRUE, "failed to load XML string\n"); + + err = NULL; + ole_expect(IXMLDOMDocument2_validate(doc, &err), S_FALSE); + ok(err != NULL, "domdoc_validate() should always set err\n"); + ole_check(IXMLDOMParseError_get_errorCode(err, &l)); + ok(l == E_XML_NODTD, "got %08x\n", l); + IXMLDOMParseError_Release(err); + + /* check data types without the schema */ + node = NULL; + memset(&vtmp, -1, sizeof(VARIANT)); + V_VT(&vtmp) = VT_NULL; + V_BSTR(&vtmp) = NULL; + memset(&v, -1, sizeof(VARIANT)); + V_VT(&v) = VT_EMPTY; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBase64']/Value/base64Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + /* when returning VT_NULL, the pointer is set to NULL */ + ok(memcmp(&v, &vtmp, sizeof(VARIANT)) == 0, "got %p\n", V_BSTR(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testHex']/Value/hexData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBool']/Value/boolData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testChar']/Value/charData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDate']/Value/dateData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTime']/Value/dateTimeData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTimeTz']/Value/dateTimeTzData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFixed']/Value/fixedData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFloat']/Value/floatData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI1']/Value/i1Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI2']/Value/i2Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI4']/Value/i4Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI8']/Value/i8Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testInt']/Value/intData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtoken']/Value/nmtokData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtokens']/Value/nmtoksData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNumber']/Value/numData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR4']/Value/r4Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR8']/Value/r8Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testString']/Value/stringData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTime']/Value/timeData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTimeTz']/Value/timeTzData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU1']/Value/u1Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU2']/Value/u2Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU4']/Value/u4Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU8']/Value/u8Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testURI']/Value/uriData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testUUID']/Value/uuidData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + /* now load the schema */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_("urn:x-schema:datatype-test-xdr"), v)); + VariantClear(&v); + + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + ole_check(IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v))); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); + VariantClear(&v); + + /* validate the doc */ + err = NULL; + l = 0; + bstr = NULL; + ole_check(IXMLDOMDocument2_validate(doc, &err)); + ok(err != NULL, "domdoc_validate() should always set err\n"); + ole_expect(IXMLDOMParseError_get_errorCode(err, &l), S_FALSE); + ole_expect(IXMLDOMParseError_get_reason(err, &bstr), S_FALSE); + ok(l == 0, "got %08x : %s\n", l, wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + /* check the data types again */ + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBase64']/Value/base64Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("bin.base64")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == (VT_ARRAY|VT_UI1), "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testHex']/Value/hexData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("bin.hex")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == (VT_ARRAY|VT_UI1), "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testBool']/Value/boolData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("boolean")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BOOL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BOOL) + ok(V_BOOL(&v) == VARIANT_TRUE, "got %04x\n", V_BOOL(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testChar']/Value/charData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("char")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + todo_wine ok(V_VT(&v) == VT_I4, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_I4) + ok(V_I4(&v) == 'u', "got %08x\n", V_I4(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDate']/Value/dateData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("date")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTime']/Value/dateTimeData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("dateTime")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testDateTimeTz']/Value/dateTimeTzData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("dateTime.tz")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFixed']/Value/fixedData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("fixed.14.4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_CY, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testFloat']/Value/floatData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("float")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_R8, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_R8) + ok(V_R8(&v) == (double)3.14159, "got %f\n", V_R8(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI1']/Value/i1Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("i1")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_I1, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_I1) + ok(V_I1(&v) == 42, "got %i\n", V_I1(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI2']/Value/i2Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("i2")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_I2, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_I2) + ok(V_I2(&v) == 420, "got %i\n", V_I2(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI4']/Value/i4Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("i4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_I4, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_I4) + ok(V_I4(&v) == -420000000, "got %i\n", V_I4(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testI8']/Value/i8Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("i8")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + /* TODO: which platforms return VT_I8? */ + todo_wine ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_I8) + expect_int64(V_I8(&v), -4200000000, 10); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testInt']/Value/intData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("int")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_I4, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_I4) + ok(V_I4(&v) == 42, "got %i\n", V_I4(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + /* nmtoken does not return a bstr for get_dataType() */ + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtoken']/Value/nmtokData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + /* nmtokens does not return a bstr for get_dataType() */ + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNmtokens']/Value/nmtoksData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testNumber']/Value/numData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("number")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR4']/Value/r4Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("r4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_R4, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_R4) + ok(V_R4(&v) == (float)3.14159265, "got %f\n", V_R4(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testR8']/Value/r8Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("r8")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_R8, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_R8) + todo_wine ok(V_R8(&v) == (double)3.14159265358979323846, "got %.20f\n", V_R8(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + /* dt:string is the default, does not return a bstr for get_dataType() */ + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testString']/Value/stringData"), &node)); + ok(node != NULL, "expected node\n"); + ole_expect(IXMLDOMNode_get_dataType(node, &v), S_FALSE); + ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTime']/Value/timeData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("time")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testTimeTz']/Value/timeTzData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("time.tz")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_DATE, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU1']/Value/u1Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("ui1")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_UI1, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_UI1) + ok(V_UI1(&v) == 0xFF, "got %02x\n", V_UI1(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU2']/Value/u2Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("ui2")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_UI2, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_UI2) + ok(V_UI2(&v) == 0xFFFF, "got %04x\n", V_UI2(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU4']/Value/u4Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("ui4")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_UI4, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_UI4) + ok(V_UI4(&v) == 0xFFFFFFFF, "got %08x\n", V_UI4(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testU8']/Value/u8Data"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("ui8")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + /* TODO: which platforms return VT_UI8? */ + todo_wine ok(V_VT(&v) == VT_NULL, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_UI8) + expect_uint64(V_UI8(&v), 0xFFFFFFFFFFFFFFFF, 16); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testURI']/Value/uriData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("uri")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + node = NULL; + ole_check(IXMLDOMDocument2_selectSingleNode(doc, _bstr_("//Property[Name!text()='testUUID']/Value/uuidData"), &node)); + ok(node != NULL, "expected node\n"); + ole_check(IXMLDOMNode_get_dataType(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + if (V_VT(&v) == VT_BSTR) + ok(lstrcmpW(V_BSTR(&v), _bstr_("uuid")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + ole_check(IXMLDOMNode_get_nodeTypedValue(node, &v)); + ok(V_VT(&v) == VT_BSTR, "got variant type %i\n", V_VT(&v)); + VariantClear(&v); + IXMLDOMNode_Release(node); + + ok(IXMLDOMDocument2_Release(schema) == 0, "schema not released\n"); + ok(IXMLDOMDocument2_Release(doc) == 0, "doc not released\n"); + ok(IXMLDOMSchemaCollection_Release(cache) == 0, "cache not released\n"); + + free_bstrs(); +} + START_TEST(schema) { HRESULT r; @@ -688,6 +1949,8 @@ START_TEST(schema) test_collection_refs(); test_length(); test_collection_content(); + test_XDR_schemas(); + test_XDR_datatypes(); CoUninitialize(); }