po: Update French translation.
[wine] / dlls / inetcomm / tests / mimeintl.c
1 /*
2  * MimeInternational tests
3  *
4  * Copyright 2008 Huw Davies
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 #define COBJMACROS
22 #define NONAMELESSUNION
23
24 #include "windows.h"
25 #include "ole2.h"
26 #include "ocidl.h"
27
28 #include "mimeole.h"
29
30 #include "initguid.h"
31 #include "mlang.h"
32
33 #include <stdio.h>
34
35 #include "wine/test.h"
36
37 static void test_create(void)
38 {
39     IMimeInternational *internat, *internat2;
40     HRESULT hr;
41     ULONG ref;
42
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);
47
48     /* Under w2k8 it's no longer a singleton */
49     if(internat == internat2)
50     {
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);
57
58         ref = IMimeInternational_Release(internat);
59         ok(ref == 1, "got %d\n", ref);
60     }
61     else
62     {
63         ref = IMimeInternational_Release(internat2);
64         ok(ref == 0, "got %d\n", ref);
65
66         ref = IMimeInternational_Release(internat);
67         ok(ref == 0, "got %d\n", ref);
68     }
69
70 }
71
72 static inline HRESULT get_mlang(IMultiLanguage **ml)
73 {
74     return CoCreateInstance(&CLSID_CMultiLanguage, NULL,  CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
75                             &IID_IMultiLanguage, (void **)ml);
76 }
77
78 static HRESULT mlang_getcsetinfo(const char *charset, MIMECSETINFO *mlang_info)
79 {
80     DWORD len = MultiByteToWideChar(CP_ACP, 0, charset, -1, NULL, 0);
81     BSTR bstr = SysAllocStringLen(NULL, len - 1);
82     HRESULT hr;
83     IMultiLanguage *ml;
84
85     MultiByteToWideChar(CP_ACP, 0, charset, -1, bstr, len);
86
87     hr = get_mlang(&ml);
88
89     if(SUCCEEDED(hr))
90     {
91         hr = IMultiLanguage_GetCharsetInfo(ml, bstr, mlang_info);
92         IMultiLanguage_Release(ml);
93     }
94     SysFreeString(bstr);
95     if(FAILED(hr)) hr = MIME_E_NOT_FOUND;
96     return hr;
97 }
98
99 static HRESULT mlang_getcodepageinfo(UINT cp, MIMECPINFO *mlang_cp_info)
100 {
101     HRESULT hr;
102     IMultiLanguage *ml;
103
104     hr = get_mlang(&ml);
105
106     if(SUCCEEDED(hr))
107     {
108         hr = IMultiLanguage_GetCodePageInfo(ml, cp, mlang_cp_info);
109         IMultiLanguage_Release(ml);
110     }
111     return hr;
112 }
113
114 static HRESULT mlang_getcsetinfo_from_cp(UINT cp, CHARSETTYPE charset_type, MIMECSETINFO *mlang_info)
115 {
116     MIMECPINFO mlang_cp_info;
117     WCHAR *charset_name;
118     HRESULT hr;
119     IMultiLanguage *ml;
120
121     hr = mlang_getcodepageinfo(cp, &mlang_cp_info);
122     if(FAILED(hr)) return hr;
123
124     switch(charset_type)
125     {
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;
135     }
136
137     hr = get_mlang(&ml);
138
139     if(SUCCEEDED(hr))
140     {
141         hr = IMultiLanguage_GetCharsetInfo(ml, charset_name, mlang_info);
142         IMultiLanguage_Release(ml);
143     }
144     return hr;
145 }
146
147 static void test_charset(void)
148 {
149     IMimeInternational *internat;
150     HRESULT hr;
151     HCHARSET hcs, hcs_windows_1252, hcs_windows_1251;
152     INETCSETINFO cs_info;
153     MIMECSETINFO mlang_cs_info;
154
155     hr = MimeOleGetInternat(&internat);
156     ok(hr == S_OK, "ret %08x\n", hr);
157
158     hr = IMimeInternational_FindCharset(internat, "nonexistent", &hcs);
159     ok(hr == MIME_E_NOT_FOUND, "got %08x\n", hr);
160
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");
169
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");
173
174     hr = IMimeInternational_GetCharsetInfo(internat, hcs_windows_1252, &cs_info);
175     ok(hr == S_OK, "got %08x\n", hr);
176
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");
185
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);
190
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);
197
198     IMimeInternational_Release(internat);
199 }
200
201 static void test_defaultcharset(void)
202 {
203     IMimeInternational *internat;
204     HRESULT hr;
205     HCHARSET hcs_default, hcs, hcs_windows_1251;
206
207     hr = MimeOleGetInternat(&internat);
208     ok(hr == S_OK, "ret %08x\n", hr);
209
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");
215
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);
226
227     IMimeInternational_Release(internat);
228 }
229
230 static void test_convert(void)
231 {
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};
239
240     hr = MimeOleGetInternat(&internat);
241     ok(hr == S_OK, "ret %08x\n", hr);
242
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);
250
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);
257
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);
265
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);
274
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);
282
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);
291
292     IMimeInternational_Release(internat);
293 }
294
295 START_TEST(mimeintl)
296 {
297     OleInitialize(NULL);
298     test_create();
299     test_charset();
300     test_defaultcharset();
301     test_convert();
302     OleUninitialize();
303 }