1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for GetTextFace
5  * PROGRAMMERS:     Timo Kreuzer
6  *                  Katayama Hirofumi MZ
7  *                  Doug Lyons
8  */
9 
10 #include "precomp.h"
11 
12 /* Exported by gdi32.dll but undocumented */
13 INT
14 WINAPI
15 GetTextFaceAliasW(
16     IN HDC hdc,
17     IN INT c,
18     OUT LPWSTR lpAliasName);
19 
20 void Test_GetTextFace(void)
21 {
22     HDC hDC;
23     INT ret;
24     INT ret2;
25     WCHAR Buffer[20];
26 
27     hDC = CreateCompatibleDC(NULL);
28     ok(hDC != 0, "CreateCompatibleDC failed, skipping tests.\n");
29     if (!hDC) return;
30 
31     /* Whether asking for the string size (NULL buffer) ignores the size argument */
32     SetLastError(0xE000BEEF);
33     ret = GetTextFaceW(hDC, 0, NULL);
34     TEST(ret != 0);
35     ok(GetLastError() == 0xE000BEEF, "GetLastError() == %ld\n", GetLastError());
36     ret2 = ret;
37 
38     SetLastError(0xE000BEEF);
39     ret = GetTextFaceW(hDC, -1, NULL);
40     TEST(ret != 0);
41     TEST(ret == ret2);
42     ok(GetLastError() == 0xE000BEEF, "GetLastError() == %ld\n", GetLastError());
43     ret2 = ret;
44 
45     SetLastError(0xE000BEEF);
46     ret = GetTextFaceW(hDC, 10000, NULL);
47     TEST(ret != 0);
48     TEST(ret == ret2);
49     ok(GetLastError() == 0xE000BEEF, "GetLastError() == %ld\n", GetLastError());
50     ret2 = ret;
51 
52     /* Whether the buffer is correctly filled */
53     SetLastError(0xE000BEEF);
54     ret = GetTextFaceW(hDC, 20, Buffer);
55     TEST(ret != 0);
56     TEST(ret <= 20);
57     TEST(Buffer[ret - 1] == 0);
58     ok(GetLastError() == 0xE000BEEF, "GetLastError() == %ld\n", GetLastError());
59 
60     SetLastError(0xE000BEEF);
61     ret = GetTextFaceW(hDC, 1, Buffer);
62     TEST(ret == 1);
63     TEST(Buffer[ret - 1] == 0);
64     ok(GetLastError() == 0xE000BEEF, "GetLastError() == %ld\n", GetLastError());
65 
66     SetLastError(0xE000BEEF);
67     ret = GetTextFaceW(hDC, 2, Buffer);
68     TEST(ret == 2);
69     TEST(Buffer[ret - 1] == 0);
70     ok(GetLastError() == 0xE000BEEF, "GetLastError() == %ld\n", GetLastError());
71 
72     /* Whether invalid buffer sizes are correctly ignored */
73     SetLastError(0xE000BEEF);
74     ret = GetTextFaceW(hDC, 0, Buffer);
75     TEST(ret == 0);
76     ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() == %ld\n", GetLastError());
77 
78     SetLastError(0xE000BEEF);
79     ret = GetTextFaceW(hDC, -1, Buffer);
80     TEST(ret == 0);
81     ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() == %ld\n", GetLastError());
82 
83     DeleteDC(hDC);
84 }
85 
86 void Test_GetTextFaceAliasW(void)
87 {
88     HDC hDC;
89     INT ret;
90     INT ret2;
91     UINT i;
92     LOGFONTW lf;
93     HFONT hFontOld, hFont;
94     WCHAR buf1[LF_FACESIZE];
95     WCHAR buf2[LF_FACESIZE];
96 
97     static struct
98     {
99         LPCWSTR lpFaceName;
100         LPCWSTR lpExpectedFaceName;
101         LPCWSTR lpExpectedAlias;
102     } FaceTests[] =
103     {
104         {L"Arial", L"Arial", L"Arial"},
105         {L"Tahoma", L"Tahoma", L"Tahoma"},
106         {L"Tahoma Bold", L"MS Sans Serif", L"MS Sans Serif"}, // That's what Windows 2003 and 7 returns.
107         {L"Helv", L"Helv", L"Helv"},
108         {L"Tms Rmn", L"Tms Rmn", L"Tms Rmn"},
109         {L"Times", L"Times", L"Times"},
110         {L"invalid", L"MS Sans Serif", L"MS Sans Serif"}
111     };
112 
113     hDC = CreateCompatibleDC(NULL);
114     ok(hDC != 0, "CreateCompatibleDC failed, skipping tests.\n");
115     if (!hDC) return;
116 
117     for (i = 0; i < ARRAYSIZE(FaceTests); ++i)
118     {
119         ZeroMemory(&lf, sizeof(lf));
120         StringCchCopyW(lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), FaceTests[i].lpFaceName);
121 
122         hFont = CreateFontIndirectW(&lf);
123         if (!hFont)
124         {
125             trace("Failed to create font '%S'!\n", lf.lfFaceName);
126             continue;
127         }
128 
129         hFontOld = SelectObject(hDC, hFont);
130 
131         ret = GetTextFaceW(hDC, ARRAYSIZE(buf1), buf1);
132         ok(ret != 0, "%S GetTextFaceW failed.\n", FaceTests[i].lpFaceName);
133         ok(wcscmp(buf1, FaceTests[i].lpExpectedFaceName) == 0, "'%S' GetTextFaceW failed, got '%S', expected '%S'.\n",
134             FaceTests[i].lpFaceName, buf1, FaceTests[i].lpExpectedFaceName);
135 
136         ret2 = GetTextFaceAliasW(hDC, ARRAYSIZE(buf2), buf2);
137         ok(ret2 != 0, "%S GetTextFaceAliasW failed.\n", FaceTests[i].lpFaceName);
138         ok(wcscmp(buf2, FaceTests[i].lpExpectedAlias) == 0, "'%S' GetTextFaceAliasW failed, got '%S', expected '%S'.\n",
139             FaceTests[i].lpFaceName, buf2, FaceTests[i].lpExpectedAlias);
140 
141         SelectObject(hDC, hFontOld);
142         DeleteObject(hFont);
143     }
144 
145     DeleteDC(hDC);
146 }
147 
148 START_TEST(GetTextFace)
149 {
150     Test_GetTextFace();
151     Test_GetTextFaceAliasW();
152 }
153