2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for SHParseDisplayName
5 * PROGRAMMERS: Thomas Faber <thomas.faber@reactos.org>
10 #include <ndk/umtypes.h>
23 #define T_PRE_VISTA T_WIN2K|T_WINXP|T_WIN2K3
24 #define T_VISTA_PLUS T_VISTA|T_WIN7|T_WIN8|T_WIN10
29 PCWSTR wszPathToParse
;
30 PCWSTR wszExpectedDisplayName
;
36 struct test_data Tests
[] =
38 /* Tests for CDesktopFolder */
39 {__LINE__
, NULL
, NULL
, 0, E_OUTOFMEMORY
, T_PRE_VISTA
},
40 {__LINE__
, NULL
, NULL
, 0, E_INVALIDARG
, T_VISTA_PLUS
},
41 {__LINE__
, L
"", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 0, S_OK
, 0},
42 {__LINE__
, L
" ", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), T_PRE_VISTA
},
43 {__LINE__
, L
" ", NULL
, 0, E_INVALIDARG
, T_VISTA_PLUS
},
44 {__LINE__
, L
":", NULL
, 0, E_INVALIDARG
, 0},
45 {__LINE__
, L
": ", NULL
, 0, E_INVALIDARG
, 0},
46 {__LINE__
, L
" :", NULL
, 0, E_INVALIDARG
, 0},
47 {__LINE__
, L
"/", NULL
, 0, E_INVALIDARG
, 0},
48 {__LINE__
, L
"//", NULL
, 0, E_INVALIDARG
, 0},
49 {__LINE__
, L
"\\", NULL
, 0, E_INVALIDARG
, 0},
50 {__LINE__
, L
"\\\\?", NULL
, 0, E_INVALIDARG
, 0},
51 {__LINE__
, L
"\\\\?\\", NULL
, 0, E_INVALIDARG
, 0},
52 /* Tests for the shell: protocol */
53 {__LINE__
, L
"shell:", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), 0},
54 {__LINE__
, L
"shell::", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), 0},
55 {__LINE__
, L
"shell:::", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), 0},
56 {__LINE__
, L
"shell:::{", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), 0},
57 {__LINE__
, L
"shell:fail", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), 0},
58 {__LINE__
, L
"shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 0, S_OK
, 0},
59 {__LINE__
, L
"shell:desktop", NULL
, CSIDL_DESKTOPDIRECTORY
, S_OK
, T_PRE_VISTA
},
60 {__LINE__
, L
"shell:windows", NULL
, CSIDL_WINDOWS
, S_OK
, T_PRE_VISTA
},
61 {__LINE__
, L
"shell:system", NULL
, CSIDL_SYSTEM
, S_OK
, T_PRE_VISTA
},
62 {__LINE__
, L
"shell:personal", NULL
, CSIDL_MYDOCUMENTS
, S_OK
, T_PRE_VISTA
},
63 {__LINE__
, L
"shell:programs", NULL
, CSIDL_PROGRAMS
, S_OK
, T_PRE_VISTA
},
64 {__LINE__
, L
"shell:programfiles", NULL
, CSIDL_PROGRAM_FILES
, S_OK
, T_PRE_VISTA
},
65 /* The following tests are confusing. They don't work for SHParseDisplayName but work on psfDesktop->ParseDisplayName */
66 {__LINE__
, L
"shell:desktop", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_VISTA_PLUS
},
67 {__LINE__
, L
"shell:windows", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_VISTA_PLUS
},
68 {__LINE__
, L
"shell:system", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_VISTA_PLUS
},
69 {__LINE__
, L
"shell:personal", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_VISTA_PLUS
},
70 {__LINE__
, L
"shell:programs", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_VISTA_PLUS
},
71 {__LINE__
, L
"shell:programfiles", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_VISTA_PLUS
},
72 /* Tests for CInternet */
73 {__LINE__
, L
"aa:", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
74 {__LINE__
, L
"garbage:", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
75 {__LINE__
, L
"ftp:", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
76 {__LINE__
, L
"ftp:/", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
77 {__LINE__
, L
"ftp://", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
78 {__LINE__
, L
"ftp://a", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
79 {__LINE__
, L
"ftp://ftp.gnu.org/gnu/octave/", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
80 {__LINE__
, L
"aa:", L
"aa:", 0, S_OK
, T_VISTA_PLUS
},
81 {__LINE__
, L
"garbage:", L
"garbage:", 0, S_OK
, T_VISTA_PLUS
},
82 {__LINE__
, L
"ftp:", L
"ftp:", 0, S_OK
, T_VISTA_PLUS
},
83 {__LINE__
, L
"ftp:/", L
"ftp:/", 0, S_OK
, T_VISTA_PLUS
},
84 {__LINE__
, L
"ftp://", L
"ftp:///", 0, S_OK
, T_VISTA_PLUS
},
85 {__LINE__
, L
"ftp://a", L
"ftp://a/", 0, S_OK
, T_VISTA_PLUS
},
86 {__LINE__
, L
"ftp://ftp.gnu.org/gnu/octave/", L
"ftp://ftp.gnu.org/gnu/octave/", 0, S_OK
, T_VISTA_PLUS
},
87 /* Tests for CRegFolder */
88 {__LINE__
, L
"::", NULL
, 0, CO_E_CLASSSTRING
, 0},
89 {__LINE__
, L
"::{", NULL
, 0, CO_E_CLASSSTRING
, 0},
90 {__LINE__
, L
"::{ ", NULL
, 0, CO_E_CLASSSTRING
, 0},
91 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 0, S_OK
, 0},
92 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D} ", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 0, S_OK
, 0},
93 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}a", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 0, S_OK
, 0},
94 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}garbage", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", 0, S_OK
, 0},
95 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D ", NULL
, 0, CO_E_CLASSSTRING
, 0},
96 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\", NULL
, 0, E_INVALIDARG
, 0},
97 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\ ", NULL
, 0, E_INVALIDARG
, 0},
98 {__LINE__
, L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", L
"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}", 0, S_OK
, 0},
99 /* Tests for CDrivesFolder */
100 {__LINE__
, L
"c:", NULL
, 0, E_INVALIDARG
, T_PRE_VISTA
},
101 {__LINE__
, L
"c:", L
"C:\\", 0, S_OK
, T_VISTA_PLUS
},
102 {__LINE__
, L
"c:\\", L
"C:\\", 0, S_OK
, 0},
103 {__LINE__
, L
"C:\\", L
"C:\\", 0, S_OK
, 0},
104 {__LINE__
, L
"y:\\", NULL
, 0, HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND
), T_PRE_VISTA
},
105 {__LINE__
, L
"y:\\", NULL
, 0, HRESULT_FROM_WIN32(ERROR_INVALID_DRIVE
), T_VISTA_PLUS
},
106 {__LINE__
, L
"C:\\ ", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), T_PRE_VISTA
},
107 {__LINE__
, L
"C:\\ ", NULL
, 0, E_INVALIDARG
, T_VISTA_PLUS
},
108 /* Tests for CFSFolder */
109 {__LINE__
, L
"$", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), 0},
110 {__LINE__
, L
"c:\\Program Files", L
"C:\\Program Files", 0, S_OK
, 0},
111 {__LINE__
, L
"c:\\Program Files\\", L
"C:\\Program Files", 0, S_OK
, 0},
112 /* Paths with . are valid for win+r dialog or address bar but not for ParseDisplayName */
113 {__LINE__
, L
"c:\\Program Files\\.", NULL
, 0, E_INVALIDARG
, 0},
114 {__LINE__
, L
"c:\\Program Files\\..", NULL
, 0, E_INVALIDARG
, 0}, /* This gives C:\ when entered in address bar */
115 {__LINE__
, L
".", NULL
, 0, E_INVALIDARG
, 0},
116 {__LINE__
, L
"..", NULL
, 0, E_INVALIDARG
, 0},
117 {__LINE__
, L
"C:\\.", NULL
, 0, E_INVALIDARG
, 0},
118 {__LINE__
, L
"fonts", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), 0}, /* These three work for ShellExecute */
119 {__LINE__
, L
"winsxs", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), 0},
120 {__LINE__
, L
"system32", NULL
, 0, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND
), 0}
123 UINT
get_host_os_flag()
125 switch (LOWORD(GetVersion()))
127 case 5: return T_WIN2K
;
128 case (5 | (1 << 8)): return T_WINXP
;
129 case (5 | (2 << 8)): return T_WIN2K3
;
130 case 6: return T_VISTA
;
131 case (6 | (1 << 8)): return T_WIN7
;
132 case (6 | (2 << 8)): return T_WIN8
;
133 case 10: return T_WIN10
;
139 START_TEST(SHParseDisplayName
)
142 UINT os_flag
= get_host_os_flag();
143 ok (os_flag
!= 0, "Incompatible os version %d!", os_flag
);
147 IShellFolder
*psfDesktop
;
148 hr
= SHGetDesktopFolder(&psfDesktop
);
149 ok(hr
== S_OK
, "hr = %lx\n", hr
);
151 for (UINT i
= 0; i
< _countof(Tests
); i
++)
153 if (Tests
[i
].ValidForVersion
&& !(Tests
[i
].ValidForVersion
& os_flag
))
156 PIDLIST_ABSOLUTE pidl
;
157 HRESULT hr
= SHParseDisplayName(Tests
[i
].wszPathToParse
, NULL
, &pidl
, 0, NULL
);
158 ok(hr
== Tests
[i
].hResult
, "%d: Expected error 0x%lx, got 0x%lx\n", Tests
[i
].testline
, Tests
[i
].hResult
, hr
);
160 if (Tests
[i
].wszExpectedDisplayName
== NULL
&& Tests
[i
].nExpectedCSIDL
== 0)
162 ok(pidl
== NULL
, "%d: Expected no pidl\n", Tests
[i
].testline
);
166 ok(pidl
!= NULL
, "%d: Expected pidl on success\n", Tests
[i
].testline
);
171 hr
= psfDesktop
->GetDisplayNameOf(pidl
, SHGDN_FORPARSING
, &strret
);
172 ok(hr
== S_OK
, "%d: hr = %lx\n", Tests
[i
].testline
, hr
);
174 ok(strret
.uType
== STRRET_WSTR
, "%d: Expected STRRET_WSTR\n", Tests
[i
].testline
);
176 if (Tests
[i
].wszExpectedDisplayName
)
178 ok(!wcscmp(strret
.pOleStr
, Tests
[i
].wszExpectedDisplayName
), "%d: expected %S got %S\n", Tests
[i
].testline
, Tests
[i
].wszExpectedDisplayName
, strret
.pOleStr
);
182 PIDLIST_ABSOLUTE pidlSpecial
;
183 hr
= SHGetSpecialFolderLocation(NULL
, Tests
[i
].nExpectedCSIDL
, &pidlSpecial
);
184 ok(hr
== S_OK
, "%d: hr = %lx\n", Tests
[i
].testline
, hr
);
186 STRRET strretSpecial
;
187 hr
= psfDesktop
->GetDisplayNameOf(pidlSpecial
, SHGDN_FORPARSING
, &strretSpecial
);
188 ok(hr
== S_OK
, "%d: hr = %lx\n", Tests
[i
].testline
, hr
);
190 ok(strret
.uType
== STRRET_WSTR
, "%d: Expected STRRET_WSTR\n", Tests
[i
].testline
);
192 ok(!wcscmp(strret
.pOleStr
, strretSpecial
.pOleStr
), "%d: expected %S got %S\n", Tests
[i
].testline
, strretSpecial
.pOleStr
, strret
.pOleStr
);