winex11.drv: Empty clipboard cache on process unload to avoid false positives being...
[wine] / dlls / gdiplus / tests / stringformat.c
1 /*
2  * Unit test suite for string format
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 "windows.h"
22 #include "gdiplus.h"
23 #include "wine/test.h"
24
25 #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
26 #define expectf(expected, got) ok(got == expected, "Expected %.2f, got %.2f\n", expected, got)
27
28 static void test_constructor(void)
29 {
30     GpStringFormat *format;
31     GpStatus stat;
32     INT n, count;
33     StringAlignment align, valign;
34     StringTrimming trimming;
35     StringDigitSubstitute digitsub;
36     LANGID digitlang;
37
38     stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
39     expect(Ok, stat);
40
41     GdipGetStringFormatAlign(format, &align);
42     GdipGetStringFormatLineAlign(format, &valign);
43     GdipGetStringFormatHotkeyPrefix(format, &n);
44     GdipGetStringFormatTrimming(format, &trimming);
45     GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
46     GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
47
48     expect(HotkeyPrefixNone, n);
49     expect(StringAlignmentNear, align);
50     expect(StringAlignmentNear, align);
51     expect(StringTrimmingCharacter, trimming);
52     expect(StringDigitSubstituteUser, digitsub);
53     expect(LANG_NEUTRAL, digitlang);
54     expect(0, count);
55
56     stat = GdipDeleteStringFormat(format);
57     expect(Ok, stat);
58 }
59
60 static void test_characterrange(void)
61 {
62     CharacterRange ranges[3];
63     INT count;
64     GpStringFormat* format;
65     GpStatus stat;
66
67     stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
68     expect(Ok, stat);
69     stat = GdipSetStringFormatMeasurableCharacterRanges(NULL, 3, ranges);
70     expect(InvalidParameter, stat);
71     stat = GdipSetStringFormatMeasurableCharacterRanges(format, 0, ranges);
72     expect(Ok, stat);
73     stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, NULL);
74     expect(InvalidParameter, stat);
75
76     stat = GdipSetStringFormatMeasurableCharacterRanges(format, 3, ranges);
77     expect(Ok, stat);
78     stat = GdipGetStringFormatMeasurableCharacterRangeCount(format, &count);
79     expect(Ok, stat);
80     if (stat == Ok) expect(3, count);
81
82     stat= GdipDeleteStringFormat(format);
83     expect(Ok, stat);
84 }
85
86 static void test_digitsubstitution(void)
87 {
88     GpStringFormat *format;
89     GpStatus stat;
90     StringDigitSubstitute digitsub;
91     LANGID digitlang;
92
93     stat = GdipCreateStringFormat(0, LANG_RUSSIAN, &format);
94     expect(Ok, stat);
95
96     /* NULL arguments */
97     stat = GdipGetStringFormatDigitSubstitution(NULL, NULL, NULL);
98     expect(InvalidParameter, stat);
99     stat = GdipGetStringFormatDigitSubstitution(format, NULL, NULL);
100     expect(Ok, stat);
101     stat = GdipGetStringFormatDigitSubstitution(NULL, &digitlang, NULL);
102     expect(InvalidParameter, stat);
103     stat = GdipGetStringFormatDigitSubstitution(NULL, NULL, &digitsub);
104     expect(InvalidParameter, stat);
105     stat = GdipGetStringFormatDigitSubstitution(NULL, &digitlang, &digitsub);
106     expect(InvalidParameter, stat);
107     stat = GdipSetStringFormatDigitSubstitution(NULL, LANG_NEUTRAL, StringDigitSubstituteNone);
108     expect(InvalidParameter, stat);
109
110     /* try to get both and one by one */
111     stat = GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
112     expect(Ok, stat);
113     expect(StringDigitSubstituteUser, digitsub);
114     expect(LANG_NEUTRAL, digitlang);
115
116     digitsub  = StringDigitSubstituteNone;
117     stat = GdipGetStringFormatDigitSubstitution(format, NULL, &digitsub);
118     expect(Ok, stat);
119     expect(StringDigitSubstituteUser, digitsub);
120
121     digitlang = LANG_RUSSIAN;
122     stat = GdipGetStringFormatDigitSubstitution(format, &digitlang, NULL);
123     expect(Ok, stat);
124     expect(LANG_NEUTRAL, digitlang);
125
126     /* set/get */
127     stat = GdipSetStringFormatDigitSubstitution(format, MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL),
128                                                         StringDigitSubstituteUser);
129     expect(Ok, stat);
130     digitsub  = StringDigitSubstituteNone;
131     digitlang = LANG_RUSSIAN;
132     stat = GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
133     expect(Ok, stat);
134     expect(StringDigitSubstituteUser, digitsub);
135     expect(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), digitlang);
136
137     stat = GdipDeleteStringFormat(format);
138     expect(Ok, stat);
139 }
140
141 static void test_getgenerictypographic(void)
142 {
143     GpStringFormat *format;
144     GpStatus stat;
145     INT flags;
146     INT n;
147     StringAlignment align, valign;
148     StringTrimming trimming;
149     StringDigitSubstitute digitsub;
150     LANGID digitlang;
151     INT tabcount;
152
153     /* NULL arg */
154     stat = GdipStringFormatGetGenericTypographic(NULL);
155     expect(InvalidParameter, stat);
156
157     stat = GdipStringFormatGetGenericTypographic(&format);
158     expect(Ok, stat);
159
160     GdipGetStringFormatFlags(format, &flags);
161     GdipGetStringFormatAlign(format, &align);
162     GdipGetStringFormatLineAlign(format, &valign);
163     GdipGetStringFormatHotkeyPrefix(format, &n);
164     GdipGetStringFormatTrimming(format, &trimming);
165     GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
166     GdipGetStringFormatTabStopCount(format, &tabcount);
167
168     expect((StringFormatFlagsNoFitBlackBox |StringFormatFlagsLineLimit | StringFormatFlagsNoClip),
169             flags);
170     expect(HotkeyPrefixNone, n);
171     expect(StringAlignmentNear, align);
172     expect(StringAlignmentNear, align);
173     expect(StringTrimmingNone, trimming);
174     expect(StringDigitSubstituteUser, digitsub);
175     expect(LANG_NEUTRAL, digitlang);
176     expect(0, tabcount);
177
178     stat = GdipDeleteStringFormat(format);
179     expect(Ok, stat);
180 }
181
182 static REAL tabstops[] = {0.0, 10.0, 2.0};
183 static void test_tabstops(void)
184 {
185     GpStringFormat *format;
186     GpStatus stat;
187     INT count;
188     REAL tabs[3];
189     REAL firsttab;
190
191     stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
192     expect(Ok, stat);
193
194     /* NULL */
195     stat = GdipGetStringFormatTabStopCount(NULL, NULL);
196     expect(InvalidParameter, stat);
197     stat = GdipGetStringFormatTabStopCount(NULL, &count);
198     expect(InvalidParameter, stat);
199     stat = GdipGetStringFormatTabStopCount(format, NULL);
200     expect(InvalidParameter, stat);
201
202     stat = GdipSetStringFormatTabStops(NULL, 0.0, 0, NULL);
203     expect(InvalidParameter, stat);
204     stat = GdipSetStringFormatTabStops(format, 0.0, 0, NULL);
205     expect(InvalidParameter, stat);
206     stat = GdipSetStringFormatTabStops(NULL, 0.0, 0, tabstops);
207     expect(InvalidParameter, stat);
208
209     stat = GdipGetStringFormatTabStops(NULL, 0, NULL, NULL);
210     expect(InvalidParameter, stat);
211     stat = GdipGetStringFormatTabStops(format, 0, NULL, NULL);
212     expect(InvalidParameter, stat);
213     stat = GdipGetStringFormatTabStops(NULL, 0, &firsttab, NULL);
214     expect(InvalidParameter, stat);
215     stat = GdipGetStringFormatTabStops(NULL, 0, NULL, tabs);
216     expect(InvalidParameter, stat);
217     stat = GdipGetStringFormatTabStops(format, 0, &firsttab, NULL);
218     expect(InvalidParameter, stat);
219     stat = GdipGetStringFormatTabStops(format, 0, NULL, tabs);
220     expect(InvalidParameter, stat);
221
222     /* not NULL */
223     stat = GdipGetStringFormatTabStopCount(format, &count);
224     expect(Ok, stat);
225     expect(0, count);
226     /* negative tabcount */
227     stat = GdipSetStringFormatTabStops(format, 0.0, -1, tabstops);
228     expect(Ok, stat);
229     count = -1;
230     stat = GdipGetStringFormatTabStopCount(format, &count);
231     expect(Ok, stat);
232     expect(0, count);
233
234     stat = GdipSetStringFormatTabStops(format, -10.0, 0, tabstops);
235     expect(Ok, stat);
236     stat = GdipSetStringFormatTabStops(format, -10.0, 1, tabstops);
237     expect(NotImplemented, stat);
238
239     firsttab = -1.0;
240     tabs[0] = tabs[1] = tabs[2] = -1.0;
241     stat = GdipGetStringFormatTabStops(format, 0, &firsttab, tabs);
242     expect(Ok, stat);
243     expectf(-1.0, tabs[0]);
244     expectf(-1.0, tabs[1]);
245     expectf(-1.0, tabs[2]);
246     expectf(0.0, firsttab);
247
248     stat = GdipSetStringFormatTabStops(format, +0.0, 3, tabstops);
249     expect(Ok, stat);
250     count = 0;
251     stat = GdipGetStringFormatTabStopCount(format, &count);
252     expect(Ok, stat);
253     expect(3, count);
254
255     firsttab = -1.0;
256     tabs[0] = tabs[1] = tabs[2] = -1.0;
257     stat = GdipGetStringFormatTabStops(format, 3, &firsttab, tabs);
258     expect(Ok, stat);
259     expectf(0.0,  tabs[0]);
260     expectf(10.0, tabs[1]);
261     expectf(2.0,  tabs[2]);
262     expectf(0.0,  firsttab);
263
264     stat = GdipSetStringFormatTabStops(format, 10.0, 3, tabstops);
265     expect(Ok, stat);
266     firsttab = -1.0;
267     tabs[0] = tabs[1] = tabs[2] = -1.0;
268     stat = GdipGetStringFormatTabStops(format, 0, &firsttab, tabs);
269     expect(Ok, stat);
270     expectf(-1.0, tabs[0]);
271     expectf(-1.0, tabs[1]);
272     expectf(-1.0, tabs[2]);
273     expectf(10.0, firsttab);
274
275     /* zero tabcount, after valid setting to 3 */
276     stat = GdipSetStringFormatTabStops(format, 0.0, 0, tabstops);
277     expect(Ok, stat);
278     count = 0;
279     stat = GdipGetStringFormatTabStopCount(format, &count);
280     expect(Ok, stat);
281     expect(3, count);
282
283     stat = GdipDeleteStringFormat(format);
284     expect(Ok, stat);
285 }
286
287 static void test_getgenericdefault(void)
288 {
289     GpStringFormat *format;
290     GpStatus stat;
291
292     INT flags;
293     INT n;
294     StringAlignment align, valign;
295     StringTrimming trimming;
296     StringDigitSubstitute digitsub;
297     LANGID digitlang;
298     INT tabcount;
299
300     /* NULL arg */
301     stat = GdipStringFormatGetGenericDefault(NULL);
302     expect(InvalidParameter, stat);
303
304     stat = GdipStringFormatGetGenericDefault(&format);
305     expect(Ok, stat);
306
307     GdipGetStringFormatFlags(format, &flags);
308     GdipGetStringFormatAlign(format, &align);
309     GdipGetStringFormatLineAlign(format, &valign);
310     GdipGetStringFormatHotkeyPrefix(format, &n);
311     GdipGetStringFormatTrimming(format, &trimming);
312     GdipGetStringFormatDigitSubstitution(format, &digitlang, &digitsub);
313     GdipGetStringFormatTabStopCount(format, &tabcount);
314
315     expect(0, flags);
316     expect(HotkeyPrefixNone, n);
317     expect(StringAlignmentNear, align);
318     expect(StringAlignmentNear, align);
319     expect(StringTrimmingCharacter, trimming);
320     expect(StringDigitSubstituteUser, digitsub);
321     expect(LANG_NEUTRAL, digitlang);
322     expect(0, tabcount);
323
324     stat = GdipDeleteStringFormat(format);
325     expect(Ok, stat);
326 }
327
328 static void test_stringformatflags(void)
329 {
330     GpStringFormat *format;
331     GpStatus stat;
332
333     INT flags;
334
335     stat = GdipCreateStringFormat(0, LANG_NEUTRAL, &format);
336     expect(Ok, stat);
337
338     /* NULL args */
339     stat = GdipSetStringFormatFlags(NULL, 0);
340     expect(InvalidParameter, stat);
341
342     stat = GdipSetStringFormatFlags(format, 0);
343     expect(Ok, stat);
344     stat = GdipGetStringFormatFlags(format, &flags);
345     expect(Ok, stat);
346     expect(0, flags);
347
348     /* Check some valid flags */
349     stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionRightToLeft);
350     expect(Ok, stat);
351     stat = GdipGetStringFormatFlags(format, &flags);
352     expect(Ok, stat);
353     expect(StringFormatFlagsDirectionRightToLeft, flags);
354
355     stat = GdipSetStringFormatFlags(format, StringFormatFlagsNoFontFallback);
356     expect(Ok, stat);
357     stat = GdipGetStringFormatFlags(format, &flags);
358     expect(Ok, stat);
359     expect(StringFormatFlagsNoFontFallback, flags);
360
361     /* Check some flag combinations */
362     stat = GdipSetStringFormatFlags(format, StringFormatFlagsDirectionVertical
363         | StringFormatFlagsNoFitBlackBox);
364     expect(Ok, stat);
365     stat = GdipGetStringFormatFlags(format, &flags);
366     expect(Ok, stat);
367     expect((StringFormatFlagsDirectionVertical
368         | StringFormatFlagsNoFitBlackBox), flags);
369
370     stat = GdipSetStringFormatFlags(format, StringFormatFlagsDisplayFormatControl
371         | StringFormatFlagsMeasureTrailingSpaces);
372     expect(Ok, stat);
373     stat = GdipGetStringFormatFlags(format, &flags);
374     expect(Ok, stat);
375     expect((StringFormatFlagsDisplayFormatControl
376         | StringFormatFlagsMeasureTrailingSpaces), flags);
377
378     /* Check invalid flags */
379     stat = GdipSetStringFormatFlags(format, 0xdeadbeef);
380     expect(Ok, stat);
381     stat = GdipGetStringFormatFlags(format, &flags);
382     expect(Ok, stat);
383     expect(0xdeadbeef, flags);
384
385     stat = GdipDeleteStringFormat(format);
386     expect(Ok, stat);
387 }
388
389 START_TEST(stringformat)
390 {
391     struct GdiplusStartupInput gdiplusStartupInput;
392     ULONG_PTR gdiplusToken;
393
394     gdiplusStartupInput.GdiplusVersion              = 1;
395     gdiplusStartupInput.DebugEventCallback          = NULL;
396     gdiplusStartupInput.SuppressBackgroundThread    = 0;
397     gdiplusStartupInput.SuppressExternalCodecs      = 0;
398
399     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
400
401     test_constructor();
402     test_characterrange();
403     test_digitsubstitution();
404     test_getgenerictypographic();
405     test_tabstops();
406     test_getgenericdefault();
407     test_stringformatflags();
408
409     GdiplusShutdown(gdiplusToken);
410 }