po: Update simplified Chinese translation.
[wine/multimedia.git] / dlls / inetcomm / tests / mimeintl.c
blob09f9dae8d8c3bfbb15862e774fbee9ee8e19a070
1 /*
2 * MimeInternational tests
4 * Copyright 2008 Huw Davies
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.
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.
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
21 #define COBJMACROS
22 #define NONAMELESSUNION
24 #include "windows.h"
25 #include "ole2.h"
26 #include "ocidl.h"
28 #include "mimeole.h"
30 #include "initguid.h"
31 #include "mlang.h"
33 #include <stdio.h>
35 #include "wine/test.h"
37 static void test_create(void)
39 IMimeInternational *internat, *internat2;
40 HRESULT hr;
41 ULONG ref;
43 hr = MimeOleGetInternat(&internat);
44 ok(hr == S_OK, "ret %08x\n", hr);
45 hr = MimeOleGetInternat(&internat2);
46 ok(hr == S_OK, "ret %08x\n", hr);
48 /* Under w2k8 it's no longer a singleton */
49 if(internat == internat2)
51 /* test to show that the object is a singleton with
52 a reference held by the dll. */
53 ref = IMimeInternational_Release(internat2);
54 ok(ref == 2 ||
55 ref == 1, /* win95 - object is a static singleton */
56 "got %d\n", ref);
58 ref = IMimeInternational_Release(internat);
59 ok(ref == 1, "got %d\n", ref);
61 else
63 ref = IMimeInternational_Release(internat2);
64 ok(ref == 0, "got %d\n", ref);
66 ref = IMimeInternational_Release(internat);
67 ok(ref == 0, "got %d\n", ref);
72 static inline HRESULT get_mlang(IMultiLanguage **ml)
74 return CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
75 &IID_IMultiLanguage, (void **)ml);
78 static HRESULT mlang_getcsetinfo(const char *charset, MIMECSETINFO *mlang_info)
80 DWORD len = MultiByteToWideChar(CP_ACP, 0, charset, -1, NULL, 0);
81 BSTR bstr = SysAllocStringLen(NULL, len - 1);
82 HRESULT hr;
83 IMultiLanguage *ml;
85 MultiByteToWideChar(CP_ACP, 0, charset, -1, bstr, len);
87 hr = get_mlang(&ml);
89 if(SUCCEEDED(hr))
91 hr = IMultiLanguage_GetCharsetInfo(ml, bstr, mlang_info);
92 IMultiLanguage_Release(ml);
94 SysFreeString(bstr);
95 if(FAILED(hr)) hr = MIME_E_NOT_FOUND;
96 return hr;
99 static HRESULT mlang_getcodepageinfo(UINT cp, MIMECPINFO *mlang_cp_info)
101 HRESULT hr;
102 IMultiLanguage *ml;
104 hr = get_mlang(&ml);
106 if(SUCCEEDED(hr))
108 hr = IMultiLanguage_GetCodePageInfo(ml, cp, mlang_cp_info);
109 IMultiLanguage_Release(ml);
111 return hr;
114 static HRESULT mlang_getcsetinfo_from_cp(UINT cp, CHARSETTYPE charset_type, MIMECSETINFO *mlang_info)
116 MIMECPINFO mlang_cp_info;
117 WCHAR *charset_name;
118 HRESULT hr;
119 IMultiLanguage *ml;
121 hr = mlang_getcodepageinfo(cp, &mlang_cp_info);
122 if(FAILED(hr)) return hr;
124 switch(charset_type)
126 case CHARSET_BODY:
127 charset_name = mlang_cp_info.wszBodyCharset;
128 break;
129 case CHARSET_HEADER:
130 charset_name = mlang_cp_info.wszHeaderCharset;
131 break;
132 case CHARSET_WEB:
133 charset_name = mlang_cp_info.wszWebCharset;
134 break;
137 hr = get_mlang(&ml);
139 if(SUCCEEDED(hr))
141 hr = IMultiLanguage_GetCharsetInfo(ml, charset_name, mlang_info);
142 IMultiLanguage_Release(ml);
144 return hr;
147 static void test_charset(void)
149 IMimeInternational *internat;
150 HRESULT hr;
151 HCHARSET hcs, hcs_windows_1252, hcs_windows_1251;
152 INETCSETINFO cs_info;
153 MIMECSETINFO mlang_cs_info;
155 hr = MimeOleGetInternat(&internat);
156 ok(hr == S_OK, "ret %08x\n", hr);
158 hr = IMimeInternational_FindCharset(internat, "nonexistent", &hcs);
159 ok(hr == MIME_E_NOT_FOUND, "got %08x\n", hr);
161 hr = IMimeInternational_FindCharset(internat, "windows-1252", &hcs_windows_1252);
162 ok(hr == S_OK, "got %08x\n", hr);
163 hr = IMimeInternational_FindCharset(internat, "windows-1252", &hcs);
164 ok(hr == S_OK, "got %08x\n", hr);
165 ok(hcs_windows_1252 == hcs, "got different hcharsets for the same name\n");
166 hr = IMimeInternational_FindCharset(internat, "WiNdoWs-1252", &hcs);
167 ok(hr == S_OK, "got %08x\n", hr);
168 ok(hcs_windows_1252 == hcs, "got different hcharsets for the same name\n");
170 hr = IMimeInternational_FindCharset(internat, "windows-1251", &hcs_windows_1251);
171 ok(hr == S_OK, "got %08x\n", hr);
172 ok(hcs_windows_1252 != hcs_windows_1251, "got the same hcharset for the different names\n");
174 hr = IMimeInternational_GetCharsetInfo(internat, hcs_windows_1252, &cs_info);
175 ok(hr == S_OK, "got %08x\n", hr);
177 hr = mlang_getcsetinfo("windows-1252", &mlang_cs_info);
178 ok(hr == S_OK, "got %08x\n", hr);
179 ok(cs_info.cpiWindows == mlang_cs_info.uiCodePage, "cpiWindows %d while mlang uiCodePage %d\n",
180 cs_info.cpiWindows, mlang_cs_info.uiCodePage);
181 ok(cs_info.cpiInternet == mlang_cs_info.uiInternetEncoding, "cpiInternet %d while mlang uiInternetEncoding %d\n",
182 cs_info.cpiInternet, mlang_cs_info.uiInternetEncoding);
183 ok(cs_info.hCharset == hcs_windows_1252, "hCharset doesn't match requested\n");
184 ok(!strcmp(cs_info.szName, "windows-1252"), "szName doesn't match requested\n");
186 hr = IMimeInternational_GetCodePageCharset(internat, 1252, CHARSET_BODY, &hcs);
187 ok(hr == S_OK, "got %08x\n", hr);
188 hr = IMimeInternational_GetCharsetInfo(internat, hcs, &cs_info);
189 ok(hr == S_OK, "got %08x\n", hr);
191 hr = mlang_getcsetinfo_from_cp(1252, CHARSET_BODY, &mlang_cs_info);
192 ok(hr == S_OK, "got %08x\n", hr);
193 ok(cs_info.cpiWindows == mlang_cs_info.uiCodePage, "cpiWindows %d while mlang uiCodePage %d\n",
194 cs_info.cpiWindows, mlang_cs_info.uiCodePage);
195 ok(cs_info.cpiInternet == mlang_cs_info.uiInternetEncoding, "cpiInternet %d while mlang uiInternetEncoding %d\n",
196 cs_info.cpiInternet, mlang_cs_info.uiInternetEncoding);
198 IMimeInternational_Release(internat);
201 static void test_defaultcharset(void)
203 IMimeInternational *internat;
204 HRESULT hr;
205 HCHARSET hcs_default, hcs, hcs_windows_1251;
207 hr = MimeOleGetInternat(&internat);
208 ok(hr == S_OK, "ret %08x\n", hr);
210 hr = IMimeInternational_GetDefaultCharset(internat, &hcs_default);
211 ok(hr == S_OK, "ret %08x\n", hr);
212 hr = IMimeInternational_GetCodePageCharset(internat, GetACP(), CHARSET_BODY, &hcs);
213 ok(hr == S_OK, "ret %08x\n", hr);
214 ok(hcs_default == hcs, "Unexpected default charset\n");
216 hr = IMimeInternational_FindCharset(internat, "windows-1251", &hcs_windows_1251);
217 ok(hr == S_OK, "got %08x\n", hr);
218 hr = IMimeInternational_SetDefaultCharset(internat, hcs_windows_1251);
219 ok(hr == S_OK, "ret %08x\n", hr);
220 hr = IMimeInternational_GetDefaultCharset(internat, &hcs);
221 ok(hr == S_OK, "ret %08x\n", hr);
222 ok(hcs == hcs_windows_1251, "didn't retrieve recently set default\n");
223 /* Set the old default back again */
224 hr = IMimeInternational_SetDefaultCharset(internat, hcs_default);
225 ok(hr == S_OK, "ret %08x\n", hr);
227 IMimeInternational_Release(internat);
230 static void test_convert(void)
232 IMimeInternational *internat;
233 HRESULT hr;
234 BLOB src, dst;
235 ULONG read;
236 PROPVARIANT prop_in, prop_out;
237 static char test_string[] = "test string";
238 static WCHAR test_stringW[] = {'t','e','s','t',' ','s','t','r','i','n','g',0};
240 hr = MimeOleGetInternat(&internat);
241 ok(hr == S_OK, "ret %08x\n", hr);
243 src.pBlobData = (BYTE*)test_string;
244 src.cbSize = sizeof(test_string);
245 hr = IMimeInternational_ConvertBuffer(internat, 1252, 28591, &src, &dst, &read);
246 ok(hr == S_OK, "ret %08x\n", hr);
247 ok(read == sizeof(test_string), "got %d\n", read);
248 ok(dst.cbSize == sizeof(test_string), "got %d\n", dst.cbSize);
249 CoTaskMemFree(dst.pBlobData);
251 src.cbSize = 2;
252 hr = IMimeInternational_ConvertBuffer(internat, 1252, 28591, &src, &dst, &read);
253 ok(hr == S_OK, "ret %08x\n", hr);
254 ok(read == 2, "got %d\n", read);
255 ok(dst.cbSize == 2, "got %d\n", dst.cbSize);
256 CoTaskMemFree(dst.pBlobData);
258 prop_in.vt = VT_LPWSTR;
259 prop_in.u.pwszVal = test_stringW;
260 hr = IMimeInternational_ConvertString(internat, CP_UNICODE, 1252, &prop_in, &prop_out);
261 ok(hr == S_OK, "ret %08x\n", hr);
262 ok(prop_out.vt == VT_LPSTR, "got %d\n", prop_out.vt);
263 ok(!strcmp(prop_out.u.pszVal, test_string), "got %s\n", prop_out.u.pszVal);
264 PropVariantClear(&prop_out);
266 /* If in.vt is VT_LPWSTR, ignore cpiSrc */
267 prop_in.vt = VT_LPWSTR;
268 prop_in.u.pwszVal = test_stringW;
269 hr = IMimeInternational_ConvertString(internat, 28591, 1252, &prop_in, &prop_out);
270 ok(hr == S_OK, "ret %08x\n", hr);
271 ok(prop_out.vt == VT_LPSTR, "got %d\n", prop_out.vt);
272 ok(!strcmp(prop_out.u.pszVal, test_string), "got %s\n", prop_out.u.pszVal);
273 PropVariantClear(&prop_out);
275 prop_in.vt = VT_LPSTR;
276 prop_in.u.pszVal = test_string;
277 hr = IMimeInternational_ConvertString(internat, 28591, CP_UNICODE, &prop_in, &prop_out);
278 ok(hr == S_OK, "ret %08x\n", hr);
279 ok(prop_out.vt == VT_LPWSTR, "got %d\n", prop_out.vt);
280 ok(!lstrcmpW(prop_out.u.pwszVal, test_stringW), "mismatched strings\n");
281 PropVariantClear(&prop_out);
283 /* If in.vt is VT_LPSTR and cpiSrc is CP_UNICODE, use another multibyte codepage (probably GetACP()) */
284 prop_in.vt = VT_LPSTR;
285 prop_in.u.pszVal = test_string;
286 hr = IMimeInternational_ConvertString(internat, CP_UNICODE, CP_UNICODE, &prop_in, &prop_out);
287 ok(hr == S_OK, "ret %08x\n", hr);
288 ok(prop_out.vt == VT_LPWSTR, "got %d\n", prop_out.vt);
289 ok(!lstrcmpW(prop_out.u.pwszVal, test_stringW), "mismatched strings\n");
290 PropVariantClear(&prop_out);
292 IMimeInternational_Release(internat);
295 START_TEST(mimeintl)
297 OleInitialize(NULL);
298 test_create();
299 test_charset();
300 test_defaultcharset();
301 test_convert();
302 OleUninitialize();