Partial merge of condrv_restructure branch r65657.
[reactos.git] / rostests / winetests / wshom / wshom.c
1 /*
2 * Copyright 2011 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #define WIN32_NO_STATUS
20 #define _INC_WINDOWS
21 #define COBJMACROS
22 #define CONST_VTABLE
23
24 #include <windef.h>
25 #include <winbase.h>
26 #include <initguid.h>
27 #include <dispex.h>
28 #include <wshom.h>
29 #include <wine/test.h>
30
31 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
32
33 #define EXPECT_HR(hr,hr_exp) \
34 ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
35
36 static void test_wshshell(void)
37 {
38 static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0};
39 static const WCHAR lnk1W[] = {'f','i','l','e','.','l','n','k',0};
40 static const WCHAR pathW[] = {'%','P','A','T','H','%',0};
41 static const WCHAR sysW[] = {'S','Y','S','T','E','M',0};
42 static const WCHAR path2W[] = {'P','A','T','H',0};
43 IWshEnvironment *env;
44 IWshShell3 *sh3;
45 IDispatchEx *dispex;
46 IWshCollection *coll;
47 IDispatch *disp, *shortcut;
48 IUnknown *shell;
49 IFolderCollection *folders;
50 IWshShortcut *shcut;
51 ITypeInfo *ti;
52 HRESULT hr;
53 TYPEATTR *tattr;
54 DISPPARAMS dp;
55 EXCEPINFO ei;
56 VARIANT arg, res;
57 BSTR str, ret;
58 UINT err;
59
60 hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
61 &IID_IDispatch, (void**)&disp);
62 if(FAILED(hr)) {
63 win_skip("Could not create WshShell object: %08x\n", hr);
64 return;
65 }
66
67 hr = IDispatch_QueryInterface(disp, &IID_IWshShell3, (void**)&shell);
68 EXPECT_HR(hr, S_OK);
69 IDispatch_Release(disp);
70
71 hr = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
72 EXPECT_HR(hr, E_NOINTERFACE);
73
74 hr = IUnknown_QueryInterface(shell, &IID_IWshShell3, (void**)&sh3);
75 EXPECT_HR(hr, S_OK);
76
77 hr = IWshShell3_get_SpecialFolders(sh3, &coll);
78 EXPECT_HR(hr, S_OK);
79
80 hr = IWshCollection_QueryInterface(coll, &IID_IFolderCollection, (void**)&folders);
81 EXPECT_HR(hr, E_NOINTERFACE);
82
83 hr = IWshCollection_QueryInterface(coll, &IID_IDispatch, (void**)&disp);
84 EXPECT_HR(hr, S_OK);
85
86 hr = IDispatch_GetTypeInfo(disp, 0, 0, &ti);
87 EXPECT_HR(hr, S_OK);
88
89 hr = ITypeInfo_GetTypeAttr(ti, &tattr);
90 EXPECT_HR(hr, S_OK);
91 ok(IsEqualIID(&tattr->guid, &IID_IWshCollection), "got wrong type guid\n");
92 ITypeInfo_ReleaseTypeAttr(ti, tattr);
93
94 /* try to call Item() with normal IDispatch procedure */
95 str = SysAllocString(desktopW);
96 V_VT(&arg) = VT_BSTR;
97 V_BSTR(&arg) = str;
98 dp.rgvarg = &arg;
99 dp.rgdispidNamedArgs = NULL;
100 dp.cArgs = 1;
101 dp.cNamedArgs = 0;
102 hr = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 1033, DISPATCH_PROPERTYGET, &dp, &res, &ei, &err);
103 EXPECT_HR(hr, DISP_E_MEMBERNOTFOUND);
104
105 /* try Item() directly, it returns directory path apparently */
106 V_VT(&res) = VT_EMPTY;
107 hr = IWshCollection_Item(coll, &arg, &res);
108 EXPECT_HR(hr, S_OK);
109 ok(V_VT(&res) == VT_BSTR, "got res type %d\n", V_VT(&res));
110 SysFreeString(str);
111 VariantClear(&res);
112
113 /* CreateShortcut() */
114 str = SysAllocString(lnk1W);
115 hr = IWshShell3_CreateShortcut(sh3, str, &shortcut);
116 EXPECT_HR(hr, S_OK);
117 SysFreeString(str);
118 hr = IDispatch_QueryInterface(shortcut, &IID_IWshShortcut, (void**)&shcut);
119 EXPECT_HR(hr, S_OK);
120
121 hr = IWshShortcut_get_Arguments(shcut, NULL);
122 ok(hr == E_POINTER, "got 0x%08x\n", hr);
123
124 hr = IWshShortcut_get_IconLocation(shcut, NULL);
125 ok(hr == E_POINTER, "got 0x%08x\n", hr);
126
127 IWshShortcut_Release(shcut);
128 IDispatch_Release(shortcut);
129
130 /* ExpandEnvironmentStrings */
131 hr = IWshShell3_ExpandEnvironmentStrings(sh3, NULL, NULL);
132 ok(hr == E_POINTER, "got 0x%08x\n", hr);
133
134 str = SysAllocString(pathW);
135 hr = IWshShell3_ExpandEnvironmentStrings(sh3, str, NULL);
136 ok(hr == E_POINTER, "got 0x%08x\n", hr);
137 SysFreeString(str);
138
139 V_VT(&arg) = VT_BSTR;
140 V_BSTR(&arg) = SysAllocString(sysW);
141 hr = IWshShell3_get_Environment(sh3, &arg, &env);
142 ok(hr == S_OK, "got 0x%08x\n", hr);
143 VariantClear(&arg);
144
145 hr = IWshEnvironment_get_Item(env, NULL, NULL);
146 ok(hr == E_POINTER, "got 0x%08x\n", hr);
147
148 ret = (BSTR)0x1;
149 hr = IWshEnvironment_get_Item(env, NULL, &ret);
150 ok(hr == S_OK, "got 0x%08x\n", hr);
151 ok(ret && !*ret, "got %p\n", ret);
152 SysFreeString(ret);
153
154 /* invalid var name */
155 str = SysAllocString(lnk1W);
156 hr = IWshEnvironment_get_Item(env, str, NULL);
157 ok(hr == E_POINTER, "got 0x%08x\n", hr);
158
159 ret = NULL;
160 hr = IWshEnvironment_get_Item(env, str, &ret);
161 ok(hr == S_OK, "got 0x%08x\n", hr);
162 ok(ret && *ret == 0, "got %s\n", wine_dbgstr_w(ret));
163 SysFreeString(ret);
164 SysFreeString(str);
165
166 /* valid name */
167 str = SysAllocString(path2W);
168 hr = IWshEnvironment_get_Item(env, str, &ret);
169 ok(hr == S_OK, "got 0x%08x\n", hr);
170 ok(ret && *ret != 0, "got %s\n", wine_dbgstr_w(ret));
171 SysFreeString(ret);
172 SysFreeString(str);
173
174 IWshEnvironment_Release(env);
175
176 IWshCollection_Release(coll);
177 IDispatch_Release(disp);
178 IWshShell3_Release(sh3);
179 IUnknown_Release(shell);
180 }
181
182 START_TEST(wshom)
183 {
184 CoInitialize(NULL);
185
186 test_wshshell();
187
188 CoUninitialize();
189 }