[shell32_apitest]
[reactos.git] / rostests / apitests / com / com_apitest.c
index 3609c4b..10467de 100644 (file)
@@ -2,7 +2,7 @@
  * PROJECT:         ReactOS api tests
  * LICENSE:         GPLv2+ - See COPYING in the top level directory
  * PURPOSE:         COM interface test
- * PROGRAMMER:      Thomas Faber <thfabba@gmx.de>
+ * PROGRAMMER:      Thomas Faber <thomas.faber@reactos.org>
  */
 
 #include "com_apitest.h"
@@ -31,33 +31,52 @@ static KNOWN_INTERFACE KnownInterfaces[] =
 {
     ID_NAME(IID_IACList),
     ID_NAME(IID_IACList2),
+    ID_NAME(IID_IADesktopP2),
     ID_NAME(IID_IAccessible),
+    ID_NAME(IID_IAccessControl),
+    ID_NAME(IID_IAccessor),
+    ID_NAME(IID_IActiveDesktop),
+    ID_NAME(IID_IActiveDesktopP),
+    ID_NAME(IID_IAddressBarParser),
     ID_NAME(IID_IAddressBand),
     ID_NAME(IID_IAddressEditBox),
+    ID_NAME(IID_IAutoComplete),
+    ID_NAME(IID_IAutoComplete2),
     ID_NAME(IID_IBandNavigate),
     ID_NAME(IID_IBandProxy),
     ID_NAME(IID_IBandSite),
     ID_NAME(IID_IBandSiteHelper),
     ID_NAME(IID_IBanneredBar),
     ID_NAME(IID_IBindCtx),
+    ID_NAME(IID_IBrowserFrameOptions),
     ID_NAME(IID_IBrowserService),
     ID_NAME(IID_IBrowserService2),
+    ID_NAME(IID_IBrowserService3),
     ID_NAME(IID_IClassFactory),
     ID_NAME(IID_IClassFactory2),
     ID_NAME(IID_IClassFactory3),
     ID_NAME(IID_IClientSecurity),
     ID_NAME(IID_IComThreadingInfo),
+    ID_NAME(IID_IContext),
     ID_NAME(IID_IContextMenu),
     ID_NAME(IID_IContextMenu2),
     ID_NAME(IID_IContextMenu3),
     ID_NAME(IID_IContextMenuCB),
     ID_NAME(IID_IContextMenuSite),
     ID_NAME(IID_IContinue),
+    ID_NAME(IID_IDVGetEnum),
     ID_NAME(IID_IDataObject),
+    ID_NAME(IID_IDefViewID),
     ID_NAME(IID_IDefViewFrame),
+    ID_NAME(IID_IDefViewFrame3),
+    ID_NAME(IID_IDefViewFrameGroup),
+    ID_NAME(IID_IDefViewSafety),
+    ID_NAME(IID_IDefViewScript),
     ID_NAME(IID_IDeskBand),
+    ID_NAME(IID_IDeskBandEx),
     ID_NAME(IID_IDeskBar),
     ID_NAME(IID_IDeskBarClient),
+    ID_NAME(IID_IDeskMovr),
     ID_NAME(IID_IDispatch),
     ID_NAME(IID_IDockingWindow),
     ID_NAME(IID_IDockingWindowFrame),
@@ -73,6 +92,7 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IEnumShellItems),
     ID_NAME(IID_IEnumString),
     ID_NAME(IID_IEnumUnknown),
+    ID_NAME(IID_IEnumVARIANT),
     ID_NAME(IID_IErrorLog),
     ID_NAME(IID_IExplorerToolbar),
     ID_NAME(IID_IExtractIconA),
@@ -83,6 +103,8 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IFileDialog2),
     ID_NAME(IID_IFileSearchBand),
     ID_NAME(IID_IFolderBandPriv),
+    ID_NAME(IID_IFolderFilter),
+    ID_NAME(IID_IFolderFilterSite),
     ID_NAME(IID_IFolderView),
     ID_NAME(IID_IFolderView2),
     ID_NAME(IID_IFolderViewOC),
@@ -96,6 +118,7 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IMenuBand),
     ID_NAME(IID_IMenuPopup),
     ID_NAME(IID_IMoniker),
+    ID_NAME(IID_IMultiMonitorDockingSite),
     ID_NAME(IID_IMultiQI),
     ID_NAME(IID_INamespaceProxy),
     ID_NAME(IID_INameSpaceTreeControl),
@@ -137,6 +160,7 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IRunnableObject),
     ID_NAME(IID_IServerSecurity),
     ID_NAME(IID_IServiceProvider),
+    ID_NAME(IID_ISFHelper),
     ID_NAME(IID_IShellBrowser),
     ID_NAME(IID_IShellBrowserService),
     ID_NAME(IID_IShellChangeNotify),
@@ -146,6 +170,8 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IShellDispatch3),
     ID_NAME(IID_IShellDispatch4),
     ID_NAME(IID_IShellDispatch5),
+    ID_NAME(IID_IShellExtInit),
+    ID_NAME(IID_IShellPropSheetExt),
     ID_NAME(IID_IShellIconOverlayIdentifier),
     ID_NAME(IID_IShellFolder),
     ID_NAME(IID_IShellFolder2),
@@ -167,11 +193,13 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IShellMenu2),
     ID_NAME(IID_IShellMenuAcc),
     ID_NAME(IID_IShellMenuCallback),
+    ID_NAME(IID_IShellNameSpace),
     ID_NAME(IID_IShellService),
     ID_NAME(IID_IShellView),
     ID_NAME(IID_IShellView2),
     ID_NAME(IID_IShellView3),
     ID_NAME(IID_IShellWindows),
+    ID_NAME(IID_IStorage),
     ID_NAME(IID_IStream),
     ID_NAME(IID_ISurrogate),
     ID_NAME(IID_ISynchronize),
@@ -186,11 +214,13 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_IUnknown),
     ID_NAME(IID_IViewObject),
     ID_NAME(IID_IViewObject2),
+    ID_NAME(IID_IViewObjectEx),
     ID_NAME(IID_IWinEventHandler),
 
     ID_NAME(IID_DFConstraint),
     ID_NAME(DIID_DShellFolderViewEvents),
 
+    ID_NAME(IID_CDefView),
     ID_NAME(IID_Folder),
     ID_NAME(IID_Folder2),
     ID_NAME(IID_Folder3),
@@ -201,6 +231,8 @@ static KNOWN_INTERFACE KnownInterfaces[] =
     ID_NAME(IID_FolderItems3),
     ID_NAME(IID_FolderItemVerb),
     ID_NAME(IID_FolderItemVerbs),
+
+    ID_NAME(CLSID_ShellDesktop)
 };
 static const INT KnownInterfaceCount = RTL_NUMBER_OF(KnownInterfaces);
 
@@ -346,8 +378,9 @@ TestModuleRegistry(
             NTSTATUS status;
             UNICODE_STRING clsid;
             DWORD type;
-            WCHAR dllName[100];
-            DWORD dllNameSize;
+            WCHAR data[100];
+            DWORD dataSize;
+            PCWSTR expectedThreadingModel;
 
             class = &ExpectedInterfaces[iClass];
             status = RtlStringFromGUID(class->clsid, &clsid);
@@ -367,31 +400,34 @@ TestModuleRegistry(
             if (myskip(result == NO_ERROR, "No key\n"))
                 continue;
 
-            dllNameSize = sizeof(dllName);
-            result = RegQueryValueEx(hKeyServer, NULL, NULL, &type, (PBYTE)dllName, &dllNameSize);
+            dataSize = sizeof(data);
+            result = RegQueryValueEx(hKeyServer, NULL, NULL, &type, (PBYTE)data, &dataSize);
             ok(result == NO_ERROR, "Failed to query value for %s, error %lu\n", class->name, result);
             if (!myskip(result == NO_ERROR, "No module name\n"))
             {
                 ok(type == REG_SZ || type == REG_EXPAND_SZ, "type %lu for %s\n", type, class->name);
-                ok(dllNameSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dllNameSize, class->name);
-                ok(dllNameSize <= sizeof(dllName), "size %lu for %s\n", dllNameSize, class->name);
-                ok(dllName[dllNameSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", class->name);
+                ok(dataSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dataSize, class->name);
+                ok(dataSize <= sizeof(data), "size %lu for %s\n", dataSize, class->name);
+                ok(data[dataSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", class->name);
                 // TODO: Use SearchPath (or assume everything's in system32) and do a proper full path compare
-                PathStripPathW(dllName);
-                PathRemoveExtensionW(dllName);
-                ok(!wcsicmp(dllName, ModuleName), "Server is %ls, expected %ls for %s\n", dllName, ModuleName, class->name);
+                PathStripPathW(data);
+                PathRemoveExtensionW(data);
+                ok(!wcsicmp(data, ModuleName), "Server is %ls, expected %ls for %s\n", data, ModuleName, class->name);
             }
 
-            dllNameSize = sizeof(dllName);
-            result = RegQueryValueEx(hKeyServer, L"ThreadingModel", NULL, &type, (PBYTE)dllName, &dllNameSize);
+            dataSize = sizeof(data);
+            result = RegQueryValueEx(hKeyServer, L"ThreadingModel", NULL, &type, (PBYTE)data, &dataSize);
             ok(result == NO_ERROR, "Failed to query value for %s, error %lu\n", class->name, result);
             if (!myskip(result == NO_ERROR, "No ThreadingModel\n"))
             {
                 ok(type == REG_SZ || type == REG_EXPAND_SZ, "type %lu for %s\n", type, class->name);
-                ok(dllNameSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dllNameSize, class->name);
-                ok(dllNameSize <= sizeof(dllName), "size %lu for %s\n", dllNameSize, class->name);
-                ok(dllName[dllNameSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", class->name);
-                ok(!wcsicmp(dllName, L"Apartment"), "Server is %ls, expected %ls for %s\n", dllName, L"Apartment", class->name);
+                ok(dataSize % sizeof(WCHAR) == 0, "size %lu for %s\n", dataSize, class->name);
+                ok(dataSize <= sizeof(data), "size %lu for %s\n", dataSize, class->name);
+                ok(data[dataSize / sizeof(WCHAR) - 1] == UNICODE_NULL, "Not null terminated for %s\n", class->name);
+                expectedThreadingModel = class->ThreadingModel;
+                if (!expectedThreadingModel)
+                    expectedThreadingModel = L"Apartment";
+                ok(!wcsicmp(data, expectedThreadingModel), "Server is %ls, expected %ls for %s\n", data, expectedThreadingModel, class->name);
             }
 
             RegCloseKey(hKeyServer);
@@ -428,7 +464,7 @@ TestManualInstantiation(
             IClassFactory *pCF = pv;
             hr = IClassFactory_CreateInstance(pCF, NULL, &IID_IUnknown, &pv);
             ok(hr == S_OK, "IClassFactory::CreateInstance failed for %s, hr = 0x%lx\n", class->name, hr);
-            if (SUCCEEDED(hr))
+            if (!myskip(SUCCEEDED(hr), "No instance\n"))
             {
                 IUnknown *pUnk = pv;
                 IUnknown_Release(pUnk);