wined3d: Remove COM from the shader implementation.
[wine] / dlls / comdlg32 / tests / itemdlg.c
1 /*
2  * Unit tests for the Common Item Dialog
3  *
4  * Copyright 2010,2011 David Hedberg
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  */
21
22 #define COBJMACROS
23 #define CONST_VTABLE
24
25 #include "shlobj.h"
26 #include "wine/test.h"
27
28 static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**);
29 static HRESULT (WINAPI *pSHGetIDListFromObject)(IUnknown*, PIDLIST_ABSOLUTE*);
30
31 static void init_function_pointers(void)
32 {
33     HMODULE hmod = GetModuleHandleA("shell32.dll");
34
35 #define MAKEFUNC(f) (p##f = (void*)GetProcAddress(hmod, #f))
36     MAKEFUNC(SHCreateShellItem);
37     MAKEFUNC(SHGetIDListFromObject);
38 #undef MAKEFUNC
39 }
40
41 /**************************************************************************
42  * IFileDialogEvents implementation
43  */
44 typedef struct {
45     IFileDialogEvents IFileDialogEvents_iface;
46     LONG ref;
47 } IFileDialogEventsImpl;
48
49 static inline IFileDialogEventsImpl *impl_from_IFileDialogEvents(IFileDialogEvents *iface)
50 {
51     return CONTAINING_RECORD(iface, IFileDialogEventsImpl, IFileDialogEvents_iface);
52 }
53
54 static HRESULT WINAPI IFileDialogEvents_fnQueryInterface(IFileDialogEvents *iface, REFIID riid, void **ppv)
55 {
56     /* Not called. */
57     ok(0, "Unexpectedly called.\n");
58     return E_NOINTERFACE;
59 }
60
61 static ULONG WINAPI IFileDialogEvents_fnAddRef(IFileDialogEvents *iface)
62 {
63     IFileDialogEventsImpl *This = impl_from_IFileDialogEvents(iface);
64     return InterlockedIncrement(&This->ref);
65 }
66
67 static ULONG WINAPI IFileDialogEvents_fnRelease(IFileDialogEvents *iface)
68 {
69     IFileDialogEventsImpl *This = impl_from_IFileDialogEvents(iface);
70     LONG ref = InterlockedDecrement(&This->ref);
71
72     if(!ref)
73         HeapFree(GetProcessHeap(), 0, This);
74
75     return ref;
76 }
77
78 static HRESULT WINAPI IFileDialogEvents_fnOnFileOk(IFileDialogEvents *iface, IFileDialog *pfd)
79 {
80     ok(0, "Unexpectedly called.\n");
81     return S_OK;
82 }
83
84 static HRESULT WINAPI IFileDialogEvents_fnOnFolderChanging(IFileDialogEvents *iface,
85                                                            IFileDialog *pfd,
86                                                            IShellItem *psiFolder)
87 {
88     ok(0, "Unexpectedly called.\n");
89     return S_OK;
90 }
91
92 static HRESULT WINAPI IFileDialogEvents_fnOnFolderChange(IFileDialogEvents *iface, IFileDialog *pfd)
93 {
94     ok(0, "Unexpectedly called.\n");
95     return S_OK;
96 }
97
98 static HRESULT WINAPI IFileDialogEvents_fnOnSelectionChange(IFileDialogEvents *iface, IFileDialog *pfd)
99 {
100     ok(0, "Unexpectedly called.\n");
101     return S_OK;
102 }
103
104 static HRESULT WINAPI IFileDialogEvents_fnOnShareViolation(IFileDialogEvents *iface,
105                                                            IFileDialog *pfd,
106                                                            IShellItem *psi,
107                                                            FDE_SHAREVIOLATION_RESPONSE *pResponse)
108 {
109     ok(0, "Unexpectedly called.\n");
110     return S_OK;
111 }
112
113 static HRESULT WINAPI IFileDialogEvents_fnOnTypeChange(IFileDialogEvents *iface, IFileDialog *pfd)
114 {
115     ok(0, "Unexpectedly called.\n");
116     return S_OK;
117 }
118
119 static HRESULT WINAPI IFileDialogEvents_fnOnOverwrite(IFileDialogEvents *iface,
120                                                       IFileDialog *pfd,
121                                                       IShellItem *psi,
122                                                       FDE_OVERWRITE_RESPONSE *pResponse)
123 {
124     ok(0, "Unexpectedly called.\n");
125     return S_OK;
126 }
127
128 static const IFileDialogEventsVtbl vt_IFileDialogEvents = {
129     IFileDialogEvents_fnQueryInterface,
130     IFileDialogEvents_fnAddRef,
131     IFileDialogEvents_fnRelease,
132     IFileDialogEvents_fnOnFileOk,
133     IFileDialogEvents_fnOnFolderChanging,
134     IFileDialogEvents_fnOnFolderChange,
135     IFileDialogEvents_fnOnSelectionChange,
136     IFileDialogEvents_fnOnShareViolation,
137     IFileDialogEvents_fnOnTypeChange,
138     IFileDialogEvents_fnOnOverwrite
139 };
140
141 static IFileDialogEvents *IFileDialogEvents_Constructor(void)
142 {
143     IFileDialogEventsImpl *This;
144
145     This = HeapAlloc(GetProcessHeap(), 0, sizeof(IFileDialogEventsImpl));
146     This->IFileDialogEvents_iface.lpVtbl = &vt_IFileDialogEvents;
147     This->ref = 1;
148
149     return &This->IFileDialogEvents_iface;
150 }
151
152 static BOOL test_instantiation(void)
153 {
154     IFileDialog *pfd;
155     IFileOpenDialog *pfod;
156     IFileSaveDialog *pfsd;
157     IServiceProvider *psp;
158     IUnknown *punk;
159     HRESULT hr;
160
161     /* Instantiate FileOpenDialog */
162     hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
163                           &IID_IFileOpenDialog, (void**)&pfod);
164     if(FAILED(hr))
165     {
166         skip("Could not instantiate the FileOpenDialog.\n");
167         return FALSE;
168     }
169     ok(hr == S_OK, "got 0x%08x.\n", hr);
170
171     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialog, (void**)&pfd);
172     ok(hr == S_OK, "got 0x%08x.\n", hr);
173     if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
174
175     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfd);
176     todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
177     if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
178
179     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileSaveDialog, (void**)&pfsd);
180     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
181     if(SUCCEEDED(hr)) IFileOpenDialog_Release(pfsd);
182
183     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IServiceProvider, (void**)&psp);
184     todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
185     if(SUCCEEDED(hr))
186     {
187         IExplorerBrowser *peb;
188         IShellBrowser *psb;
189
190         hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&peb);
191         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
192         if(SUCCEEDED(hr)) IExplorerBrowser_Release(peb);
193         hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&psb);
194         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
195         if(SUCCEEDED(hr)) IShellBrowser_Release(psb);
196         hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_ICommDlgBrowser, (void**)&punk);
197         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
198         if(SUCCEEDED(hr)) IUnknown_Release(punk);
199         hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_ICommDlgBrowser, (void**)&punk);
200         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
201         if(SUCCEEDED(hr)) IUnknown_Release(punk);
202
203         IServiceProvider_Release(psp);
204     }
205
206     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialogEvents, (void**)&pfd);
207     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
208     if(SUCCEEDED(hr)) IFileDialogEvents_Release(pfd);
209
210     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IExplorerBrowser, (void**)&punk);
211     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
212     if(SUCCEEDED(hr)) IUnknown_Release(punk);
213
214     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IExplorerBrowserEvents, (void**)&punk);
215     todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
216     if(SUCCEEDED(hr)) IUnknown_Release(punk);
217
218     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IShellBrowser, (void**)&punk);
219     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
220     if(SUCCEEDED(hr)) IUnknown_Release(punk);
221
222     IFileOpenDialog_Release(pfod);
223
224     /* Instantiate FileSaveDialog */
225     hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
226                           &IID_IFileSaveDialog, (void**)&pfsd);
227     if(FAILED(hr))
228     {
229         skip("Could not instantiate the FileSaveDialog.\n");
230         return FALSE;
231     }
232     ok(hr == S_OK, "got 0x%08x.\n", hr);
233
234     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialog, (void**)&pfd);
235     ok(hr == S_OK, "got 0x%08x.\n", hr);
236     if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
237
238     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialogCustomize, (void**)&pfd);
239     todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
240     if(SUCCEEDED(hr)) IFileDialogCustomize_Release(pfd);
241
242     hr = IFileOpenDialog_QueryInterface(pfsd, &IID_IFileOpenDialog, (void**)&pfod);
243     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
244     if(SUCCEEDED(hr)) IFileOpenDialog_Release(pfod);
245
246     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialogEvents, (void**)&pfd);
247     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
248     if(SUCCEEDED(hr)) IFileDialogEvents_Release(pfd);
249
250     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IExplorerBrowser, (void**)&punk);
251     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
252     if(SUCCEEDED(hr)) IUnknown_Release(punk);
253
254     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IExplorerBrowserEvents, (void**)&punk);
255     todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
256     if(SUCCEEDED(hr)) IUnknown_Release(punk);
257
258     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IShellBrowser, (void**)&punk);
259     ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
260     if(SUCCEEDED(hr)) IUnknown_Release(punk);
261
262     IFileSaveDialog_Release(pfsd);
263     return TRUE;
264 }
265
266 static void test_basics(void)
267 {
268     IFileOpenDialog *pfod;
269     IFileSaveDialog *pfsd;
270     IFileDialog2 *pfd2;
271     FILEOPENDIALOGOPTIONS fdoptions;
272     IShellFolder *psfdesktop;
273     IShellItem *psi, *psidesktop, *psi_original;
274     IShellItemArray *psia;
275     IPropertyStore *pps;
276     LPITEMIDLIST pidl;
277     WCHAR *filename;
278     UINT filetype;
279     HRESULT hr;
280     const WCHAR txt[] = {'t','x','t', 0};
281     const WCHAR null[] = {0};
282     const WCHAR fname1[] = {'f','n','a','m','e','1', 0};
283     const WCHAR fspec1[] = {'*','.','t','x','t',0};
284     const WCHAR fname2[] = {'f','n','a','m','e','2', 0};
285     const WCHAR fspec2[] = {'*','.','e','x','e',0};
286     COMDLG_FILTERSPEC filterspec[2] = {{fname1, fspec1}, {fname2, fspec2}};
287
288     /* This should work on every platform with IFileDialog */
289     SHGetDesktopFolder(&psfdesktop);
290     hr = pSHGetIDListFromObject((IUnknown*)psfdesktop, &pidl);
291     if(SUCCEEDED(hr))
292     {
293         hr = pSHCreateShellItem(NULL, NULL, pidl, &psidesktop);
294         ILFree(pidl);
295     }
296     IShellFolder_Release(psfdesktop);
297     if(FAILED(hr))
298     {
299         skip("Failed to get ShellItem from DesktopFolder, skipping tests.\n");
300         return;
301     }
302
303
304     /* Instantiate FileOpenDialog and FileSaveDialog */
305     hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
306                           &IID_IFileOpenDialog, (void**)&pfod);
307     ok(hr == S_OK, "got 0x%08x.\n", hr);
308     hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
309                           &IID_IFileSaveDialog, (void**)&pfsd);
310     ok(hr == S_OK, "got 0x%08x.\n", hr);
311
312     /* ClearClientData */
313     todo_wine
314     {
315     hr = IFileOpenDialog_ClearClientData(pfod);
316     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
317     hr = IFileSaveDialog_ClearClientData(pfsd);
318     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
319     }
320
321     /* GetOptions */
322     hr = IFileOpenDialog_GetOptions(pfod, NULL);
323     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
324     hr = IFileSaveDialog_GetOptions(pfsd, NULL);
325     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
326
327     /* Check default options */
328     hr = IFileOpenDialog_GetOptions(pfod, &fdoptions);
329     ok(hr == S_OK, "got 0x%08x.\n", hr);
330     ok(fdoptions == (FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_NOCHANGEDIR),
331        "Unexpected default options: 0x%08x\n", fdoptions);
332     hr = IFileSaveDialog_GetOptions(pfsd, &fdoptions);
333     ok(hr == S_OK, "got 0x%08x.\n", hr);
334     ok(fdoptions == (FOS_OVERWRITEPROMPT | FOS_NOREADONLYRETURN | FOS_PATHMUSTEXIST | FOS_NOCHANGEDIR),
335        "Unexpected default options: 0x%08x\n", fdoptions);
336
337     /* GetResult */
338     hr = IFileOpenDialog_GetResult(pfod, NULL);
339     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
340     hr = IFileSaveDialog_GetResult(pfsd, NULL);
341     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
342
343     psi = (void*)0xdeadbeef;
344     hr = IFileOpenDialog_GetResult(pfod, &psi);
345     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
346     ok(psi == (void*)0xdeadbeef, "got %p.\n", psi);
347     psi = (void*)0xdeadbeef;
348     hr = IFileSaveDialog_GetResult(pfsd, &psi);
349     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
350     ok(psi == (void*)0xdeadbeef, "got %p.\n", psi);
351
352     /* GetCurrentSelection */
353     if(0) {
354         /* Crashes on Vista/W2K8. Tests below passes on Windows 7 */
355         hr = IFileOpenDialog_GetCurrentSelection(pfod, NULL);
356         ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
357         hr = IFileSaveDialog_GetCurrentSelection(pfsd, NULL);
358         ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
359         hr = IFileOpenDialog_GetCurrentSelection(pfod, &psi);
360         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
361         hr = IFileSaveDialog_GetCurrentSelection(pfsd, &psi);
362         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
363     }
364
365     /* GetFileName */
366     todo_wine
367     {
368     hr = IFileOpenDialog_GetFileName(pfod, NULL);
369     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
370     filename = (void*)0xdeadbeef;
371     hr = IFileOpenDialog_GetFileName(pfod, &filename);
372     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
373     ok(filename == NULL, "got %p\n", filename);
374     hr = IFileSaveDialog_GetFileName(pfsd, NULL);
375     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
376     filename = (void*)0xdeadbeef;
377     hr = IFileSaveDialog_GetFileName(pfsd, &filename);
378     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
379     ok(filename == NULL, "got %p\n", filename);
380     }
381
382     /* GetFileTypeIndex */
383     hr = IFileOpenDialog_GetFileTypeIndex(pfod, NULL);
384     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
385     filetype = 0x12345;
386     hr = IFileOpenDialog_GetFileTypeIndex(pfod, &filetype);
387     ok(hr == S_OK, "got 0x%08x.\n", hr);
388     ok(filetype == 0, "got %d.\n", filetype);
389     hr = IFileSaveDialog_GetFileTypeIndex(pfsd, NULL);
390     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
391     filetype = 0x12345;
392     hr = IFileSaveDialog_GetFileTypeIndex(pfsd, &filetype);
393     ok(hr == S_OK, "got 0x%08x.\n", hr);
394     ok(filetype == 0, "got %d.\n", filetype);
395
396     /* SetFileTypes / SetFileTypeIndex */
397     hr = IFileOpenDialog_SetFileTypes(pfod, 0, NULL);
398     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
399     hr = IFileOpenDialog_SetFileTypes(pfod, 0, filterspec);
400     ok(hr == S_OK, "got 0x%08x.\n", hr);
401
402     hr = IFileOpenDialog_SetFileTypeIndex(pfod, -1);
403     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
404     hr = IFileOpenDialog_SetFileTypeIndex(pfod, 0);
405     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
406     hr = IFileOpenDialog_SetFileTypeIndex(pfod, 1);
407     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
408     hr = IFileOpenDialog_SetFileTypes(pfod, 1, filterspec);
409     ok(hr == S_OK, "got 0x%08x.\n", hr);
410     hr = IFileOpenDialog_SetFileTypes(pfod, 0, filterspec);
411     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
412     hr = IFileOpenDialog_SetFileTypeIndex(pfod, 0);
413     ok(hr == S_OK, "got 0x%08x.\n", hr);
414     hr = IFileOpenDialog_SetFileTypeIndex(pfod, 100);
415     ok(hr == S_OK, "got 0x%08x.\n", hr);
416     hr = IFileOpenDialog_SetFileTypes(pfod, 1, filterspec);
417     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
418     hr = IFileOpenDialog_SetFileTypes(pfod, 1, &filterspec[1]);
419     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
420
421     hr = IFileSaveDialog_SetFileTypeIndex(pfsd, -1);
422     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
423     hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 0);
424     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
425     hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 1);
426     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
427     hr = IFileSaveDialog_SetFileTypes(pfsd, 1, filterspec);
428     ok(hr == S_OK, "got 0x%08x.\n", hr);
429     hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 0);
430     ok(hr == S_OK, "got 0x%08x.\n", hr);
431     hr = IFileSaveDialog_SetFileTypeIndex(pfsd, 100);
432     ok(hr == S_OK, "got 0x%08x.\n", hr);
433     hr = IFileSaveDialog_SetFileTypes(pfsd, 1, filterspec);
434     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
435     hr = IFileSaveDialog_SetFileTypes(pfsd, 1, &filterspec[1]);
436     ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
437
438     /* SetFilter */
439     todo_wine
440     {
441     hr = IFileOpenDialog_SetFilter(pfod, NULL);
442     ok(hr == S_OK, "got 0x%08x.\n", hr);
443     hr = IFileSaveDialog_SetFilter(pfsd, NULL);
444     ok(hr == S_OK, "got 0x%08x.\n", hr);
445     }
446
447     /* SetFolder */
448     hr = IFileOpenDialog_SetFolder(pfod, NULL);
449     ok(hr == S_OK, "got 0x%08x.\n", hr);
450     hr = IFileSaveDialog_SetFolder(pfsd, NULL);
451     ok(hr == S_OK, "got 0x%08x.\n", hr);
452
453     /* SetDefaultExtension */
454     todo_wine
455     {
456     hr = IFileOpenDialog_SetDefaultExtension(pfod, NULL);
457     ok(hr == S_OK, "got 0x%08x.\n", hr);
458     hr = IFileOpenDialog_SetDefaultExtension(pfod, txt);
459     ok(hr == S_OK, "got 0x%08x.\n", hr);
460     hr = IFileOpenDialog_SetDefaultExtension(pfod, null);
461     ok(hr == S_OK, "got 0x%08x.\n", hr);
462
463     hr = IFileSaveDialog_SetDefaultExtension(pfsd, NULL);
464     ok(hr == S_OK, "got 0x%08x.\n", hr);
465     hr = IFileSaveDialog_SetDefaultExtension(pfsd, txt);
466     ok(hr == S_OK, "got 0x%08x.\n", hr);
467     hr = IFileSaveDialog_SetDefaultExtension(pfsd, null);
468     ok(hr == S_OK, "got 0x%08x.\n", hr);
469     }
470
471     /* SetDefaultFolder */
472     hr = IFileOpenDialog_SetDefaultFolder(pfod, NULL);
473     ok(hr == S_OK, "got 0x%08x\n", hr);
474     hr = IFileSaveDialog_SetDefaultFolder(pfsd, NULL);
475     ok(hr == S_OK, "got 0x%08x\n", hr);
476
477     hr = IFileOpenDialog_SetDefaultFolder(pfod, psidesktop);
478     ok(hr == S_OK, "got 0x%08x\n", hr);
479     hr = IFileSaveDialog_SetDefaultFolder(pfsd, psidesktop);
480     ok(hr == S_OK, "got 0x%08x\n", hr);
481
482     if(0)
483     {
484         /* Crashes under Windows 7 */
485         IFileOpenDialog_SetDefaultFolder(pfod, (void*)0x1234);
486         IFileSaveDialog_SetDefaultFolder(pfsd, (void*)0x1234);
487     }
488
489     /* GetFolder / SetFolder */
490     hr = IFileOpenDialog_GetFolder(pfod, NULL);
491     ok(hr == E_INVALIDARG, "got 0x%08x.\n", hr);
492
493     hr = IFileOpenDialog_GetFolder(pfod, &psi_original);
494     ok(hr == S_OK, "got 0x%08x.\n", hr);
495     if(SUCCEEDED(hr))
496     {
497         hr = IFileOpenDialog_SetFolder(pfod, psidesktop);
498         ok(hr == S_OK, "got 0x%08x.\n", hr);
499         hr = IFileOpenDialog_SetFolder(pfod, psi_original);
500         ok(hr == S_OK, "got 0x%08x.\n", hr);
501         IShellItem_Release(psi_original);
502     }
503
504     hr = IFileSaveDialog_GetFolder(pfsd, &psi_original);
505     ok(hr == S_OK, "got 0x%08x.\n", hr);
506     if(SUCCEEDED(hr))
507     {
508         hr = IFileSaveDialog_SetFolder(pfsd, psidesktop);
509         ok(hr == S_OK, "got 0x%08x.\n", hr);
510         hr = IFileSaveDialog_SetFolder(pfsd, psi_original);
511         ok(hr == S_OK, "got 0x%08x.\n", hr);
512         IShellItem_Release(psi_original);
513     }
514
515     /* AddPlace */
516     if(0)
517     {
518         /* Crashes under Windows 7 */
519         IFileOpenDialog_AddPlace(pfod, NULL, 0);
520         IFileSaveDialog_AddPlace(pfsd, NULL, 0);
521     }
522
523     todo_wine
524     {
525     hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_TOP + 1);
526     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
527     hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_BOTTOM);
528     ok(hr == S_OK, "got 0x%08x\n", hr);
529     hr = IFileOpenDialog_AddPlace(pfod, psidesktop, FDAP_TOP);
530     ok(hr == S_OK, "got 0x%08x\n", hr);
531
532     hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_TOP + 1);
533     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
534     hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_BOTTOM);
535     ok(hr == S_OK, "got 0x%08x\n", hr);
536     hr = IFileSaveDialog_AddPlace(pfsd, psidesktop, FDAP_TOP);
537     ok(hr == S_OK, "got 0x%08x\n", hr);
538     }
539
540     /* SetFileName */
541     todo_wine
542     {
543     hr = IFileOpenDialog_SetFileName(pfod, NULL);
544     ok(hr == S_OK, "got 0x%08x\n", hr);
545     hr = IFileOpenDialog_SetFileName(pfod, null);
546     ok(hr == S_OK, "got 0x%08x\n", hr);
547     hr = IFileOpenDialog_SetFileName(pfod, txt);
548     ok(hr == S_OK, "got 0x%08x\n", hr);
549
550     hr = IFileSaveDialog_SetFileName(pfsd, NULL);
551     ok(hr == S_OK, "got 0x%08x\n", hr);
552     hr = IFileSaveDialog_SetFileName(pfsd, null);
553     ok(hr == S_OK, "got 0x%08x\n", hr);
554     hr = IFileSaveDialog_SetFileName(pfsd, txt);
555     ok(hr == S_OK, "got 0x%08x\n", hr);
556     }
557
558     /* SetFileNameLabel */
559     todo_wine
560     {
561     hr = IFileOpenDialog_SetFileNameLabel(pfod, NULL);
562     ok(hr == S_OK, "got 0x%08x\n", hr);
563     hr = IFileOpenDialog_SetFileNameLabel(pfod, null);
564     ok(hr == S_OK, "got 0x%08x\n", hr);
565     hr = IFileOpenDialog_SetFileNameLabel(pfod, txt);
566     ok(hr == S_OK, "got 0x%08x\n", hr);
567
568     hr = IFileSaveDialog_SetFileNameLabel(pfsd, NULL);
569     ok(hr == S_OK, "got 0x%08x\n", hr);
570     hr = IFileSaveDialog_SetFileNameLabel(pfsd, null);
571     ok(hr == S_OK, "got 0x%08x\n", hr);
572     hr = IFileSaveDialog_SetFileNameLabel(pfsd, txt);
573     ok(hr == S_OK, "got 0x%08x\n", hr);
574     }
575
576     /* Close */
577     todo_wine
578     {
579     hr = IFileOpenDialog_Close(pfod, S_FALSE);
580     ok(hr == S_OK, "got 0x%08x\n", hr);
581     hr = IFileSaveDialog_Close(pfsd, S_FALSE);
582     ok(hr == S_OK, "got 0x%08x\n", hr);
583     }
584
585     /* SetOkButtonLabel */
586     todo_wine
587     {
588     hr = IFileOpenDialog_SetOkButtonLabel(pfod, NULL);
589     ok(hr == S_OK, "got 0x%08x\n", hr);
590     hr = IFileOpenDialog_SetOkButtonLabel(pfod, null);
591     ok(hr == S_OK, "got 0x%08x\n", hr);
592     hr = IFileOpenDialog_SetOkButtonLabel(pfod, txt);
593     ok(hr == S_OK, "got 0x%08x\n", hr);
594     hr = IFileSaveDialog_SetOkButtonLabel(pfsd, NULL);
595     ok(hr == S_OK, "got 0x%08x\n", hr);
596     hr = IFileSaveDialog_SetOkButtonLabel(pfsd, null);
597     ok(hr == S_OK, "got 0x%08x\n", hr);
598     hr = IFileSaveDialog_SetOkButtonLabel(pfsd, txt);
599     ok(hr == S_OK, "got 0x%08x\n", hr);
600     }
601
602     /* SetTitle */
603     todo_wine
604     {
605     hr = IFileOpenDialog_SetTitle(pfod, NULL);
606     ok(hr == S_OK, "got 0x%08x\n", hr);
607     hr = IFileOpenDialog_SetTitle(pfod, null);
608     ok(hr == S_OK, "got 0x%08x\n", hr);
609     hr = IFileOpenDialog_SetTitle(pfod, txt);
610     ok(hr == S_OK, "got 0x%08x\n", hr);
611     hr = IFileSaveDialog_SetTitle(pfsd, NULL);
612     ok(hr == S_OK, "got 0x%08x\n", hr);
613     hr = IFileSaveDialog_SetTitle(pfsd, null);
614     ok(hr == S_OK, "got 0x%08x\n", hr);
615     hr = IFileSaveDialog_SetTitle(pfsd, txt);
616     ok(hr == S_OK, "got 0x%08x\n", hr);
617     }
618
619     /** IFileOpenDialog specific **/
620
621     /* GetResults */
622     if(0)
623     {
624         /* Crashes under Windows 7 */
625         IFileOpenDialog_GetResults(pfod, NULL);
626     }
627     psia = (void*)0xdeadbeef;
628     hr = IFileOpenDialog_GetResults(pfod, &psia);
629     ok(hr == E_FAIL, "got 0x%08x.\n", hr);
630     ok(psia == NULL, "got %p.\n", psia);
631
632     /* GetSelectedItems */
633     if(0)
634     {
635         /* Crashes under W2K8 */
636         hr = IFileOpenDialog_GetSelectedItems(pfod, NULL);
637         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
638         psia = (void*)0xdeadbeef;
639         hr = IFileOpenDialog_GetSelectedItems(pfod, &psia);
640         ok(hr == E_FAIL, "got 0x%08x.\n", hr);
641         ok(psia == (void*)0xdeadbeef, "got %p.\n", psia);
642     }
643
644     /** IFileSaveDialog specific **/
645
646     /* ApplyProperties */
647     if(0)
648     {
649         /* Crashes under windows 7 */
650         IFileSaveDialog_ApplyProperties(pfsd, NULL, NULL, NULL, NULL);
651         IFileSaveDialog_ApplyProperties(pfsd, psidesktop, NULL, NULL, NULL);
652     }
653
654     /* GetProperties */
655     hr = IFileSaveDialog_GetProperties(pfsd, NULL);
656     todo_wine ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
657     pps = (void*)0xdeadbeef;
658     hr = IFileSaveDialog_GetProperties(pfsd, &pps);
659     todo_wine ok(hr == E_UNEXPECTED, "got 0x%08x\n", hr);
660     ok(pps == (void*)0xdeadbeef, "got %p\n", pps);
661
662     /* SetProperties */
663     if(0)
664     {
665         /* Crashes under W2K8 */
666         hr = IFileSaveDialog_SetProperties(pfsd, NULL);
667         ok(hr == S_OK, "got 0x%08x\n", hr);
668     }
669
670     /* SetCollectedProperties */
671     todo_wine
672     {
673     hr = IFileSaveDialog_SetCollectedProperties(pfsd, NULL, TRUE);
674     ok(hr == S_OK, "got 0x%08x\n", hr);
675     hr = IFileSaveDialog_SetCollectedProperties(pfsd, NULL, FALSE);
676     ok(hr == S_OK, "got 0x%08x\n", hr);
677     }
678
679     /* SetSaveAsItem */
680     todo_wine
681     {
682     hr = IFileSaveDialog_SetSaveAsItem(pfsd, NULL);
683     ok(hr == S_OK, "got 0x%08x\n", hr);
684     hr = IFileSaveDialog_SetSaveAsItem(pfsd, psidesktop);
685     ok(hr == MK_E_NOOBJECT, "got 0x%08x\n", hr);
686     }
687
688     /** IFileDialog2 **/
689
690     hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialog2, (void**)&pfd2);
691     ok((hr == S_OK) || broken(hr == E_NOINTERFACE), "got 0x%08x\n", hr);
692     if(SUCCEEDED(hr))
693     {
694         /* SetCancelButtonLabel */
695         todo_wine
696         {
697         hr = IFileDialog2_SetOkButtonLabel(pfd2, NULL);
698         ok(hr == S_OK, "got 0x%08x\n", hr);
699         hr = IFileDialog2_SetOkButtonLabel(pfd2, null);
700         ok(hr == S_OK, "got 0x%08x\n", hr);
701         hr = IFileDialog2_SetOkButtonLabel(pfd2, txt);
702         ok(hr == S_OK, "got 0x%08x\n", hr);
703         }
704
705         /* SetNavigationRoot */
706         todo_wine
707         {
708         hr = IFileDialog2_SetNavigationRoot(pfd2, NULL);
709         ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
710         hr = IFileDialog2_SetNavigationRoot(pfd2, psidesktop);
711         ok(hr == S_OK, "got 0x%08x\n", hr);
712         }
713
714         IFileDialog2_Release(pfd2);
715     }
716
717     hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialog2, (void**)&pfd2);
718     ok((hr == S_OK) || broken(hr == E_NOINTERFACE), "got 0x%08x\n", hr);
719     if(SUCCEEDED(hr))
720     {
721         /* SetCancelButtonLabel */
722         todo_wine
723         {
724         hr = IFileDialog2_SetOkButtonLabel(pfd2, NULL);
725         ok(hr == S_OK, "got 0x%08x\n", hr);
726         hr = IFileDialog2_SetOkButtonLabel(pfd2, null);
727         ok(hr == S_OK, "got 0x%08x\n", hr);
728         hr = IFileDialog2_SetOkButtonLabel(pfd2, txt);
729         ok(hr == S_OK, "got 0x%08x\n", hr);
730         }
731
732         /* SetNavigationRoot */
733         todo_wine
734         {
735         hr = IFileDialog2_SetNavigationRoot(pfd2, NULL);
736         ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
737         hr = IFileDialog2_SetNavigationRoot(pfd2, psidesktop);
738         ok(hr == S_OK, "got 0x%08x\n", hr);
739         }
740
741         IFileDialog2_Release(pfd2);
742     }
743
744     /* Cleanup */
745     IShellItem_Release(psidesktop);
746     IFileOpenDialog_Release(pfod);
747     IFileSaveDialog_Release(pfsd);
748 }
749
750 static void test_advise_helper(IFileDialog *pfd)
751 {
752     IFileDialogEventsImpl *pfdeimpl;
753     IFileDialogEvents *pfde;
754     DWORD cookie[10];
755     UINT i;
756     HRESULT hr;
757
758     pfde = IFileDialogEvents_Constructor();
759     pfdeimpl = impl_from_IFileDialogEvents(pfde);
760
761     hr = IFileDialog_Advise(pfd, NULL, NULL);
762     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
763     hr = IFileDialog_Advise(pfd, pfde, NULL);
764     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
765     hr = IFileDialog_Advise(pfd, NULL, &cookie[0]);
766     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
767     ok(pfdeimpl->ref == 1, "got ref %d\n", pfdeimpl->ref);
768
769     hr = IFileDialog_Unadvise(pfd, 0);
770     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
771     for(i = 0; i < 10; i++) {
772         hr = IFileDialog_Advise(pfd, pfde, &cookie[i]);
773         ok(hr == S_OK, "got 0x%08x\n", hr);
774         ok(cookie[i] == i+1, "Got cookie: %d\n", cookie[i]);
775     }
776     ok(pfdeimpl->ref == 10+1, "got ref %d\n", pfdeimpl->ref);
777
778     for(i = 3; i < 7; i++) {
779         hr = IFileDialog_Unadvise(pfd, cookie[i]);
780         ok(hr == S_OK, "got 0x%08x\n", hr);
781     }
782     ok(pfdeimpl->ref == 6+1, "got ref %d\n", pfdeimpl->ref);
783
784     for(i = 0; i < 3; i++) {
785         hr = IFileDialog_Unadvise(pfd, cookie[i]);
786         ok(hr == S_OK, "got 0x%08x\n", hr);
787     }
788     ok(pfdeimpl->ref == 3+1, "got ref %d\n", pfdeimpl->ref);
789
790     for(i = 7; i < 10; i++) {
791         hr = IFileDialog_Unadvise(pfd, cookie[i]);
792         ok(hr == S_OK, "got 0x%08x\n", hr);
793     }
794     ok(pfdeimpl->ref == 1, "got ref %d\n", pfdeimpl->ref);
795
796     hr = IFileDialog_Unadvise(pfd, cookie[9]+1);
797     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
798     ok(pfdeimpl->ref == 1, "got ref %d\n", pfdeimpl->ref);
799
800     hr = IFileDialog_Advise(pfd, pfde, &cookie[0]);
801     ok(hr == S_OK, "got 0x%08x\n", hr);
802     todo_wine ok(cookie[0] == 1, "got cookie: %d\n", cookie[0]);
803     ok(pfdeimpl->ref == 1+1, "got ref %d\n", pfdeimpl->ref);
804
805     hr = IFileDialog_Unadvise(pfd, cookie[0]);
806
807     if(0)
808     {
809         /* Unadvising already unadvised cookies crashes on
810            Windows 7. */
811         IFileDialog_Unadvise(pfd, cookie[0]);
812     }
813
814
815     IFileDialogEvents_Release(pfde);
816 }
817
818 static void test_advise(void)
819 {
820     IFileDialog *pfd;
821     HRESULT hr;
822
823     trace("Testing FileOpenDialog (advise)\n");
824     hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
825                           &IID_IFileDialog, (void**)&pfd);
826     ok(hr == S_OK, "got 0x%08x.\n", hr);
827     test_advise_helper(pfd);
828     IFileDialog_Release(pfd);
829
830     trace("Testing FileSaveDialog (advise)\n");
831     hr = CoCreateInstance(&CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
832                           &IID_IFileDialog, (void**)&pfd);
833     ok(hr == S_OK, "got 0x%08x.\n", hr);
834     test_advise_helper(pfd);
835     IFileDialog_Release(pfd);
836 }
837
838 START_TEST(itemdlg)
839 {
840     OleInitialize(NULL);
841     init_function_pointers();
842
843     if(test_instantiation())
844     {
845         test_basics();
846         test_advise();
847     }
848     else
849         skip("Skipping all Item Dialog tests.\n");
850
851     OleUninitialize();
852 }