msxml3: Implement schema_cache_get_length().
authorAdam Martinson <amartinson@codeweavers.com>
Wed, 20 Oct 2010 21:35:34 +0000 (16:35 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 21 Oct 2010 14:14:09 +0000 (16:14 +0200)
dlls/msxml3/schema.c
dlls/msxml3/tests/schema.c

index 77a7270..9ef08a3 100644 (file)
@@ -347,7 +347,7 @@ static HRESULT WINAPI schema_cache_Invoke(IXMLDOMSchemaCollection *iface,
 
 static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection *iface, BSTR uri, VARIANT var)
 {
-    schema_cache *This = impl_from_IXMLDOMSchemaCollection( iface );
+    schema_cache *This = impl_from_IXMLDOMSchemaCollection(iface);
     xmlChar* name = xmlChar_from_wchar(uri);
     TRACE("(%p)->(%s, var(vt %x))\n", This, debugstr_w(uri), V_VT(&var));
 
@@ -454,8 +454,13 @@ static HRESULT WINAPI schema_cache_remove(IXMLDOMSchemaCollection *iface, BSTR u
 
 static HRESULT WINAPI schema_cache_get_length(IXMLDOMSchemaCollection *iface, LONG *length)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    schema_cache *This = impl_from_IXMLDOMSchemaCollection(iface);
+    TRACE("(%p)->(%p)\n", This, length);
+
+    if (!length)
+        return E_POINTER;
+    *length = xmlHashSize(This->cache);
+    return S_OK;
 }
 
 static HRESULT WINAPI schema_cache_get_namespaceURI(IXMLDOMSchemaCollection *iface, LONG index, BSTR *len)
@@ -497,8 +502,8 @@ static const struct IXMLDOMSchemaCollectionVtbl schema_vtbl =
 
 HRESULT SchemaCache_create(IUnknown *pUnkOuter, LPVOID *ppObj)
 {
-    schema_cache *schema = heap_alloc( sizeof (*schema) );
-    if( !schema )
+    schema_cache *schema = heap_alloc(sizeof(*schema));
+    if (!schema)
         return E_OUTOFMEMORY;
 
     schema->lpVtbl = &schema_vtbl;
index 0731d59..f889af4 100644 (file)
@@ -423,6 +423,94 @@ static void test_collection_refs(void)
     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);
+
+    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_add(cache, _bstr_(xdr_schema2_uri), v));
+
+    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_schema3_uri), v));
+
+    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();
+}
+
 START_TEST(schema)
 {
     HRESULT r;
@@ -432,6 +520,7 @@ START_TEST(schema)
 
     test_schema_refs();
     test_collection_refs();
+    test_length();
 
     CoUninitialize();
 }