/* * Schema test * * Copyright 2007 Huw Davies * Copyright 2010 Adam Martinson for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include #define COBJMACROS #include "initguid.h" #include "windows.h" #include "ole2.h" #include "msxml2.h" #include "dispex.h" #include "wine/test.h" static const WCHAR xdr_schema_uri[] = {'x','-','s','c','h','e','m','a',':','t','e','s','t','.','x','m','l',0}; static const WCHAR xdr_schema_xml[] = { '<','S','c','h','e','m','a',' ','x','m','l','n','s','=','\"','u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','x','m','l','-','d','a','t','a','\"','\n', 'x','m','l','n','s',':','d','t','=','\"','u','r','n',':','s','c','h','e','m','a','s','-','m','i','c','r','o','s','o','f','t','-','c','o','m',':','d','a','t','a','t','y','p','e','s','\"','>','\n', '<','/','S','c','h','e','m','a','>','\n',0 }; static const CHAR xdr_schema1_uri[] = "x-schema:test1.xdr"; static const CHAR xdr_schema1_xml[] = "" "" " " " " " " " " " " " " " " " " " " " " ""; static const CHAR xdr_schema2_uri[] = "x-schema:test2.xdr"; static const CHAR xdr_schema2_xml[] = "" "" " " " " " " " " " " " " " " " " ""; static const CHAR xdr_schema3_uri[] = "x-schema:test3.xdr"; static const CHAR xdr_schema3_xml[] = "" "" " " " " " " " " " " " " " " " " ""; static const CHAR xsd_schema1_uri[] = "x-schema:test1.xsd"; static const CHAR xsd_schema1_xml[] = "" "" " " " " " " " " " " " " " " ""; static const CHAR xsd_schema2_uri[] = "x-schema:test2.xsd"; static const CHAR xsd_schema2_xml[] = "" "" " " " " " " " " " " " " " " ""; static const CHAR xsd_schema3_uri[] = "x-schema:test3.xsd"; 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; \ ok(ref == n, "expected %i refs, got %i\n", n, ref); \ } #define check_refs(iface, obj, n) { \ LONG ref = iface ## _AddRef(obj); \ ok(ref == n+1, "expected %i refs, got %i\n", n+1, ref); \ ref = iface ## _Release(obj); \ ok(ref == n, "expected %i refs, got %i\n", n, ref); \ } #define ole_check(expr) { \ HRESULT r = expr; \ ok(r == S_OK, #expr " returned %x\n", r); \ } #define ole_expect(expr, expect) { \ HRESULT r = expr; \ 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; static BSTR alloc_str_from_narrow(const char *str) { int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); BSTR ret = SysAllocStringLen(NULL, len - 1); /* NUL character added automatically */ MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); return ret; } static BSTR _bstr_(const char *str) { assert(alloced_bstrs_count < sizeof(alloced_bstrs)/sizeof(alloced_bstrs[0])); alloced_bstrs[alloced_bstrs_count] = alloc_str_from_narrow(str); return alloced_bstrs[alloced_bstrs_count++]; } static void free_bstrs(void) { int i; for (i = 0; i < alloced_bstrs_count; i++) SysFreeString(alloced_bstrs[i]); alloced_bstrs_count = 0; } static VARIANT _variantdoc_(void* doc) { VARIANT v; V_VT(&v) = VT_DISPATCH; V_DISPATCH(&v) = (IDispatch*)doc; return v; } static void* _create_object(const GUID *clsid, const char *name, const IID *iid, int line) { void *obj = NULL; HRESULT hr; hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, iid, &obj); if (hr != S_OK) win_skip_(__FILE__,line)("failed to create %s instance: 0x%08x\n", name, hr); return obj; } #define _create(cls) cls, #cls #define create_document(iid) _create_object(&_create(CLSID_DOMDocument), iid, __LINE__) #define create_document_version(v, iid) _create_object(&_create(CLSID_DOMDocument ## v), iid, __LINE__) #define create_cache(iid) _create_object(&_create(CLSID_XMLSchemaCache), iid, __LINE__) #define create_cache_version(v, iid) _create_object(&_create(CLSID_XMLSchemaCache ## v), iid, __LINE__) static void test_schema_refs(void) { static const WCHAR emptyW[] = {0}; IXMLDOMDocument2 *doc; IXMLDOMNode *node; IXMLDOMSchemaCollection *cache; VARIANT v; VARIANT_BOOL b; BSTR str; LONG len; doc = create_document(&IID_IXMLDOMDocument2); if (!doc) return; cache = create_cache(&IID_IXMLDOMSchemaCollection); if(!cache) { IXMLDOMDocument2_Release(doc); return; } VariantInit(&v); str = SysAllocString(xdr_schema_xml); ole_check(IXMLDOMDocument2_loadXML(doc, str, &b)); ok(b == VARIANT_TRUE, "b %04x\n", b); SysFreeString(str); node = (void*)0xdeadbeef; ole_check(IXMLDOMSchemaCollection_get(cache, NULL, &node)); ok(node == NULL, "%p\n", node); /* NULL uri pointer, still adds a document */ ole_check(IXMLDOMSchemaCollection_add(cache, NULL, _variantdoc_(doc))); len = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &len)); ok(len == 1, "got %d\n", len); /* read back - empty valid BSTR */ str = NULL; ole_check(IXMLDOMSchemaCollection_get_namespaceURI(cache, 0, &str)); ok(str && *str == 0, "got %p\n", str); SysFreeString(str); node = NULL; ole_check(IXMLDOMSchemaCollection_get(cache, NULL, &node)); ok(node != NULL, "%p\n", node); IXMLDOMNode_Release(node); node = NULL; str = SysAllocString(emptyW); ole_check(IXMLDOMSchemaCollection_get(cache, str, &node)); ok(node != NULL, "%p\n", node); IXMLDOMNode_Release(node); SysFreeString(str); /* remove with NULL uri */ ole_check(IXMLDOMSchemaCollection_remove(cache, NULL)); len = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &len)); ok(len == 0, "got %d\n", len); str = SysAllocString(xdr_schema_uri); ole_check(IXMLDOMSchemaCollection_add(cache, str, _variantdoc_(doc))); /* IXMLDOMSchemaCollection_add doesn't add a ref on doc */ check_refs(IXMLDOMDocument2, doc, 1); SysFreeString(str); V_VT(&v) = VT_INT; ole_expect(IXMLDOMDocument2_get_schemas(doc, &v), S_FALSE); ok(V_VT(&v) == VT_NULL, "vt %x\n", V_VT(&v)); check_ref_expr(IXMLDOMSchemaCollection_AddRef(cache), 2); V_VT(&v) = VT_DISPATCH; V_DISPATCH(&v) = (IDispatch*)cache; /* check that putref_schemas takes a ref */ ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); check_refs(IXMLDOMSchemaCollection, cache, 3); VariantClear(&v); /* refs now 2 */ V_VT(&v) = VT_INT; /* check that get_schemas adds a ref */ ole_check(IXMLDOMDocument2_get_schemas(doc, &v)); ok(V_VT(&v) == VT_DISPATCH, "vt %x\n", V_VT(&v)); check_refs(IXMLDOMSchemaCollection, cache, 3); /* get_schemas doesn't release a ref if passed VT_DISPATCH - ie it doesn't call VariantClear() */ ole_check(IXMLDOMDocument2_get_schemas(doc, &v)); ok(V_VT(&v) == VT_DISPATCH, "vt %x\n", V_VT(&v)); check_refs(IXMLDOMSchemaCollection, cache, 4); /* release the two refs returned by get_schemas */ check_ref_expr(IXMLDOMSchemaCollection_Release(cache), 3); check_ref_expr(IXMLDOMSchemaCollection_Release(cache), 2); /* check that taking another ref on the document doesn't change the schema's ref count */ check_ref_expr(IXMLDOMDocument2_AddRef(doc), 2); check_refs(IXMLDOMSchemaCollection, cache, 2); check_ref_expr(IXMLDOMDocument2_Release(doc), 1); /* call putref_schema with some odd variants */ V_VT(&v) = VT_INT; ole_expect(IXMLDOMDocument2_putref_schemas(doc, v), E_FAIL); check_refs(IXMLDOMSchemaCollection, cache, 2); /* calling with VT_EMPTY releases the schema */ V_VT(&v) = VT_EMPTY; ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); check_refs(IXMLDOMSchemaCollection, cache, 1); /* try setting with VT_UNKNOWN */ check_ref_expr(IXMLDOMSchemaCollection_AddRef(cache), 2); V_VT(&v) = VT_UNKNOWN; V_UNKNOWN(&v) = (IUnknown*)cache; ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); check_refs(IXMLDOMSchemaCollection, cache, 3); VariantClear(&v); /* refs now 2 */ /* calling with VT_NULL releases the schema */ V_VT(&v) = VT_NULL; ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); check_refs(IXMLDOMSchemaCollection, cache, 1); /* refs now 1 */ /* set again */ check_ref_expr(IXMLDOMSchemaCollection_AddRef(cache), 2); V_VT(&v) = VT_UNKNOWN; V_UNKNOWN(&v) = (IUnknown*)cache; ole_check(IXMLDOMDocument2_putref_schemas(doc, v)); check_refs(IXMLDOMSchemaCollection, cache, 3); VariantClear(&v); /* refs now 2 */ /* release the final ref on the doc which should release its ref on the schema */ check_ref_expr(IXMLDOMDocument2_Release(doc), 0); check_refs(IXMLDOMSchemaCollection, cache, 1); check_ref_expr(IXMLDOMSchemaCollection_Release(cache), 0); } static void test_collection_refs(void) { IXMLDOMDocument2 *schema1, *schema2, *schema3; IXMLDOMSchemaCollection *cache1, *cache2, *cache3; VARIANT_BOOL b; LONG length; schema1 = create_document(&IID_IXMLDOMDocument2); schema2 = create_document(&IID_IXMLDOMDocument2); schema3 = create_document(&IID_IXMLDOMDocument2); cache1 = create_cache(&IID_IXMLDOMSchemaCollection); cache2 = create_cache(&IID_IXMLDOMSchemaCollection); cache3 = create_cache(&IID_IXMLDOMSchemaCollection); if (!schema1 || !schema2 || !schema3 || !cache1 || !cache2 || !cache3) { if (schema1) IXMLDOMDocument2_Release(schema1); if (schema2) IXMLDOMDocument2_Release(schema2); if (schema3) IXMLDOMDocument2_Release(schema3); if (cache1) IXMLDOMSchemaCollection_Release(cache1); if (cache2) IXMLDOMSchemaCollection_Release(cache2); if (cache3) IXMLDOMSchemaCollection_Release(cache2); return; } ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema3, _bstr_(xdr_schema3_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema1_uri), _variantdoc_(schema1))); ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema2_uri), _variantdoc_(schema2))); ole_check(IXMLDOMSchemaCollection_add(cache3, _bstr_(xdr_schema3_uri), _variantdoc_(schema3))); check_ref_expr(IXMLDOMDocument2_Release(schema1), 0); check_ref_expr(IXMLDOMDocument2_Release(schema2), 0); check_ref_expr(IXMLDOMDocument2_Release(schema3), 0); schema1 = NULL; schema2 = NULL; schema3 = NULL; /* releasing the original doc does not affect the schema cache */ ole_check(IXMLDOMSchemaCollection_get(cache1, _bstr_(xdr_schema1_uri), (IXMLDOMNode**)&schema1)); ole_check(IXMLDOMSchemaCollection_get(cache2, _bstr_(xdr_schema2_uri), (IXMLDOMNode**)&schema2)); ole_check(IXMLDOMSchemaCollection_get(cache3, _bstr_(xdr_schema3_uri), (IXMLDOMNode**)&schema3)); /* we get a read-only domdoc interface, created just for us */ if (schema1) check_refs(IXMLDOMDocument2, schema1, 1); if (schema2) check_refs(IXMLDOMDocument2, schema2, 1); if (schema3) check_refs(IXMLDOMDocument2, schema3, 1); ole_expect(IXMLDOMSchemaCollection_addCollection(cache1, NULL), E_POINTER); ole_check(IXMLDOMSchemaCollection_addCollection(cache2, cache1)); ole_check(IXMLDOMSchemaCollection_addCollection(cache3, cache2)); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache1, &length)); ok(length == 1, "expected length 1, got %i\n", length); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache2, &length)); ok(length == 2, "expected length 2, got %i\n", length); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache3, &length)); ok(length == 3, "expected length 3, got %i\n", length); /* merging collections does not affect the ref count */ check_refs(IXMLDOMSchemaCollection, cache1, 1); check_refs(IXMLDOMSchemaCollection, cache2, 1); check_refs(IXMLDOMSchemaCollection, cache3, 1); /* nor does it affect the domdoc instances */ if (schema1) check_refs(IXMLDOMDocument2, schema1, 1); if (schema2) check_refs(IXMLDOMDocument2, schema2, 1); if (schema3) check_refs(IXMLDOMDocument2, schema3, 1); if (schema1) check_ref_expr(IXMLDOMDocument2_Release(schema1), 0); if (schema2) check_ref_expr(IXMLDOMDocument2_Release(schema2), 0); if (schema3) check_ref_expr(IXMLDOMDocument2_Release(schema3), 0); schema1 = NULL; schema2 = NULL; schema3 = NULL; /* releasing the domdoc instances doesn't change the cache */ ole_check(IXMLDOMSchemaCollection_get(cache1, _bstr_(xdr_schema1_uri), (IXMLDOMNode**)&schema1)); ole_check(IXMLDOMSchemaCollection_get(cache2, _bstr_(xdr_schema2_uri), (IXMLDOMNode**)&schema2)); ole_check(IXMLDOMSchemaCollection_get(cache3, _bstr_(xdr_schema3_uri), (IXMLDOMNode**)&schema3)); /* we can just get them again */ if (schema1) check_refs(IXMLDOMDocument2, schema1, 1); if (schema2) check_refs(IXMLDOMDocument2, schema2, 1); if (schema3) check_refs(IXMLDOMDocument2, schema3, 1); /* releasing the caches does not affect the domdoc instances */ check_ref_expr(IXMLDOMSchemaCollection_Release(cache1), 0); check_ref_expr(IXMLDOMSchemaCollection_Release(cache2), 0); check_ref_expr(IXMLDOMSchemaCollection_Release(cache3), 0); /* they're just for us */ if (schema1) check_refs(IXMLDOMDocument2, schema1, 1); if (schema2) check_refs(IXMLDOMDocument2, schema2, 1); if (schema3) check_refs(IXMLDOMDocument2, schema3, 1); if (schema1) check_ref_expr(IXMLDOMDocument2_Release(schema1), 0); if (schema2) check_ref_expr(IXMLDOMDocument2_Release(schema2), 0); if (schema3) check_ref_expr(IXMLDOMDocument2_Release(schema3), 0); free_bstrs(); } static void test_length(void) { IXMLDOMDocument2 *schema1, *schema2, *schema3; IXMLDOMSchemaCollection *cache; VARIANT_BOOL b; VARIANT v; LONG length; schema1 = create_document(&IID_IXMLDOMDocument2); schema2 = create_document(&IID_IXMLDOMDocument2); schema3 = create_document(&IID_IXMLDOMDocument2); cache = create_cache(&IID_IXMLDOMSchemaCollection); if (!schema1 || !schema2 || !schema3 || !cache) { if (schema1) IXMLDOMDocument2_Release(schema1); if (schema2) IXMLDOMDocument2_Release(schema2); if (schema3) IXMLDOMDocument2_Release(schema3); if (cache) IXMLDOMSchemaCollection_Release(cache); return; } VariantInit(&v); ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema3, _bstr_(xdr_schema3_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_expect(IXMLDOMSchemaCollection_get_length(cache, NULL), E_POINTER); /* MSDN lies; removing a nonexistent entry produces no error */ ole_check(IXMLDOMSchemaCollection_remove(cache, NULL)); ole_check(IXMLDOMSchemaCollection_remove(cache, _bstr_(xdr_schema1_uri))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 0, "expected length 0, got %i\n", length); ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_(xdr_schema1_uri), _variantdoc_(schema1))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 1, "expected length 1, got %i\n", length); ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_(xdr_schema2_uri), _variantdoc_(schema2))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 2, "expected length 2, got %i\n", length); ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_(xdr_schema3_uri), _variantdoc_(schema3))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 3, "expected length 3, got %i\n", length); /* adding with VT_NULL is the same as removing */ V_VT(&v) = VT_NULL; ole_check(IXMLDOMSchemaCollection_add(cache, _bstr_(xdr_schema1_uri), v)); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 2, "expected length 2, got %i\n", length); ole_check(IXMLDOMSchemaCollection_remove(cache, _bstr_(xdr_schema2_uri))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 1, "expected length 1, got %i\n", length); ole_check(IXMLDOMSchemaCollection_remove(cache, _bstr_(xdr_schema3_uri))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache, &length)); ok(length == 0, "expected length 0, got %i\n", length); IXMLDOMDocument2_Release(schema1); IXMLDOMDocument2_Release(schema2); IXMLDOMDocument2_Release(schema3); IXMLDOMSchemaCollection_Release(cache); free_bstrs(); } static void test_collection_content(void) { IXMLDOMDocument2 *schema1, *schema2, *schema3, *schema4, *schema5; IXMLDOMSchemaCollection *cache1, *cache2; VARIANT_BOOL b; BSTR bstr; BSTR content[5] = {NULL, NULL, NULL, NULL, NULL}; LONG length; int i, j; schema1 = create_document_version(30, &IID_IXMLDOMDocument2); schema2 = create_document_version(30, &IID_IXMLDOMDocument2); schema3 = create_document_version(30, &IID_IXMLDOMDocument2); cache1 = create_cache_version(30, &IID_IXMLDOMSchemaCollection); cache2 = create_cache_version(40, &IID_IXMLDOMSchemaCollection); if (!schema1 || !schema2 || !schema3 || !cache1) { if (schema1) IXMLDOMDocument2_Release(schema1); if (schema2) IXMLDOMDocument2_Release(schema2); if (schema3) IXMLDOMDocument2_Release(schema3); if (cache1) IXMLDOMSchemaCollection_Release(cache1); return; } ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema3, _bstr_(xdr_schema3_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema1_uri), _variantdoc_(schema1))); ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema2_uri), _variantdoc_(schema2))); ole_check(IXMLDOMSchemaCollection_add(cache1, _bstr_(xdr_schema3_uri), _variantdoc_(schema3))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache1, &length)); ok(length == 3, "expected length 3, got %i\n", length); IXMLDOMDocument2_Release(schema1); IXMLDOMDocument2_Release(schema2); IXMLDOMDocument2_Release(schema3); if (cache2) { schema1 = create_document_version(40, &IID_IXMLDOMDocument2); schema2 = create_document_version(40, &IID_IXMLDOMDocument2); schema3 = create_document_version(40, &IID_IXMLDOMDocument2); schema4 = create_document_version(40, &IID_IXMLDOMDocument2); schema5 = create_document_version(40, &IID_IXMLDOMDocument2); ole_check(IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema3, _bstr_(xsd_schema1_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema4, _bstr_(xsd_schema2_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); ole_check(IXMLDOMDocument2_loadXML(schema5, _bstr_(xsd_schema3_xml), &b)); ok(b == VARIANT_TRUE, "failed to load XML\n"); /* combining XDR and XSD schemas in the same cache is fine */ ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema1_uri), _variantdoc_(schema1))); ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema2_uri), _variantdoc_(schema2))); ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema1_uri), _variantdoc_(schema3))); ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema2_uri), _variantdoc_(schema4))); ole_check(IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema3_uri), _variantdoc_(schema5))); length = -1; ole_check(IXMLDOMSchemaCollection_get_length(cache2, &length)); ok(length == 5, "expected length 5, got %i\n", length); IXMLDOMDocument2_Release(schema1); IXMLDOMDocument2_Release(schema2); IXMLDOMDocument2_Release(schema3); IXMLDOMDocument2_Release(schema4); IXMLDOMDocument2_Release(schema5); } bstr = NULL; /* error if index is out of range */ ole_expect(IXMLDOMSchemaCollection_get_namespaceURI(cache1, 3, &bstr), E_FAIL); SysFreeString(bstr); /* error if return pointer is NULL */ ole_expect(IXMLDOMSchemaCollection_get_namespaceURI(cache1, 0, NULL), E_POINTER); /* pointer is checked first */ ole_expect(IXMLDOMSchemaCollection_get_namespaceURI(cache1, 3, NULL), E_POINTER); schema1 = NULL; /* no error if ns uri does not exist */ ole_check(IXMLDOMSchemaCollection_get(cache1, _bstr_(xsd_schema1_uri), (IXMLDOMNode**)&schema1)); ok(!schema1, "expected NULL\n"); /* a NULL bstr corresponds to no-uri ns */ ole_check(IXMLDOMSchemaCollection_get(cache1, NULL, (IXMLDOMNode**)&schema1)); ok(!schema1, "expected NULL\n"); /* error if return pointer is NULL */ ole_expect(IXMLDOMSchemaCollection_get(cache1, _bstr_(xdr_schema1_uri), NULL), E_POINTER); for (i = 0; i < 3; ++i) { bstr = NULL; ole_check(IXMLDOMSchemaCollection_get_namespaceURI(cache1, i, &bstr)); ok(bstr != NULL && *bstr, "expected non-empty string\n"); content[i] = bstr; for (j = 0; j < i; ++j) ok(winetest_strcmpW(content[j], bstr), "got duplicate entry\n"); } for (i = 0; i < 3; ++i) { SysFreeString(content[i]); content[i] = NULL; } if (cache2) { for (i = 0; i < 5; ++i) { bstr = NULL; ole_check(IXMLDOMSchemaCollection_get_namespaceURI(cache2, i, &bstr)); ok(bstr != NULL && *bstr, "expected non-empty string\n"); for (j = 0; j < i; ++j) ok(winetest_strcmpW(content[j], bstr), "got duplicate entry\n"); content[i] = bstr; } for (i = 0; i < 5; ++i) { SysFreeString(content[i]); content[i] = NULL; } } IXMLDOMSchemaCollection_Release(cache1); if (cache2) IXMLDOMSchemaCollection_Release(cache2); 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; r = CoInitialize( NULL ); ok( r == S_OK, "failed to init com\n"); test_schema_refs(); test_collection_refs(); test_length(); test_collection_content(); test_XDR_schemas(); test_XDR_datatypes(); CoUninitialize(); }