1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Test for AssocQueryStringA/W
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8 #include <apitest.h>
9 #include <shlwapi.h>
10 #include <stdio.h>
11 #include <versionhelpers.h>
12
13 typedef HRESULT (WINAPI *FN_AssocQueryStringA)(
14 ASSOCF cfFlags,
15 ASSOCSTR str,
16 LPCSTR pszAssoc,
17 LPCSTR pszExtra,
18 LPSTR pszOut,
19 DWORD *pcchOut);
20 typedef HRESULT (WINAPI *FN_AssocQueryStringW)(
21 ASSOCF cfFlags,
22 ASSOCSTR str,
23 LPCWSTR pszAssoc,
24 LPCWSTR pszExtra,
25 LPWSTR pszOut,
26 DWORD *pcchOut);
27
28 static HINSTANCE s_hSHLWAPI = NULL;
29 static FN_AssocQueryStringA s_fnAssocQueryStringA = NULL;
30 static FN_AssocQueryStringW s_fnAssocQueryStringW = NULL;
31 static CHAR s_szTextFileA[MAX_PATH] = "";
32 static WCHAR s_szTextFileW[MAX_PATH] = L"";
33 #define NON_EXISTENT_FILENAME_A "C:\\ThisIsNotExistentFile.txt"
34 #define NON_EXISTENT_FILENAME_W L"C:\\ThisIsNotExistentFile.txt"
35
TEST_Start(void)36 static void TEST_Start(void)
37 {
38 ExpandEnvironmentStringsA( "%APPDATA%\\This is a test.txt", s_szTextFileA, _countof(s_szTextFileA));
39 ExpandEnvironmentStringsW(L"%APPDATA%\\This is a test.txt", s_szTextFileW, _countof(s_szTextFileW));
40 fclose(_wfopen(s_szTextFileW, L"w"));
41 trace("%s\n", wine_dbgstr_a(s_szTextFileA));
42 trace("%s\n", wine_dbgstr_w(s_szTextFileW));
43 }
44
TEST_End(void)45 static void TEST_End(void)
46 {
47 DeleteFileW(s_szTextFileW);
48 }
49
50 /*
51 * "shlwapi_winetest assoc" already has many tests.
52 * We just do additional tests in here.
53 */
54
TEST_AssocQueryStringA(void)55 static void TEST_AssocQueryStringA(void)
56 {
57 CHAR szPath[MAX_PATH], szAnswer[MAX_PATH];
58 CHAR szDebug1[MAX_PATH], szDebug2[MAX_PATH];
59 HRESULT hr;
60 DWORD cch;
61
62 /* ".txt" */
63 lstrcpynA(szPath, ".txt", _countof(szPath));
64 cch = _countof(szPath);
65 hr = AssocQueryStringA(0, ASSOCSTR_EXECUTABLE, szPath, NULL, szPath, &cch);
66 if (IsWindowsVistaOrGreater())
67 {
68 ExpandEnvironmentStringsA("%WINDIR%\\system32\\notepad.exe", szAnswer, _countof(szAnswer));
69 ok_long(hr, S_OK);
70 ok_int(cch, lstrlenA(szAnswer) + 1);
71 }
72 else
73 {
74 lstrcpynA(szAnswer, ".txt", _countof(szAnswer));
75 ok_long(hr, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
76 ok_int(cch, _countof(szPath));
77 }
78 lstrcpynA(szDebug1, wine_dbgstr_a(szPath), _countof(szDebug1));
79 lstrcpynA(szDebug2, wine_dbgstr_a(szAnswer), _countof(szDebug2));
80 ok(lstrcmpiA(szPath, szAnswer) == 0, "%s vs %s\n", szDebug1, szDebug2);
81
82 /* s_szTextFileA */
83 lstrcpynA(szPath, s_szTextFileA, _countof(szPath));
84 cch = _countof(szPath);
85 hr = AssocQueryStringA(0, ASSOCSTR_EXECUTABLE, szPath, NULL, szPath, &cch);
86 if (IsWindowsVistaOrGreater())
87 {
88 ExpandEnvironmentStringsA("%WINDIR%\\system32\\notepad.exe", szAnswer, _countof(szAnswer));
89 ok_long(hr, S_OK);
90 ok_int(cch, lstrlenA(szAnswer) + 1);
91 }
92 else
93 {
94 lstrcpynA(szAnswer, s_szTextFileA, _countof(szAnswer));
95 ok_long(hr, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
96 ok_int(cch, _countof(szPath));
97 }
98 lstrcpynA(szDebug1, wine_dbgstr_a(szPath), _countof(szDebug1));
99 lstrcpynA(szDebug2, wine_dbgstr_a(szAnswer), _countof(szDebug2));
100 ok(lstrcmpiA(szPath, szAnswer) == 0, "%s vs %s\n", szDebug1, szDebug2);
101
102 /* NON_EXISTENT_FILENAME_A */
103 lstrcpynA(szPath, NON_EXISTENT_FILENAME_A, _countof(szPath));
104 cch = _countof(szPath);
105 hr = AssocQueryStringA(0, ASSOCSTR_EXECUTABLE, szPath, NULL, szPath, &cch);
106 if (IsWindowsVistaOrGreater())
107 {
108 ExpandEnvironmentStringsA("%WINDIR%\\system32\\notepad.exe", szAnswer, _countof(szAnswer));
109 ok_long(hr, S_OK);
110 ok_int(cch, lstrlenA(szAnswer) + 1);
111 }
112 else
113 {
114 lstrcpynA(szAnswer, NON_EXISTENT_FILENAME_A, _countof(szAnswer));
115 ok_long(hr, HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
116 ok_int(cch, _countof(szPath));
117 }
118 lstrcpynA(szDebug1, wine_dbgstr_a(szPath), _countof(szDebug1));
119 lstrcpynA(szDebug2, wine_dbgstr_a(szAnswer), _countof(szDebug2));
120 ok(lstrcmpiA(szPath, szAnswer) == 0, "%s vs %s\n", szDebug1, szDebug2);
121 }
122
TEST_AssocQueryStringW(void)123 static void TEST_AssocQueryStringW(void)
124 {
125 WCHAR szPath[MAX_PATH], szAnswer[MAX_PATH];
126 CHAR szDebug1[MAX_PATH], szDebug2[MAX_PATH];
127 HRESULT hr;
128 DWORD cch;
129
130 /* ".txt" */
131 lstrcpynW(szPath, L".txt", _countof(szPath));
132 cch = _countof(szPath);
133 hr = AssocQueryStringW(0, ASSOCSTR_EXECUTABLE, szPath, NULL, szPath, &cch);
134 ok_long(hr, S_OK);
135 ExpandEnvironmentStringsW(L"%WINDIR%\\system32\\notepad.exe", szAnswer, _countof(szAnswer));
136 lstrcpynA(szDebug1, wine_dbgstr_w(szPath), _countof(szDebug1));
137 lstrcpynA(szDebug2, wine_dbgstr_w(szAnswer), _countof(szDebug2));
138 ok(lstrcmpiW(szPath, szAnswer) == 0, "%s vs %s\n", szDebug1, szDebug2);
139 ok_int(cch, lstrlenW(szAnswer) + 1);
140
141 /* s_szTextFileW */
142 lstrcpynW(szPath, s_szTextFileW, _countof(szPath));
143 cch = _countof(szPath);
144 hr = AssocQueryStringW(0, ASSOCSTR_EXECUTABLE, szPath, NULL, szPath, &cch);
145 ok_long(hr, S_OK);
146 ExpandEnvironmentStringsW(L"%WINDIR%\\system32\\notepad.exe", szAnswer, _countof(szAnswer));
147 lstrcpynA(szDebug1, wine_dbgstr_w(szPath), _countof(szDebug1));
148 lstrcpynA(szDebug2, wine_dbgstr_w(szAnswer), _countof(szDebug2));
149 ok(lstrcmpiW(szPath, szAnswer) == 0, "%s vs %s\n", szDebug1, szDebug2);
150 ok_int(cch, lstrlenW(szAnswer) + 1);
151
152 /* NON_EXISTENT_FILENAME_W */
153 lstrcpynW(szPath, NON_EXISTENT_FILENAME_W, _countof(szPath));
154 cch = _countof(szPath);
155 hr = AssocQueryStringW(0, ASSOCSTR_EXECUTABLE, szPath, NULL, szPath, &cch);
156 ok_long(hr, S_OK);
157 ExpandEnvironmentStringsW(L"%WINDIR%\\system32\\notepad.exe", szAnswer, _countof(szAnswer));
158 lstrcpynA(szDebug1, wine_dbgstr_w(szPath), _countof(szDebug1));
159 lstrcpynA(szDebug2, wine_dbgstr_w(szAnswer), _countof(szDebug2));
160 ok(lstrcmpiW(szPath, szAnswer) == 0, "%s vs %s\n", szDebug1, szDebug2);
161 ok_int(cch, lstrlenW(szAnswer) + 1);
162 }
163
START_TEST(AssocQueryString)164 START_TEST(AssocQueryString)
165 {
166 HRESULT hrCoInit = CoInitialize(NULL);
167
168 s_hSHLWAPI = LoadLibraryW(L"shlwapi.dll");
169 s_fnAssocQueryStringA = (FN_AssocQueryStringA)GetProcAddress(s_hSHLWAPI, "AssocQueryStringA");
170 s_fnAssocQueryStringW = (FN_AssocQueryStringW)GetProcAddress(s_hSHLWAPI, "AssocQueryStringW");
171 if (!s_fnAssocQueryStringA || !s_fnAssocQueryStringW)
172 {
173 skip("AssocQueryStringA or AssocQueryStringW not found: %p, %p\n",
174 s_fnAssocQueryStringA, s_fnAssocQueryStringW);
175 return;
176 }
177
178 TEST_Start();
179 TEST_AssocQueryStringA();
180 TEST_AssocQueryStringW();
181 TEST_End();
182
183 FreeLibrary(s_hSHLWAPI);
184
185 if (SUCCEEDED(hrCoInit))
186 CoUninitialize();
187 }
188