| /* |
| * Schema test |
| * |
| * Copyright 2007 Huw Davies |
| * |
| * 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 <stdio.h> |
| #define COBJMACROS |
| |
| #include "initguid.h" |
| #include "windows.h" |
| #include "ole2.h" |
| #include "xmldom.h" |
| #include "msxml2.h" |
| #include "dispex.h" |
| |
| #include "wine/test.h" |
| |
| static const WCHAR schema_uri[] = {'x','-','s','c','h','e','m','a',':','t','e','s','t','.','x','m','l',0}; |
| |
| static const WCHAR 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 void test_schema_refs(void) |
| { |
| IXMLDOMDocument2 *doc; |
| IXMLDOMSchemaCollection *schema; |
| HRESULT r; |
| LONG ref; |
| VARIANT v; |
| VARIANT_BOOL b; |
| BSTR str; |
| |
| r = CoCreateInstance( &CLSID_DOMDocument, NULL, |
| CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (LPVOID*)&doc ); |
| if( r != S_OK ) |
| return; |
| |
| r = CoCreateInstance( &CLSID_XMLSchemaCache, NULL, |
| CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (LPVOID*)&schema ); |
| if( r != S_OK ) |
| { |
| IXMLDOMDocument2_Release(doc); |
| return; |
| } |
| |
| str = SysAllocString(schema_xml); |
| r = IXMLDOMDocument2_loadXML(doc, str, &b); |
| ok(r == S_OK, "ret %08x\n", r); |
| ok(b == VARIANT_TRUE, "b %04x\n", b); |
| SysFreeString(str); |
| |
| ref = IXMLDOMDocument2_AddRef(doc); |
| ok(ref == 2, "ref %d\n", ref); |
| VariantInit(&v); |
| V_VT(&v) = VT_DISPATCH; |
| V_DISPATCH(&v) = (IDispatch*)doc; |
| |
| str = SysAllocString(schema_uri); |
| r = IXMLDOMSchemaCollection_add(schema, str, v); |
| ok(r == S_OK, "ret %08x\n", r); |
| |
| /* IXMLDOMSchemaCollection_add doesn't add a ref on doc */ |
| ref = IXMLDOMDocument2_AddRef(doc); |
| ok(ref == 3, "ref %d\n", ref); |
| IXMLDOMDocument2_Release(doc); |
| |
| SysFreeString(str); |
| VariantClear(&v); |
| |
| V_VT(&v) = VT_INT; |
| r = IXMLDOMDocument2_get_schemas(doc, &v); |
| ok(r == S_FALSE, "ret %08x\n", r); |
| ok(V_VT(&v) == VT_NULL, "vt %x\n", V_VT(&v)); |
| |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 2, "ref %d\n", ref); |
| V_VT(&v) = VT_DISPATCH; |
| V_DISPATCH(&v) = (IDispatch*)schema; |
| |
| /* check that putref_schemas takes a ref */ |
| r = IXMLDOMDocument2_putref_schemas(doc, v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 4, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| VariantClear(&v); |
| |
| /* refs now 2 */ |
| V_VT(&v) = VT_INT; |
| /* check that get_schemas adds a ref */ |
| r = IXMLDOMDocument2_get_schemas(doc, &v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ok(V_VT(&v) == VT_DISPATCH, "vt %x\n", V_VT(&v)); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 4, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| |
| /* refs now 3 */ |
| /* get_schemas doesn't release a ref if passed VT_DISPATCH - ie it doesn't call VariantClear() */ |
| r = IXMLDOMDocument2_get_schemas(doc, &v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ok(V_VT(&v) == VT_DISPATCH, "vt %x\n", V_VT(&v)); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 5, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| |
| /* refs now 4 */ |
| /* release the two refs returned by get_schemas */ |
| IXMLDOMSchemaCollection_Release(schema); |
| IXMLDOMSchemaCollection_Release(schema); |
| |
| /* refs now 2 */ |
| |
| /* check that taking another ref on the document doesn't change the schema's ref count */ |
| IXMLDOMDocument2_AddRef(doc); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 3, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| IXMLDOMDocument2_Release(doc); |
| |
| |
| /* refs now 2 */ |
| /* call putref_schema with some odd variants */ |
| V_VT(&v) = VT_INT; |
| r = IXMLDOMDocument2_putref_schemas(doc, v); |
| ok(r == E_FAIL, "ret %08x\n", r); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 3, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| |
| /* refs now 2 */ |
| /* calling with VT_EMPTY releases the schema */ |
| V_VT(&v) = VT_EMPTY; |
| r = IXMLDOMDocument2_putref_schemas(doc, v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 2, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| |
| /* refs now 1 */ |
| /* try setting with VT_UNKNOWN */ |
| IXMLDOMSchemaCollection_AddRef(schema); |
| V_VT(&v) = VT_UNKNOWN; |
| V_UNKNOWN(&v) = (IUnknown*)schema; |
| r = IXMLDOMDocument2_putref_schemas(doc, v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 4, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| VariantClear(&v); |
| |
| /* refs now 2 */ |
| /* calling with VT_NULL releases the schema */ |
| V_VT(&v) = VT_NULL; |
| r = IXMLDOMDocument2_putref_schemas(doc, v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 2, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| |
| /* refs now 1 */ |
| /* set again */ |
| IXMLDOMSchemaCollection_AddRef(schema); |
| V_VT(&v) = VT_UNKNOWN; |
| V_UNKNOWN(&v) = (IUnknown*)schema; |
| r = IXMLDOMDocument2_putref_schemas(doc, v); |
| ok(r == S_OK, "ret %08x\n", r); |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 4, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| VariantClear(&v); |
| |
| /* refs now 2 */ |
| |
| /* release the final ref on the doc which should release its ref on the schema */ |
| IXMLDOMDocument2_Release(doc); |
| |
| ref = IXMLDOMSchemaCollection_AddRef(schema); |
| ok(ref == 2, "ref %d\n", ref); |
| IXMLDOMSchemaCollection_Release(schema); |
| IXMLDOMSchemaCollection_Release(schema); |
| } |
| |
| START_TEST(schema) |
| { |
| HRESULT r; |
| |
| r = CoInitialize( NULL ); |
| ok( r == S_OK, "failed to init com\n"); |
| |
| test_schema_refs(); |
| |
| CoUninitialize(); |
| } |