msi/tests: Skip some source tests if a required product key cannot be created.
[wine] / dlls / gdiplus / tests / font.c
1 /*
2  * Unit test suite for fonts
3  *
4  * Copyright (C) 2007 Google (Evan Stade)
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 #include <math.h>
22
23 #include "windows.h"
24 #include "gdiplus.h"
25 #include "wine/test.h"
26
27 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
28 #define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got)
29
30 static const WCHAR arial[] = {'A','r','i','a','l','\0'};
31 static const WCHAR nonexistent[] = {'T','h','i','s','F','o','n','t','s','h','o','u','l','d','N','o','t','E','x','i','s','t','\0'};
32 static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
33 static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
34 static const WCHAR TimesNewRoman[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'};
35 static const WCHAR CourierNew[] = {'C','o','u','r','i','e','r',' ','N','e','w','\0'};
36 static const WCHAR Tahoma[] = {'T','a','h','o','m','a',0};
37
38 static void test_createfont(void)
39 {
40     GpFontFamily* fontfamily = NULL, *fontfamily2;
41     GpFont* font = NULL;
42     GpStatus stat;
43     Unit unit;
44     UINT i;
45     REAL size;
46     WCHAR familyname[LF_FACESIZE];
47
48     stat = GdipCreateFontFamilyFromName(nonexistent, NULL, &fontfamily);
49     expect (FontFamilyNotFound, stat);
50     stat = GdipDeleteFont(font);
51     expect (InvalidParameter, stat);
52     stat = GdipCreateFontFamilyFromName(arial, NULL, &fontfamily);
53     if(stat == FontFamilyNotFound)
54     {
55         skip("Arial not installed\n");
56         return;
57     }
58     expect (Ok, stat);
59     stat = GdipCreateFont(fontfamily, 12, FontStyleRegular, UnitPoint, &font);
60     expect (Ok, stat);
61     stat = GdipGetFontUnit (font, &unit);
62     expect (Ok, stat);
63     expect (UnitPoint, unit);
64
65     stat = GdipGetFamily(font, &fontfamily2);
66     expect(Ok, stat);
67     stat = GdipGetFamilyName(fontfamily2, familyname, 0);
68     expect(Ok, stat);
69     ok (lstrcmpiW(arial, familyname) == 0, "Expected arial, got %s\n",
70             wine_dbgstr_w(familyname));
71     stat = GdipDeleteFontFamily(fontfamily2);
72     expect(Ok, stat);
73
74     /* Test to see if returned size is based on unit (its not) */
75     GdipGetFontSize(font, &size);
76     ok (size == 12, "Expected 12, got %f\n", size);
77     GdipDeleteFont(font);
78
79     /* Make sure everything is converted correctly for all Units */
80     for (i = UnitWorld; i <=UnitMillimeter; i++)
81     {
82         if (i == UnitDisplay) continue; /* Crashes WindowsXP, wtf? */
83         GdipCreateFont(fontfamily, 24, FontStyleRegular, i, &font);
84         GdipGetFontSize (font, &size);
85         ok (size == 24, "Expected 24, got %f (with unit: %d)\n", size, i);
86         GdipGetFontUnit (font, &unit);
87         expect (i, unit);
88         GdipDeleteFont(font);
89     }
90
91     GdipDeleteFontFamily(fontfamily);
92 }
93
94 static void test_logfont(void)
95 {
96     LOGFONTA lfa, lfa2;
97     GpFont *font;
98     GpStatus stat;
99     GpGraphics *graphics;
100     HDC hdc = GetDC(0);
101     INT style;
102
103     GdipCreateFromHDC(hdc, &graphics);
104     memset(&lfa, 0, sizeof(LOGFONTA));
105     memset(&lfa2, 0xff, sizeof(LOGFONTA));
106
107     /* empty FaceName */
108     lfa.lfFaceName[0] = 0;
109     stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font);
110     expect(NotTrueTypeFont, stat);
111
112     lstrcpyA(lfa.lfFaceName, "Arial");
113
114     stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font);
115     if (stat == FileNotFound)
116     {
117         skip("Arial not installed.\n");
118         return;
119     }
120     expect(Ok, stat);
121     stat = GdipGetLogFontA(font, graphics, &lfa2);
122     expect(Ok, stat);
123
124     ok(lfa2.lfHeight < 0, "Expected negative height\n");
125     expect(0, lfa2.lfWidth);
126     expect(0, lfa2.lfEscapement);
127     expect(0, lfa2.lfOrientation);
128     ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n");
129     expect(0, lfa2.lfItalic);
130     expect(0, lfa2.lfUnderline);
131     expect(0, lfa2.lfStrikeOut);
132     expect(GetTextCharset(hdc), lfa2.lfCharSet);
133     expect(0, lfa2.lfOutPrecision);
134     expect(0, lfa2.lfClipPrecision);
135     expect(0, lfa2.lfQuality);
136     expect(0, lfa2.lfPitchAndFamily);
137
138     GdipDeleteFont(font);
139
140     memset(&lfa, 0, sizeof(LOGFONTA));
141     lfa.lfHeight = 25;
142     lfa.lfWidth = 25;
143     lfa.lfEscapement = lfa.lfOrientation = 50;
144     lfa.lfItalic = lfa.lfUnderline = lfa.lfStrikeOut = TRUE;
145
146     memset(&lfa2, 0xff, sizeof(LOGFONTA));
147     lstrcpyA(lfa.lfFaceName, "Arial");
148
149     stat = GdipCreateFontFromLogfontA(hdc, &lfa, &font);
150     expect(Ok, stat);
151     stat = GdipGetLogFontA(font, graphics, &lfa2);
152     expect(Ok, stat);
153
154     ok(lfa2.lfHeight < 0, "Expected negative height\n");
155     expect(0, lfa2.lfWidth);
156     expect(0, lfa2.lfEscapement);
157     expect(0, lfa2.lfOrientation);
158     ok((lfa2.lfWeight >= 100) && (lfa2.lfWeight <= 900), "Expected weight to be set\n");
159     expect(TRUE, lfa2.lfItalic);
160     expect(TRUE, lfa2.lfUnderline);
161     expect(TRUE, lfa2.lfStrikeOut);
162     expect(GetTextCharset(hdc), lfa2.lfCharSet);
163     expect(0, lfa2.lfOutPrecision);
164     expect(0, lfa2.lfClipPrecision);
165     expect(0, lfa2.lfQuality);
166     expect(0, lfa2.lfPitchAndFamily);
167
168     stat = GdipGetFontStyle(font, &style);
169     expect(Ok, stat);
170     ok (style == (FontStyleItalic | FontStyleUnderline | FontStyleStrikeout),
171             "Expected , got %d\n", style);
172
173     GdipDeleteFont(font);
174
175     GdipDeleteGraphics(graphics);
176     ReleaseDC(0, hdc);
177 }
178
179 static void test_fontfamily (void)
180 {
181     GpFontFamily *family, *clonedFontFamily;
182     WCHAR itsName[LF_FACESIZE];
183     GpStatus stat;
184
185     /* FontFamily cannot be NULL */
186     stat = GdipCreateFontFamilyFromName (arial , NULL, NULL);
187     expect (InvalidParameter, stat);
188
189     /* FontFamily must be able to actually find the family.
190      * If it can't, any subsequent calls should fail.
191      */
192     stat = GdipCreateFontFamilyFromName (nonexistent, NULL, &family);
193     expect (FontFamilyNotFound, stat);
194
195     /* Bitmap fonts are not found */
196     stat = GdipCreateFontFamilyFromName (MSSansSerif, NULL, &family);
197     expect (FontFamilyNotFound, stat);
198     if(stat == Ok) GdipDeleteFontFamily(family);
199
200     stat = GdipCreateFontFamilyFromName (arial, NULL, &family);
201     if(stat == FontFamilyNotFound)
202     {
203         skip("Arial not installed\n");
204         return;
205     }
206     expect (Ok, stat);
207
208     stat = GdipGetFamilyName (family, itsName, LANG_NEUTRAL);
209     expect (Ok, stat);
210     expect (0, lstrcmpiW(itsName, arial));
211
212     if (0)
213     {
214         /* Crashes on Windows XP SP2, Vista, and so Wine as well */
215         stat = GdipGetFamilyName (family, NULL, LANG_NEUTRAL);
216         expect (Ok, stat);
217     }
218
219     /* Make sure we don't read old data */
220     ZeroMemory (itsName, sizeof(itsName));
221     stat = GdipCloneFontFamily(family, &clonedFontFamily);
222     expect (Ok, stat);
223     GdipDeleteFontFamily(family);
224     stat = GdipGetFamilyName(clonedFontFamily, itsName, LANG_NEUTRAL);
225     expect(Ok, stat);
226     expect(0, lstrcmpiW(itsName, arial));
227
228     GdipDeleteFontFamily(clonedFontFamily);
229 }
230
231 static void test_fontfamily_properties (void)
232 {
233     GpFontFamily* FontFamily = NULL;
234     GpStatus stat;
235     UINT16 result = 0;
236
237     stat = GdipCreateFontFamilyFromName(arial, NULL, &FontFamily);
238     if(stat == FontFamilyNotFound)
239         skip("Arial not installed\n");
240     else
241     {
242         stat = GdipGetLineSpacing(FontFamily, FontStyleRegular, &result);
243         expect(Ok, stat);
244         ok (result == 2355, "Expected 2355, got %d\n", result);
245         result = 0;
246         stat = GdipGetEmHeight(FontFamily, FontStyleRegular, &result);
247         expect(Ok, stat);
248         ok(result == 2048, "Expected 2048, got %d\n", result);
249         result = 0;
250         stat = GdipGetCellAscent(FontFamily, FontStyleRegular, &result);
251         expect(Ok, stat);
252         ok(result == 1854, "Expected 1854, got %d\n", result);
253         result = 0;
254         stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
255         ok(result == 434, "Expected 434, got %d\n", result);
256         GdipDeleteFontFamily(FontFamily);
257     }
258
259     stat = GdipCreateFontFamilyFromName(TimesNewRoman, NULL, &FontFamily);
260     if(stat == FontFamilyNotFound)
261         skip("Times New Roman not installed\n");
262     else
263     {
264         result = 0;
265         stat = GdipGetLineSpacing(FontFamily, FontStyleRegular, &result);
266         expect(Ok, stat);
267         ok(result == 2355, "Expected 2355, got %d\n", result);
268         result = 0;
269         stat = GdipGetEmHeight(FontFamily, FontStyleRegular, &result);
270         expect(Ok, stat);
271         ok(result == 2048, "Expected 2048, got %d\n", result);
272         result = 0;
273         stat = GdipGetCellAscent(FontFamily, FontStyleRegular, &result);
274         expect(Ok, stat);
275         ok(result == 1825, "Expected 1825, got %d\n", result);
276         result = 0;
277         stat = GdipGetCellDescent(FontFamily, FontStyleRegular, &result);
278         ok(result == 443, "Expected 443 got %d\n", result);
279         GdipDeleteFontFamily(FontFamily);
280     }
281 }
282
283 static void test_getgenerics (void)
284 {
285     GpStatus stat;
286     GpFontFamily* family;
287     WCHAR familyName[LF_FACESIZE];
288     ZeroMemory(familyName, sizeof(familyName)/sizeof(WCHAR));
289
290     stat = GdipGetGenericFontFamilySansSerif (&family);
291     if (stat == FontFamilyNotFound)
292     {
293         skip("Microsoft Sans Serif not installed\n");
294         goto serif;
295     }
296     expect (Ok, stat);
297     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
298     expect (Ok, stat);
299     if (!lstrcmpiW(familyName, Tahoma))
300         todo_wine ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
301                       "Expected Microsoft Sans Serif, got Tahoma\n");
302     else
303         ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
304             "Expected Microsoft Sans Serif, got %s\n", wine_dbgstr_w(familyName));
305     stat = GdipDeleteFontFamily (family);
306     expect (Ok, stat);
307
308 serif:
309     stat = GdipGetGenericFontFamilySerif (&family);
310     if (stat == FontFamilyNotFound)
311     {
312         skip("Times New Roman not installed\n");
313         goto monospace;
314     }
315     expect (Ok, stat);
316     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
317     expect (Ok, stat);
318     ok (lstrcmpiW(familyName, TimesNewRoman) == 0,
319         "Expected Times New Roman, got %s\n", wine_dbgstr_w(familyName));
320     stat = GdipDeleteFontFamily (family);
321     expect (Ok, stat);
322
323 monospace:
324     stat = GdipGetGenericFontFamilyMonospace (&family);
325     if (stat == FontFamilyNotFound)
326     {
327         skip("Courier New not installed\n");
328         return;
329     }
330     expect (Ok, stat);
331     stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
332     expect (Ok, stat);
333     ok (lstrcmpiW(familyName, CourierNew) == 0,
334         "Expected Courier New, got %s\n", wine_dbgstr_w(familyName));
335     stat = GdipDeleteFontFamily (family);
336     expect (Ok, stat);
337 }
338
339 static void test_installedfonts (void)
340 {
341     GpStatus stat;
342     GpFontCollection* collection=NULL;
343
344     stat = GdipNewInstalledFontCollection(NULL);
345     expect (InvalidParameter, stat);
346
347     stat = GdipNewInstalledFontCollection(&collection);
348     expect (Ok, stat);
349     ok (collection != NULL, "got NULL font collection\n");
350 }
351
352 static void test_heightgivendpi(void)
353 {
354     GpStatus stat;
355     GpFont* font = NULL;
356     GpFontFamily* fontfamily = NULL;
357     REAL height;
358
359     stat = GdipCreateFontFamilyFromName(arial, NULL, &fontfamily);
360     if(stat == FontFamilyNotFound)
361     {
362         skip("Arial not installed\n");
363         return;
364     }
365     expect(Ok, stat);
366
367     stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPixel, &font);
368     expect(Ok, stat);
369
370     stat = GdipGetFontHeightGivenDPI(NULL, 96, &height);
371     expect(InvalidParameter, stat);
372
373     stat = GdipGetFontHeightGivenDPI(font, 96, NULL);
374     expect(InvalidParameter, stat);
375
376     stat = GdipGetFontHeightGivenDPI(font, 96, &height);
377     expect(Ok, stat);
378     expectf((REAL)34.497070, height);
379     GdipDeleteFont(font);
380
381     height = 12345;
382     stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitWorld, &font);
383     expect(Ok, stat);
384     stat = GdipGetFontHeightGivenDPI(font, 96, &height);
385     expect(Ok, stat);
386     expectf((REAL)34.497070, height);
387     GdipDeleteFont(font);
388
389     height = 12345;
390     stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPoint, &font);
391     expect(Ok, stat);
392     stat = GdipGetFontHeightGivenDPI(font, 96, &height);
393     expect(Ok, stat);
394     expectf((REAL)45.996094, height);
395     GdipDeleteFont(font);
396
397     height = 12345;
398     stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitInch, &font);
399     expect(Ok, stat);
400     stat = GdipGetFontHeightGivenDPI(font, 96, &height);
401     expect(Ok, stat);
402     expectf((REAL)3311.718750, height);
403     GdipDeleteFont(font);
404
405     height = 12345;
406     stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitDocument, &font);
407     expect(Ok, stat);
408     stat = GdipGetFontHeightGivenDPI(font, 96, &height);
409     expect(Ok, stat);
410     expectf((REAL)11.039062, height);
411     GdipDeleteFont(font);
412
413     height = 12345;
414     stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitMillimeter, &font);
415     expect(Ok, stat);
416     stat = GdipGetFontHeightGivenDPI(font, 96, &height);
417     expect(Ok, stat);
418     expectf((REAL)130.382614, height);
419     GdipDeleteFont(font);
420
421     GdipDeleteFontFamily(fontfamily);
422 }
423
424 START_TEST(font)
425 {
426     struct GdiplusStartupInput gdiplusStartupInput;
427     ULONG_PTR gdiplusToken;
428
429     gdiplusStartupInput.GdiplusVersion              = 1;
430     gdiplusStartupInput.DebugEventCallback          = NULL;
431     gdiplusStartupInput.SuppressBackgroundThread    = 0;
432     gdiplusStartupInput.SuppressExternalCodecs      = 0;
433
434     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
435
436     test_createfont();
437     test_logfont();
438     test_fontfamily();
439     test_fontfamily_properties();
440     test_getgenerics();
441     test_installedfonts();
442     test_heightgivendpi();
443
444     GdiplusShutdown(gdiplusToken);
445 }