From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/schema.c | 158 ------------------------- dlls/msxml4/tests/Makefile.in | 3 +- dlls/msxml4/tests/schema.c | 215 ++++++++++++++++++++++++++++++++++ dlls/msxml6/tests/Makefile.in | 3 +- dlls/msxml6/tests/schema.c | 215 ++++++++++++++++++++++++++++++++++ 5 files changed, 434 insertions(+), 160 deletions(-) create mode 100644 dlls/msxml4/tests/schema.c create mode 100644 dlls/msxml6/tests/schema.c
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c index efc3a8e56e3..cd86e047667 100644 --- a/dlls/msxml3/tests/schema.c +++ b/dlls/msxml3/tests/schema.c @@ -1158,163 +1158,6 @@ static void test_collection_content(void) free_bstrs(); }
-static HRESULT validate_regex_document(IXMLDOMDocument2 *doc, IXMLDOMDocument2 *schema, IXMLDOMSchemaCollection* cache, - const WCHAR *regex, const WCHAR *input) -{ - static const WCHAR regex_doc[] = -L"" -"<?xml version='1.0'?>" -"<root xmlns='urn:test'>%s</root>"; - - static const WCHAR regex_schema[] = -L"<?xml version='1.0'?>" -"<schema xmlns='http://www.w3.org/2001/XMLSchema'" -" targetNamespace='urn:test'>" -" <element name='root'>" -" <simpleType>" -" <restriction base='string'>" -" <pattern value='%s'/>" -" </restriction>" -" </simpleType>" -" </element>" -"</schema>"; - - WCHAR buffer[1024]; - IXMLDOMParseError* err; - VARIANT v; - VARIANT_BOOL b; - BSTR namespace; - BSTR bstr; - HRESULT hr; - - VariantInit(&v); - - swprintf(buffer, ARRAY_SIZE(buffer), regex_doc, input); - bstr = SysAllocString(buffer); - hr = IXMLDOMDocument2_loadXML(doc, bstr, &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - SysFreeString(bstr); - - swprintf(buffer, ARRAY_SIZE(buffer), regex_schema, regex); - bstr = SysAllocString(buffer); - hr = IXMLDOMDocument2_loadXML(schema, bstr, &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - SysFreeString(bstr); - - /* add the schema to the cache */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - hr = IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - namespace = SysAllocString(L"urn:test"); - hr = IXMLDOMSchemaCollection_add(cache, namespace, v); - SysFreeString(namespace); - VariantClear(&v); - if (FAILED(hr)) - return hr; - - /* associate the cache to the doc */ - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = NULL; - hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); - hr = IXMLDOMDocument2_putref_schemas(doc, v); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - VariantClear(&v); - - /* validate the doc - * only declared elements in the declared order - * this is fine */ - err = NULL; - bstr = NULL; - hr = IXMLDOMDocument2_validate(doc, &err); - ok(err != NULL, "domdoc_validate() should always set err\n"); - if (IXMLDOMParseError_get_reason(err, &bstr) != S_FALSE) - trace("got error: %s\n", wine_dbgstr_w(bstr)); - SysFreeString(bstr); - IXMLDOMParseError_Release(err); - - return hr; -} - -static void test_regex(void) -{ - struct regex_test { - const WCHAR *regex; - const WCHAR *input; - }; - - struct regex_test tests[] = { - { L"\!", L"!" }, - { L"\"", L""" }, - { L"\#", L"#" }, - { L"\$", L"$" }, - { L"\%", L"%" }, - { L"\,", L"," }, - { L"\/", L"/" }, - { L"\:", L":" }, - { L"\;", L";" }, - { L"\=", L"=" }, - { L"\>", L">" }, - { L"\@", L"@" }, - { L"\`", L"`" }, - { L"\~", L"~" }, - { L"\uCAFE", L"\xCAFE" }, - /* non-BMP character in surrogate pairs: */ - { L"\uD83D\uDE00", L"\xD83D\xDE00" }, - /* "x{,2}" is non-standard and only works on libxml2 <= v2.9.10 */ - { L"x{0,2}", L"x" } - }; - - int i; - - for (i = 0; i < ARRAY_SIZE(tests); i++) - { - IXMLDOMDocument2 *doc40, *doc60; - IXMLDOMDocument2 *schema40, *schema60; - IXMLDOMSchemaCollection *cache40, *cache60; - - doc40 = create_document_version(40, &IID_IXMLDOMDocument2); - doc60 = create_document_version(60, &IID_IXMLDOMDocument2); - schema40 = create_document_version(40, &IID_IXMLDOMDocument2); - schema60 = create_document_version(60, &IID_IXMLDOMDocument2); - cache40 = create_cache_version(40, &IID_IXMLDOMSchemaCollection); - cache60 = create_cache_version(60, &IID_IXMLDOMSchemaCollection); - - if (doc60 && schema60 && cache60) - { - HRESULT hr = validate_regex_document(doc60, schema60, cache60, tests[i].regex, tests[i].input); - ok(hr == S_OK, "got %#lx for version 60 regex %s input %s\n", - hr, wine_dbgstr_w(tests[i].regex), wine_dbgstr_w(tests[i].input)); - if (doc40 && schema40 && cache40) - { - hr = validate_regex_document(doc40, schema40, cache40, tests[i].regex, tests[i].input); - ok(hr == S_OK, "got %#lx version 40 regex %s input %s\n", - hr, wine_dbgstr_w(tests[i].regex), wine_dbgstr_w(tests[i].input)); - } - } - else - ok(0, "out of memory\n"); - - if (doc40) - IXMLDOMDocument2_Release(doc40); - if (doc60) - IXMLDOMDocument2_Release(doc60); - if (schema40) - IXMLDOMDocument2_Release(schema40); - if (schema60) - IXMLDOMDocument2_Release(schema60); - if (cache40) - IXMLDOMSchemaCollection_Release(cache40); - if (cache60) - IXMLDOMSchemaCollection_Release(cache60); - } -} - static void test_XDR_schemas(void) { IXMLDOMDocument2 *doc, *schema; @@ -1999,7 +1842,6 @@ START_TEST(schema) test_collection_refs(); test_length(); test_collection_content(); - test_regex(); test_XDR_schemas(); test_XDR_datatypes(); test_validate_on_load(); diff --git a/dlls/msxml4/tests/Makefile.in b/dlls/msxml4/tests/Makefile.in index 2daf770868e..4b790466411 100644 --- a/dlls/msxml4/tests/Makefile.in +++ b/dlls/msxml4/tests/Makefile.in @@ -2,4 +2,5 @@ TESTDLL = msxml4.dll IMPORTS = oleaut32 ole32
SOURCES = \ - domdoc.c + domdoc.c \ + schema.c diff --git a/dlls/msxml4/tests/schema.c b/dlls/msxml4/tests/schema.c new file mode 100644 index 00000000000..dec29e2d0e6 --- /dev/null +++ b/dlls/msxml4/tests/schema.c @@ -0,0 +1,215 @@ +/* + * 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 <stdio.h> +#include <assert.h> +#define COBJMACROS + +#include "ole2.h" +#include "msxml2.h" + +#include "wine/test.h" + +static IXMLDOMDocument2 *create_document(void) +{ + IXMLDOMDocument2 *obj = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&obj); + ok(hr == S_OK, "Failed to create a document object, hr %#lx.\n", hr); + + return obj; +} + +static IXMLDOMSchemaCollection *create_cache(void) +{ + IXMLDOMSchemaCollection *obj = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLSchemaCache40, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (void **)&obj); + ok(hr == S_OK, "Failed to create a document object, hr %#lx.\n", hr); + + return obj; +} + +static HRESULT validate_regex_document(IXMLDOMDocument2 *doc, IXMLDOMDocument2 *schema, IXMLDOMSchemaCollection* cache, + const WCHAR *regex, const WCHAR *input) +{ + static const WCHAR regex_doc[] = +L"" +"<?xml version='1.0'?>" +"<root xmlns='urn:test'>%s</root>"; + + static const WCHAR regex_schema[] = +L"<?xml version='1.0'?>" +"<schema xmlns='http://www.w3.org/2001/XMLSchema'" +" targetNamespace='urn:test'>" +" <element name='root'>" +" <simpleType>" +" <restriction base='string'>" +" <pattern value='%s'/>" +" </restriction>" +" </simpleType>" +" </element>" +"</schema>"; + + WCHAR buffer[1024]; + IXMLDOMParseError* err; + BSTR namespace, bstr; + VARIANT_BOOL b; + HRESULT hr; + VARIANT v; + + VariantInit(&v); + + swprintf(buffer, ARRAY_SIZE(buffer), regex_doc, input); + bstr = SysAllocString(buffer); + hr = IXMLDOMDocument2_loadXML(doc, bstr, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + SysFreeString(bstr); + + swprintf(buffer, ARRAY_SIZE(buffer), regex_schema, regex); + bstr = SysAllocString(buffer); + hr = IXMLDOMDocument2_loadXML(schema, bstr, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + SysFreeString(bstr); + + /* add the schema to the cache */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + hr = IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + namespace = SysAllocString(L"urn:test"); + hr = IXMLDOMSchemaCollection_add(cache, namespace, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + SysFreeString(namespace); + VariantClear(&v); +/* + if (FAILED(hr)) + return hr; +*/ + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + hr = IXMLDOMDocument2_putref_schemas(doc, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + /* validate the doc + * only declared elements in the declared order + * this is fine */ + err = NULL; + bstr = NULL; + hr = IXMLDOMDocument2_validate(doc, &err); + ok(err != NULL, "domdoc_validate() should always set err\n"); + if (IXMLDOMParseError_get_reason(err, &bstr) != S_FALSE) + trace("got error: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + return hr; +} + +static void test_regex(void) +{ + static const struct regex_test + { + const WCHAR *regex; + const WCHAR *input; + } + tests[] = + { + { L"\!", L"!" }, + { L"\"", L""" }, + { L"\#", L"#" }, + { L"\$", L"$" }, + { L"\%", L"%" }, + { L"\,", L"," }, + { L"\/", L"/" }, + { L"\:", L":" }, + { L"\;", L";" }, + { L"\=", L"=" }, + { L"\>", L">" }, + { L"\@", L"@" }, + { L"\`", L"`" }, + { L"\~", L"~" }, + { L"\uCAFE", L"\xCAFE" }, + /* non-BMP character in surrogate pairs: */ + { L"\uD83D\uDE00", L"\xD83D\xDE00" }, + /* "x{,2}" is non-standard and only works on libxml2 <= v2.9.10 */ + { L"x{0,2}", L"x" } + }; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(tests); ++i) + { + const struct regex_test *test = &tests[i]; + IXMLDOMDocument2 *doc, *schema; + IXMLDOMSchemaCollection *cache; + HRESULT hr; + + winetest_push_context("Test %s", wine_dbgstr_w(test->regex)); + + doc = create_document(); + schema = create_document(); + cache = create_cache(); + + hr = validate_regex_document(doc, schema, cache, tests->regex, tests->input); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + if (doc) + IXMLDOMDocument2_Release(doc); + if (schema) + IXMLDOMDocument2_Release(schema); + if (cache) + IXMLDOMSchemaCollection_Release(cache); + + winetest_pop_context(); + } +} + +START_TEST(schema) +{ + IUnknown *obj; + HRESULT hr; + + hr = CoInitialize(NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = CoCreateInstance(&CLSID_DOMDocument40, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&obj); + if (FAILED(hr)) + { + win_skip("DOMDocument40 is not supported.\n"); + CoUninitialize(); + return; + } + IUnknown_Release(obj); + + test_regex(); + + CoUninitialize(); +} diff --git a/dlls/msxml6/tests/Makefile.in b/dlls/msxml6/tests/Makefile.in index 6f70a0494ec..a544aeb8aef 100644 --- a/dlls/msxml6/tests/Makefile.in +++ b/dlls/msxml6/tests/Makefile.in @@ -3,4 +3,5 @@ IMPORTS = oleaut32 ole32
SOURCES = \ domdoc.c \ - saxreader.c + saxreader.c \ + schema.c diff --git a/dlls/msxml6/tests/schema.c b/dlls/msxml6/tests/schema.c new file mode 100644 index 00000000000..af05c3f464e --- /dev/null +++ b/dlls/msxml6/tests/schema.c @@ -0,0 +1,215 @@ +/* + * 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 <stdio.h> +#include <assert.h> +#define COBJMACROS + +#include "ole2.h" +#include "msxml6.h" + +#include "wine/test.h" + +static IXMLDOMDocument2 *create_document(void) +{ + IXMLDOMDocument2 *obj = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&obj); + ok(hr == S_OK, "Failed to create a document object, hr %#lx.\n", hr); + + return obj; +} + +static IXMLDOMSchemaCollection *create_cache(void) +{ + IXMLDOMSchemaCollection *obj = NULL; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLSchemaCache60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (void **)&obj); + ok(hr == S_OK, "Failed to create a document object, hr %#lx.\n", hr); + + return obj; +} + +static HRESULT validate_regex_document(IXMLDOMDocument2 *doc, IXMLDOMDocument2 *schema, IXMLDOMSchemaCollection* cache, + const WCHAR *regex, const WCHAR *input) +{ + static const WCHAR regex_doc[] = +L"" +"<?xml version='1.0'?>" +"<root xmlns='urn:test'>%s</root>"; + + static const WCHAR regex_schema[] = +L"<?xml version='1.0'?>" +"<schema xmlns='http://www.w3.org/2001/XMLSchema'" +" targetNamespace='urn:test'>" +" <element name='root'>" +" <simpleType>" +" <restriction base='string'>" +" <pattern value='%s'/>" +" </restriction>" +" </simpleType>" +" </element>" +"</schema>"; + + WCHAR buffer[1024]; + IXMLDOMParseError* err; + BSTR namespace, bstr; + VARIANT_BOOL b; + HRESULT hr; + VARIANT v; + + VariantInit(&v); + + swprintf(buffer, ARRAY_SIZE(buffer), regex_doc, input); + bstr = SysAllocString(buffer); + hr = IXMLDOMDocument2_loadXML(doc, bstr, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + SysFreeString(bstr); + + swprintf(buffer, ARRAY_SIZE(buffer), regex_schema, regex); + bstr = SysAllocString(buffer); + hr = IXMLDOMDocument2_loadXML(schema, bstr, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + SysFreeString(bstr); + + /* add the schema to the cache */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + hr = IXMLDOMDocument2_QueryInterface(schema, &IID_IDispatch, (void**)&V_DISPATCH(&v)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + namespace = SysAllocString(L"urn:test"); + hr = IXMLDOMSchemaCollection_add(cache, namespace, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + SysFreeString(namespace); + VariantClear(&v); +/* + if (FAILED(hr)) + return hr; +*/ + /* associate the cache to the doc */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatch, (void**)&V_DISPATCH(&v)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(V_DISPATCH(&v) != NULL, "failed to get IDispatch interface\n"); + hr = IXMLDOMDocument2_putref_schemas(doc, v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + VariantClear(&v); + + /* validate the doc + * only declared elements in the declared order + * this is fine */ + err = NULL; + bstr = NULL; + hr = IXMLDOMDocument2_validate(doc, &err); + ok(err != NULL, "domdoc_validate() should always set err\n"); + if (IXMLDOMParseError_get_reason(err, &bstr) != S_FALSE) + trace("got error: %s\n", wine_dbgstr_w(bstr)); + SysFreeString(bstr); + IXMLDOMParseError_Release(err); + + return hr; +} + +static void test_regex(void) +{ + static const struct regex_test + { + const WCHAR *regex; + const WCHAR *input; + } + tests[] = + { + { L"\!", L"!" }, + { L"\"", L""" }, + { L"\#", L"#" }, + { L"\$", L"$" }, + { L"\%", L"%" }, + { L"\,", L"," }, + { L"\/", L"/" }, + { L"\:", L":" }, + { L"\;", L";" }, + { L"\=", L"=" }, + { L"\>", L">" }, + { L"\@", L"@" }, + { L"\`", L"`" }, + { L"\~", L"~" }, + { L"\uCAFE", L"\xCAFE" }, + /* non-BMP character in surrogate pairs: */ + { L"\uD83D\uDE00", L"\xD83D\xDE00" }, + /* "x{,2}" is non-standard and only works on libxml2 <= v2.9.10 */ + { L"x{0,2}", L"x" } + }; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(tests); ++i) + { + const struct regex_test *test = &tests[i]; + IXMLDOMDocument2 *doc, *schema; + IXMLDOMSchemaCollection *cache; + HRESULT hr; + + winetest_push_context("Test %s", wine_dbgstr_w(test->regex)); + + doc = create_document(); + schema = create_document(); + cache = create_cache(); + + hr = validate_regex_document(doc, schema, cache, tests->regex, tests->input); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + if (doc) + IXMLDOMDocument2_Release(doc); + if (schema) + IXMLDOMDocument2_Release(schema); + if (cache) + IXMLDOMSchemaCollection_Release(cache); + + winetest_pop_context(); + } +} + +START_TEST(schema) +{ + IUnknown *obj; + HRESULT hr; + + hr = CoInitialize(NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument2, (void **)&obj); + if (FAILED(hr)) + { + win_skip("DOMDocument60 is not supported.\n"); + CoUninitialize(); + return; + } + IUnknown_Release(obj); + + test_regex(); + + CoUninitialize(); +}
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/tests/schema.c | 306 +------------------------------------ dlls/msxml4/tests/schema.c | 283 +++++++++++++++++++++++++++++++++- dlls/msxml6/tests/schema.c | 240 ++++++++++++++++++++++++++++- 3 files changed, 517 insertions(+), 312 deletions(-)
diff --git a/dlls/msxml3/tests/schema.c b/dlls/msxml3/tests/schema.c index cd86e047667..50e5a743b82 100644 --- a/dlls/msxml3/tests/schema.c +++ b/dlls/msxml3/tests/schema.c @@ -34,21 +34,6 @@
#include "wine/test.h"
-#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) -static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) -{ - IUnknown *iface = iface_ptr; - HRESULT hr, expected_hr; - IUnknown *unk; - - expected_hr = supported ? S_OK : E_NOINTERFACE; - - hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); - if (SUCCEEDED(hr)) - IUnknown_Release(unk); -} - static const WCHAR xdr_schema1_uri[] = L"x-schema:test1.xdr"; static const WCHAR xdr_schema1_xml[] = L"<?xml version='1.0'?>" @@ -100,46 +85,6 @@ L"<?xml version='1.0'?>" "</Schema>";
static const WCHAR xsd_schema1_uri[] = L"x-schema:test1.xsd"; -static const WCHAR xsd_schema1_xml[] = -L"<?xml version='1.0'?>" -"<schema xmlns='http://www.w3.org/2001/XMLSchema'" -" targetNamespace='x-schema:test1.xsd'>" -" <element name='root'>" -" <complexType>" -" <sequence maxOccurs='unbounded'>" -" <any/>" -" </sequence>" -" </complexType>" -" </element>" -"</schema>"; - -static const WCHAR xsd_schema2_uri[] = L"x-schema:test2.xsd"; -static const WCHAR xsd_schema2_xml[] = -L"<?xml version='1.0'?>" -"<schema xmlns='http://www.w3.org/2001/XMLSchema'" -" targetNamespace='x-schema:test2.xsd'>" -" <element name='root'>" -" <complexType>" -" <sequence maxOccurs='unbounded'>" -" <any/>" -" </sequence>" -" </complexType>" -" </element>" -"</schema>"; - -static const WCHAR xsd_schema3_uri[] = L"x-schema:test3.xsd"; -static const WCHAR xsd_schema3_xml[] = -L"<?xml version='1.0'?>" -"<schema xmlns='http://www.w3.org/2001/XMLSchema'" -" targetNamespace='x-schema:test3.xsd'>" -" <element name='root'>" -" <complexType>" -" <sequence maxOccurs='unbounded'>" -" <any/>" -" </sequence>" -" </complexType>" -" </element>" -"</schema>";
static const WCHAR szDatatypeXDR[] = L"<Schema xmlns='urn:schemas-microsoft-com:xml-data'\n" @@ -986,9 +931,9 @@ static void test_length(void)
static void test_collection_content(void) { - IXMLDOMDocument2 *schema1, *schema2, *schema3, *schema4, *schema5; + IXMLDOMDocument2 *schema1, *schema2, *schema3; BSTR content[5] = {NULL, NULL, NULL, NULL, NULL}; - IXMLDOMSchemaCollection *cache1, *cache2; + IXMLDOMSchemaCollection *cache1; VARIANT_BOOL b; LONG length; HRESULT hr; @@ -1000,7 +945,6 @@ static void test_collection_content(void) 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) { @@ -1041,53 +985,6 @@ static void test_collection_content(void) 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); - hr = IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - hr = IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - hr = IXMLDOMDocument2_loadXML(schema3, _bstr_(xsd_schema1_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - hr = IXMLDOMDocument2_loadXML(schema4, _bstr_(xsd_schema2_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - hr = IXMLDOMDocument2_loadXML(schema5, _bstr_(xsd_schema3_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "failed to load XML\n"); - - /* combining XDR and XSD schemas in the same cache is fine */ - hr = IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema1_uri), _variantdoc_(schema1)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IXMLDOMSchemaCollection_add(cache2, _bstr_(xdr_schema2_uri), _variantdoc_(schema2)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema1_uri), _variantdoc_(schema3)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema2_uri), _variantdoc_(schema4)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IXMLDOMSchemaCollection_add(cache2, _bstr_(xsd_schema3_uri), _variantdoc_(schema5)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - length = -1; - hr = IXMLDOMSchemaCollection_get_length(cache2, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == 5, "Unexpected length %ld.\n", length); - - IXMLDOMDocument2_Release(schema1); - IXMLDOMDocument2_Release(schema2); - IXMLDOMDocument2_Release(schema3); - IXMLDOMDocument2_Release(schema4); - IXMLDOMDocument2_Release(schema5); - } - bstr = (void*)0xdeadbeef; /* error if index is out of range */ hr = IXMLDOMSchemaCollection_get_namespaceURI(cache1, 3, &bstr); @@ -1131,30 +1028,7 @@ static void test_collection_content(void) content[i] = NULL; }
- if (cache2) - { - for (i = 0; i < 5; ++i) - { - bstr = NULL; - hr = IXMLDOMSchemaCollection_get_namespaceURI(cache2, i, &bstr); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(bstr != NULL && *bstr, "expected non-empty string\n"); - - for (j = 0; j < i; ++j) - ok(wcscmp(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(); }
@@ -1569,26 +1443,6 @@ static void test_XDR_datatypes(void) free_bstrs(); }
-static void test_validate_on_load(void) -{ - IXMLDOMSchemaCollection2 *cache; - VARIANT_BOOL b; - HRESULT hr; - - cache = create_cache_version(40, &IID_IXMLDOMSchemaCollection2); - if (!cache) return; - - hr = IXMLDOMSchemaCollection2_get_validateOnLoad(cache, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - - b = VARIANT_FALSE; - hr = IXMLDOMSchemaCollection2_get_validateOnLoad(cache, &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(b == VARIANT_TRUE, "got %d\n", b); - - IXMLDOMSchemaCollection2_Release(cache); -} - static void test_obj_dispex(IUnknown *obj) { DISPID dispid = DISPID_SAX_XMLREADER_GETFEATURE; @@ -1677,158 +1531,6 @@ static void test_dispex(void)
IDispatchEx_Release(dispex); IXMLDOMSchemaCollection_Release(cache); - - cache = create_cache_version(60, &IID_IXMLDOMSchemaCollection); - if (cache) - { - test_obj_dispex((IUnknown*)cache); - IXMLDOMSchemaCollection_Release(cache); - } -} - -static void test_get(void) -{ - IXMLDOMSchemaCollection2 *cache; - IXMLDOMNode *node; - HRESULT hr; - - cache = create_cache_version(60, &IID_IXMLDOMSchemaCollection2); - if (!cache) return; - - hr = IXMLDOMSchemaCollection2_get(cache, NULL, NULL); - ok(hr == E_NOTIMPL || hr == E_POINTER /* win8 */, "Unexpected hr %#lx.\n", hr); - - hr = IXMLDOMSchemaCollection2_get(cache, _bstr_(L"uri"), &node); - ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); - - IXMLDOMSchemaCollection2_Release(cache); - - cache = create_cache_version(40, &IID_IXMLDOMSchemaCollection2); - if (!cache) return; - - hr = IXMLDOMSchemaCollection2_get(cache, NULL, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - - hr = IXMLDOMSchemaCollection2_get(cache, _bstr_(L"uri"), &node); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - IXMLDOMSchemaCollection2_Release(cache); - free_bstrs(); -} - -static void test_remove(void) -{ - IXMLDOMSchemaCollection2 *cache; - IXMLDOMDocument *doc; - VARIANT_BOOL b; - HRESULT hr; - VARIANT v; - LONG len; - - cache = create_cache_version(60, &IID_IXMLDOMSchemaCollection2); - if (!cache) return; - - doc = create_document_version(60, &IID_IXMLDOMDocument); - ok(doc != NULL, "got %p\n", doc); - - hr = IXMLDOMDocument_loadXML(doc, _bstr_(xsd_schema1_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = (IDispatch*)doc; - hr = IXMLDOMSchemaCollection2_add(cache, _bstr_(xsd_schema1_uri), v); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - len = -1; - hr = IXMLDOMSchemaCollection2_get_length(cache, &len); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(len == 1, "Unexpected length %ld.\n", len); - - /* ::remove() is a stub for version 6 */ - hr = IXMLDOMSchemaCollection2_remove(cache, NULL); - ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); - - hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(L"invaliduri")); - ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); - - hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(xsd_schema1_uri)); - ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); - - len = -1; - hr = IXMLDOMSchemaCollection2_get_length(cache, &len); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(len == 1, "Unexpected length %ld.\n", len); - - IXMLDOMDocument_Release(doc); - IXMLDOMSchemaCollection2_Release(cache); - free_bstrs(); - - /* ::remove() works for version 4 */ - cache = create_cache_version(40, &IID_IXMLDOMSchemaCollection2); - if (!cache) return; - - doc = create_document_version(40, &IID_IXMLDOMDocument); - ok(doc != NULL, "got %p\n", doc); - - hr = IXMLDOMDocument_loadXML(doc, _bstr_(xsd_schema1_xml), &b); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - V_VT(&v) = VT_DISPATCH; - V_DISPATCH(&v) = (IDispatch*)doc; - hr = IXMLDOMSchemaCollection2_add(cache, _bstr_(xsd_schema1_uri), v); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - len = -1; - hr = IXMLDOMSchemaCollection2_get_length(cache, &len); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(len == 1, "Unexpected length %ld.\n", len); - - hr = IXMLDOMSchemaCollection2_remove(cache, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(L"invaliduri")); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - len = -1; - hr = IXMLDOMSchemaCollection2_get_length(cache, &len); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(len == 1, "Unexpected length %ld.\n", len); - - hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(xsd_schema1_uri)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - len = -1; - hr = IXMLDOMSchemaCollection2_get_length(cache, &len); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(len == 0, "Unexpected length %ld.\n", len); - - IXMLDOMDocument_Release(doc); - IXMLDOMSchemaCollection2_Release(cache); - - free_bstrs(); -} - -static void test_ifaces(void) -{ - IXMLDOMSchemaCollection2 *cache; - IUnknown *unk; - HRESULT hr; - - cache = create_cache_version(60, &IID_IXMLDOMSchemaCollection2); - if (!cache) return; - - /* CLSID_XMLSchemaCache60 is returned as an interface (the same as IXMLDOMSchemaCollection2). */ - hr = IXMLDOMSchemaCollection2_QueryInterface(cache, &CLSID_XMLSchemaCache60, (void**)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(unk == (IUnknown*)cache, "unk != cache\n"); - IUnknown_Release(unk); - - check_interface(cache, &IID_IXMLDOMSchemaCollection, TRUE); - check_interface(cache, &IID_IXMLDOMSchemaCollection2, TRUE); - check_interface(cache, &IID_IDispatch, TRUE); - check_interface(cache, &IID_IDispatchEx, TRUE); - - IXMLDOMSchemaCollection2_Release(cache); }
START_TEST(schema) @@ -1844,11 +1546,7 @@ START_TEST(schema) test_collection_content(); test_XDR_schemas(); test_XDR_datatypes(); - test_validate_on_load(); test_dispex(); - test_get(); - test_remove(); - test_ifaces();
CoUninitialize(); } diff --git a/dlls/msxml4/tests/schema.c b/dlls/msxml4/tests/schema.c index dec29e2d0e6..fad36cca4d9 100644 --- a/dlls/msxml4/tests/schema.c +++ b/dlls/msxml4/tests/schema.c @@ -28,6 +28,108 @@
#include "wine/test.h"
+static const WCHAR xsd_schema1_uri[] = L"x-schema:test1.xsd"; +static const WCHAR xsd_schema1_xml[] = +L"<?xml version='1.0'?>" +"<schema xmlns='http://www.w3.org/2001/XMLSchema'" +" targetNamespace='x-schema:test1.xsd'>" +" <element name='root'>" +" <complexType>" +" <sequence maxOccurs='unbounded'>" +" <any/>" +" </sequence>" +" </complexType>" +" </element>" +"</schema>"; + +static const WCHAR xsd_schema2_uri[] = L"x-schema:test2.xsd"; +static const WCHAR xsd_schema2_xml[] = +L"<?xml version='1.0'?>" +"<schema xmlns='http://www.w3.org/2001/XMLSchema'" +" targetNamespace='x-schema:test2.xsd'>" +" <element name='root'>" +" <complexType>" +" <sequence maxOccurs='unbounded'>" +" <any/>" +" </sequence>" +" </complexType>" +" </element>" +"</schema>"; + +static const WCHAR xsd_schema3_uri[] = L"x-schema:test3.xsd"; +static const WCHAR xsd_schema3_xml[] = +L"<?xml version='1.0'?>" +"<schema xmlns='http://www.w3.org/2001/XMLSchema'" +" targetNamespace='x-schema:test3.xsd'>" +" <element name='root'>" +" <complexType>" +" <sequence maxOccurs='unbounded'>" +" <any/>" +" </sequence>" +" </complexType>" +" </element>" +"</schema>"; + +static const WCHAR xdr_schema1_uri[] = L"x-schema:test1.xdr"; +static const WCHAR xdr_schema1_xml[] = +L"<?xml version='1.0'?>" +"<Schema xmlns='urn:schemas-microsoft-com:xml-data'" +" xmlns:dt='urn:schemas-microsoft-com:datatypes'" +" name='test1.xdr'>" +" <ElementType name='x' dt:type='boolean'/>" +" <ElementType name='y'>" +" <datatype dt:type='int'/>" +" </ElementType>" +" <ElementType name='z'/>" +" <ElementType name='root' content='eltOnly' model='open' order='seq'>" +" <element type='x'/>" +" <element type='y'/>" +" <element type='z'/>" +" </ElementType>" +"</Schema>"; + +static const WCHAR xdr_schema2_uri[] = L"x-schema:test2.xdr"; +static const WCHAR xdr_schema2_xml[] = +L"<?xml version='1.0'?>" +"<Schema xmlns='urn:schemas-microsoft-com:xml-data'" +" xmlns:dt='urn:schemas-microsoft-com:datatypes'" +" name='test2.xdr'>" +" <ElementType name='x' dt:type='bin.base64'/>" +" <ElementType name='y' dt:type='uuid'/>" +" <ElementType name='z'/>" +" <ElementType name='root' content='eltOnly' model='closed' order='one'>" +" <element type='x'/>" +" <element type='y'/>" +" <element type='z'/>" +" </ElementType>" +"</Schema>"; + +static BSTR alloced_bstrs[256]; +static int alloced_bstrs_count; + +static BSTR _bstr_(const WCHAR *str) +{ + assert(alloced_bstrs_count < ARRAY_SIZE(alloced_bstrs)); + alloced_bstrs[alloced_bstrs_count] = SysAllocString(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 IXMLDOMDocument2 *create_document(void) { IXMLDOMDocument2 *obj = NULL; @@ -39,12 +141,12 @@ static IXMLDOMDocument2 *create_document(void) return obj; }
-static IXMLDOMSchemaCollection *create_cache(void) +static void *create_cache(REFIID riid) { - IXMLDOMSchemaCollection *obj = NULL; + void *obj = NULL; HRESULT hr;
- hr = CoCreateInstance(&CLSID_XMLSchemaCache40, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (void **)&obj); + hr = CoCreateInstance(&CLSID_XMLSchemaCache40, NULL, CLSCTX_INPROC_SERVER, riid, &obj); ok(hr == S_OK, "Failed to create a document object, hr %#lx.\n", hr);
return obj; @@ -176,7 +278,7 @@ static void test_regex(void)
doc = create_document(); schema = create_document(); - cache = create_cache(); + cache = create_cache(&IID_IXMLDOMSchemaCollection);
hr = validate_regex_document(doc, schema, cache, tests->regex, tests->input); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -192,6 +294,175 @@ static void test_regex(void) } }
+static void test_get(void) +{ + IXMLDOMSchemaCollection2 *cache; + IXMLDOMNode *node; + HRESULT hr; + + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + hr = IXMLDOMSchemaCollection2_get(cache, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMSchemaCollection2_get(cache, _bstr_(L"uri"), &node); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + IXMLDOMSchemaCollection2_Release(cache); + free_bstrs(); +} + +static void test_remove(void) +{ + IXMLDOMSchemaCollection2 *cache; + IXMLDOMDocument2 *doc; + VARIANT_BOOL b; + HRESULT hr; + VARIANT v; + LONG len; + + /* ::remove() works for version 4 */ + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + doc = create_document(); + ok(doc != NULL, "got %p\n", doc); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(xsd_schema1_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)doc; + hr = IXMLDOMSchemaCollection2_add(cache, _bstr_(xsd_schema1_uri), v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + len = -1; + hr = IXMLDOMSchemaCollection2_get_length(cache, &len); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(len == 1, "Unexpected length %ld.\n", len); + + hr = IXMLDOMSchemaCollection2_remove(cache, NULL); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(L"invaliduri")); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + len = -1; + hr = IXMLDOMSchemaCollection2_get_length(cache, &len); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(len == 1, "Unexpected length %ld.\n", len); + + hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(xsd_schema1_uri)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + len = -1; + hr = IXMLDOMSchemaCollection2_get_length(cache, &len); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(len == 0, "Unexpected length %ld.\n", len); + + IXMLDOMDocument2_Release(doc); + IXMLDOMSchemaCollection2_Release(cache); + + free_bstrs(); +} + +static void test_validate_on_load(void) +{ + IXMLDOMSchemaCollection2 *cache; + VARIANT_BOOL b; + HRESULT hr; + + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + hr = IXMLDOMSchemaCollection2_get_validateOnLoad(cache, NULL); + ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + + b = VARIANT_FALSE; + hr = IXMLDOMSchemaCollection2_get_validateOnLoad(cache, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "got %d\n", b); + + IXMLDOMSchemaCollection2_Release(cache); +} + +static void test_collection_content(void) +{ + IXMLDOMDocument2 *schema1, *schema2, *schema3, *schema4, *schema5; + IXMLDOMSchemaCollection *cache; + BSTR content[5] = { 0 }; + VARIANT_BOOL b; + LONG length; + HRESULT hr; + BSTR bstr; + int i, j; + + schema1 = create_document(); + schema2 = create_document(); + schema3 = create_document(); + schema4 = create_document(); + schema5 = create_document(); + cache = create_cache(&IID_IXMLDOMSchemaCollection); + + hr = IXMLDOMDocument2_loadXML(schema1, _bstr_(xdr_schema1_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + hr = IXMLDOMDocument2_loadXML(schema2, _bstr_(xdr_schema2_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + hr = IXMLDOMDocument2_loadXML(schema3, _bstr_(xsd_schema1_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + hr = IXMLDOMDocument2_loadXML(schema4, _bstr_(xsd_schema2_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + hr = IXMLDOMDocument2_loadXML(schema5, _bstr_(xsd_schema3_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "failed to load XML\n"); + + /* combining XDR and XSD schemas in the same cache is fine */ + hr = IXMLDOMSchemaCollection_add(cache, _bstr_(xdr_schema1_uri), _variantdoc_(schema1)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMSchemaCollection_add(cache, _bstr_(xdr_schema2_uri), _variantdoc_(schema2)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMSchemaCollection_add(cache, _bstr_(xsd_schema1_uri), _variantdoc_(schema3)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMSchemaCollection_add(cache, _bstr_(xsd_schema2_uri), _variantdoc_(schema4)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IXMLDOMSchemaCollection_add(cache, _bstr_(xsd_schema3_uri), _variantdoc_(schema5)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + length = -1; + hr = IXMLDOMSchemaCollection_get_length(cache, &length); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(length == 5, "Unexpected length %ld.\n", length); + + for (i = 0; i < 5; ++i) + { + bstr = NULL; + hr = IXMLDOMSchemaCollection_get_namespaceURI(cache, i, &bstr); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(bstr != NULL && *bstr, "expected non-empty string\n"); + + for (j = 0; j < i; ++j) + ok(wcscmp(content[j], bstr), "got duplicate entry\n"); + content[i] = bstr; + } + + for (i = 0; i < 5; ++i) + { + SysFreeString(content[i]); + content[i] = NULL; + } + + IXMLDOMDocument2_Release(schema1); + IXMLDOMDocument2_Release(schema2); + IXMLDOMDocument2_Release(schema3); + IXMLDOMDocument2_Release(schema4); + IXMLDOMDocument2_Release(schema5); + + IXMLDOMSchemaCollection_Release(cache); + free_bstrs(); +} + START_TEST(schema) { IUnknown *obj; @@ -210,6 +481,10 @@ START_TEST(schema) IUnknown_Release(obj);
test_regex(); + test_get(); + test_remove(); + test_validate_on_load(); + test_collection_content();
CoUninitialize(); } diff --git a/dlls/msxml6/tests/schema.c b/dlls/msxml6/tests/schema.c index af05c3f464e..c8458f397c3 100644 --- a/dlls/msxml6/tests/schema.c +++ b/dlls/msxml6/tests/schema.c @@ -25,9 +25,62 @@
#include "ole2.h" #include "msxml6.h" +#include "msxml6did.h" +#include "dispex.h"
#include "wine/test.h"
+#include "initguid.h" + +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); + +static const WCHAR xsd_schema1_uri[] = L"x-schema:test1.xsd"; +static const WCHAR xsd_schema1_xml[] = +L"<?xml version='1.0'?>" +"<schema xmlns='http://www.w3.org/2001/XMLSchema'" +" targetNamespace='x-schema:test1.xsd'>" +" <element name='root'>" +" <complexType>" +" <sequence maxOccurs='unbounded'>" +" <any/>" +" </sequence>" +" </complexType>" +" </element>" +"</schema>"; + +#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) +static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) +{ + IUnknown *iface = iface_ptr; + HRESULT hr, expected_hr; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + if (SUCCEEDED(hr)) + IUnknown_Release(unk); +} + +static BSTR alloced_bstrs[256]; +static int alloced_bstrs_count; + +static BSTR _bstr_(const WCHAR *str) +{ + assert(alloced_bstrs_count < ARRAY_SIZE(alloced_bstrs)); + alloced_bstrs[alloced_bstrs_count] = SysAllocString(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 IXMLDOMDocument2 *create_document(void) { IXMLDOMDocument2 *obj = NULL; @@ -39,12 +92,12 @@ static IXMLDOMDocument2 *create_document(void) return obj; }
-static IXMLDOMSchemaCollection *create_cache(void) +static void *create_cache(REFIID riid) { - IXMLDOMSchemaCollection *obj = NULL; + void *obj = NULL; HRESULT hr;
- hr = CoCreateInstance(&CLSID_XMLSchemaCache60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMSchemaCollection, (void **)&obj); + hr = CoCreateInstance(&CLSID_XMLSchemaCache60, NULL, CLSCTX_INPROC_SERVER, riid, &obj); ok(hr == S_OK, "Failed to create a document object, hr %#lx.\n", hr);
return obj; @@ -176,7 +229,7 @@ static void test_regex(void)
doc = create_document(); schema = create_document(); - cache = create_cache(); + cache = create_cache(&IID_IXMLDOMSchemaCollection);
hr = validate_regex_document(doc, schema, cache, tests->regex, tests->input); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -192,6 +245,180 @@ static void test_regex(void) } }
+static void test_get(void) +{ + IXMLDOMSchemaCollection2 *cache; + IXMLDOMNode *node; + HRESULT hr; + + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + hr = IXMLDOMSchemaCollection2_get(cache, NULL, NULL); + ok(hr == E_NOTIMPL || hr == E_POINTER /* win8 */, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMSchemaCollection2_get(cache, _bstr_(L"uri"), &node); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + + IXMLDOMSchemaCollection2_Release(cache); + free_bstrs(); +} + +static void test_ifaces(void) +{ + IXMLDOMSchemaCollection2 *cache; + IUnknown *unk; + HRESULT hr; + + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + /* CLSID_XMLSchemaCache60 is returned as an interface (the same as IXMLDOMSchemaCollection2). */ + hr = IXMLDOMSchemaCollection2_QueryInterface(cache, &CLSID_XMLSchemaCache60, (void**)&unk); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(unk == (IUnknown *)cache, "Unexpected pointer %p.\n", unk); + IUnknown_Release(unk); + + check_interface(cache, &IID_IXMLDOMSchemaCollection, TRUE); + check_interface(cache, &IID_IXMLDOMSchemaCollection2, TRUE); + check_interface(cache, &IID_IDispatch, TRUE); + check_interface(cache, &IID_IDispatchEx, TRUE); + + IXMLDOMSchemaCollection2_Release(cache); +} + +static void test_remove(void) +{ + IXMLDOMSchemaCollection2 *cache; + IXMLDOMDocument2 *doc; + VARIANT_BOOL b; + HRESULT hr; + VARIANT v; + LONG len; + + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + doc = create_document(); + ok(doc != NULL, "got %p\n", doc); + + hr = IXMLDOMDocument2_loadXML(doc, _bstr_(xsd_schema1_xml), &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)doc; + hr = IXMLDOMSchemaCollection2_add(cache, _bstr_(xsd_schema1_uri), v); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + len = -1; + hr = IXMLDOMSchemaCollection2_get_length(cache, &len); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(len == 1, "Unexpected length %ld.\n", len); + + /* ::remove() is a stub for version 6 */ + hr = IXMLDOMSchemaCollection2_remove(cache, NULL); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(L"invaliduri")); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + + hr = IXMLDOMSchemaCollection2_remove(cache, _bstr_(xsd_schema1_uri)); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + + len = -1; + hr = IXMLDOMSchemaCollection2_get_length(cache, &len); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(len == 1, "Unexpected length %ld.\n", len); + + IXMLDOMDocument2_Release(doc); + IXMLDOMSchemaCollection2_Release(cache); + free_bstrs(); +} + +static void test_obj_dispex(IUnknown *obj) +{ + DISPID dispid = DISPID_SAX_XMLREADER_GETFEATURE; + IDispatchEx *dispex; + IUnknown *unk; + DWORD props; + UINT ticnt; + HRESULT hr; + BSTR name; + + hr = IUnknown_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (FAILED(hr)) return; + + ticnt = 0; + hr = IDispatchEx_GetTypeInfoCount(dispex, &ticnt); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(ticnt == 1, "ticnt=%u\n", ticnt); + + name = SysAllocString(L"*"); + hr = IDispatchEx_DeleteMemberByName(dispex, name, fdexNameCaseSensitive); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + SysFreeString(name); + + hr = IDispatchEx_DeleteMemberByDispID(dispex, dispid); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + + props = 0; + hr = IDispatchEx_GetMemberProperties(dispex, dispid, grfdexPropCanAll, &props); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + ok(props == 0, "expected 0 got %ld\n", props); + + hr = IDispatchEx_GetMemberName(dispex, dispid, &name); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) SysFreeString(name); + + hr = IDispatchEx_GetNextDispID(dispex, fdexEnumDefault, DISPID_XMLDOM_SCHEMACOLLECTION_ADD, &dispid); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + + unk = (IUnknown*)0xdeadbeef; + hr = IDispatchEx_GetNameSpaceParent(dispex, &unk); + ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + ok(unk == (IUnknown*)0xdeadbeef, "got %p\n", unk); + + name = SysAllocString(L"testprop"); + hr = IDispatchEx_GetDispID(dispex, name, fdexNameEnsure, &dispid); + ok(hr == DISP_E_UNKNOWNNAME, "Unexpected hr %#lx.\n", hr); + SysFreeString(name); + + IDispatchEx_Release(dispex); +} + +static void test_dispex(void) +{ + IXMLDOMSchemaCollection *cache; + IUnknown *unk; + HRESULT hr; + + cache = create_cache(&IID_IXMLDOMSchemaCollection); + + hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + test_obj_dispex(unk); + IUnknown_Release(unk); + + IXMLDOMSchemaCollection_Release(cache); +} + +static void test_validate_on_load(void) +{ + IXMLDOMSchemaCollection2 *cache; + VARIANT_BOOL b; + HRESULT hr; + + cache = create_cache(&IID_IXMLDOMSchemaCollection2); + + hr = IXMLDOMSchemaCollection2_get_validateOnLoad(cache, NULL); + ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + + b = VARIANT_FALSE; + hr = IXMLDOMSchemaCollection2_get_validateOnLoad(cache, &b); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(b == VARIANT_TRUE, "got %d\n", b); + + IXMLDOMSchemaCollection2_Release(cache); +} + START_TEST(schema) { IUnknown *obj; @@ -210,6 +437,11 @@ START_TEST(schema) IUnknown_Release(obj);
test_regex(); + test_get(); + test_ifaces(); + test_remove(); + test_dispex(); + test_validate_on_load();
CoUninitialize(); }