Reverse the order for deleting the items in resetcontent to correctly
[wine] / dlls / msvcrt / tests / printf.c
1 /*
2  * Conformance tests for *printf functions.
3  *
4  * Copyright 2002 Uwe Bonnes
5  * Copyright 2004 Aneurin Price
6  * Copyright 2005 Mike McCormack
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22  
23 #include <stdio.h>
24
25 #include "wine/test.h"
26
27 static void test_sprintf( void )
28 {
29     char buffer[100];
30     const char *format;
31     double pnumber=789456123;
32     int x, r;
33     WCHAR wide[] = { 'w','i','d','e',0};
34
35     format = "%+#23.15e";
36     r = sprintf(buffer,format,pnumber);
37     todo_wine {
38     ok(!strcmp(buffer,"+7.894561230000000e+008"),"exponent format incorrect\n");
39     }
40     ok( r==23, "return count wrong\n");
41
42     todo_wine {
43     format = "%I64d";
44     r = sprintf(buffer,format,((ULONGLONG)0xffffffff)*0xffffffff);
45     ok(!strcmp(buffer,"-8589934591"),"Problem with long long\n");
46     ok( r==11, "return count wrong\n");
47     }
48
49     format = "%lld";
50     r = sprintf(buffer,format,((ULONGLONG)0xffffffff)*0xffffffff);
51     ok(!strcmp(buffer, "1"), "Problem with \"ll\" interpretation\n");
52     ok( r==1, "return count wrong\n");
53
54     format = "%S";
55     r = sprintf(buffer,format,wide);
56     ok(!strcmp(buffer,"wide"),"Problem with wide string format\n");
57     ok( r==4, "return count wrong\n");
58
59     format = "%04c";
60     r = sprintf(buffer,format,'1');
61     ok(!strcmp(buffer,"0001"),"Character not zero-prefixed \"%s\"\n",buffer);
62     ok( r==4, "return count wrong\n");
63
64     format = "%p";
65     r = sprintf(buffer,format,(void *)57);
66     ok(!strcmp(buffer,"00000039"),"Pointer formatted incorrectly \"%s\"\n",buffer);
67     ok( r==8, "return count wrong\n");
68
69     format = "%#012p";
70     r = sprintf(buffer,format,(void *)57);
71     ok(!strcmp(buffer,"  0X00000039"),"Pointer formatted incorrectly\n");
72     ok( r==12, "return count wrong\n");
73
74     format = "%04s";
75     r = sprintf(buffer,format,"foo");
76     ok(!strcmp(buffer,"0foo"),"String not zero-prefixed \"%s\"\n",buffer);
77     ok( r==4, "return count wrong\n");
78
79     format = "%#-012p";
80     r = sprintf(buffer,format,(void *)57);
81     ok(!strcmp(buffer,"0X00000039  "),"Pointer formatted incorrectly\n");
82     ok( r==12, "return count wrong\n");
83
84     format = "hello";
85     r = sprintf(buffer, format);
86     ok(!strcmp(buffer,"hello"), "failed\n");
87     ok( r==5, "return count wrong\n");
88
89     format = "%ws";
90     r = sprintf(buffer, format, wide);
91     ok(!strcmp(buffer,"wide"), "failed\n");
92     ok( r==4, "return count wrong\n");
93
94     format = "%-10ws";
95     r = sprintf(buffer, format, wide );
96     ok(!strcmp(buffer,"wide      "), "failed\n");
97     ok( r==10, "return count wrong\n");
98
99     format = "%10ws";
100     r = sprintf(buffer, format, wide );
101     ok(!strcmp(buffer,"      wide"), "failed\n");
102     ok( r==10, "return count wrong\n");
103
104     format = "%#+ -03whlls";
105     r = sprintf(buffer, format, wide );
106     ok(!strcmp(buffer,"wide"), "failed\n");
107     ok( r==4, "return count wrong\n");
108
109     format = "%w0s";
110     r = sprintf(buffer, format, wide );
111     ok(!strcmp(buffer,"0s"), "failed\n");
112     ok( r==2, "return count wrong\n");
113
114     format = "%w-s";
115     r = sprintf(buffer, format, wide );
116     ok(!strcmp(buffer,"-s"), "failed\n");
117     ok( r==2, "return count wrong\n");
118
119     format = "%b";
120     r = sprintf(buffer, format);
121     ok(!strcmp(buffer,"b"), "failed\n");
122     ok( r==1, "return count wrong\n");
123
124     format = "%3c";
125     r = sprintf(buffer, format,'a');
126     ok(!strcmp(buffer,"  a"), "failed\n");
127     ok( r==3, "return count wrong\n");
128
129     format = "%3d";
130     r = sprintf(buffer, format,1234);
131     ok(!strcmp(buffer,"1234"), "failed\n");
132     ok( r==4, "return count wrong\n");
133
134     format = "%3h";
135     r = sprintf(buffer, format);
136     ok(!strcmp(buffer,""), "failed\n");
137     ok( r==0, "return count wrong\n");
138
139     format = "%j%k%m%q%r%t%v%y%z";
140     r = sprintf(buffer, format);
141     ok(!strcmp(buffer,"jkmqrtvyz"), "failed\n");
142     ok( r==9, "return count wrong\n");
143
144     format = "asdf%n";
145     x = 0;
146     r = sprintf(buffer, format, &x );
147     ok(x == 4, "should write to x\n");
148     ok(!strcmp(buffer,"asdf"), "failed\n");
149     ok( r==4, "return count wrong\n");
150
151     format = "%-1d";
152     r = sprintf(buffer, format,2);
153     ok(!strcmp(buffer,"2"), "failed\n");
154     ok( r==1, "return count wrong\n");
155
156     format = "%2.4f";
157     r = sprintf(buffer, format,8.6);
158     ok(!strcmp(buffer,"8.6000"), "failed\n");
159     ok( r==6, "return count wrong\n");
160
161     todo_wine {
162     format = "%2.4e";
163     r = sprintf(buffer, format,8.6);
164     ok(!strcmp(buffer,"8.6000e+000"), "failed\n");
165     ok( r==11, "return count wrong\n");
166     }
167
168     format = "%2.4g";
169     r = sprintf(buffer, format,8.6);
170     ok(!strcmp(buffer,"8.6"), "failed\n");
171     ok( r==3, "return count wrong\n");
172
173     format = "%-i";
174     r = sprintf(buffer, format,-1);
175     ok(!strcmp(buffer,"-1"), "failed\n");
176     ok( r==2, "return count wrong\n");
177
178     format = "%-i";
179     r = sprintf(buffer, format,1);
180     ok(!strcmp(buffer,"1"), "failed\n");
181     ok( r==1, "return count wrong\n");
182
183     format = "%+i";
184     r = sprintf(buffer, format,1);
185     ok(!strcmp(buffer,"+1"), "failed\n");
186     ok( r==2, "return count wrong\n");
187
188     format = "%o";
189     r = sprintf(buffer, format,10);
190     ok(!strcmp(buffer,"12"), "failed\n");
191     ok( r==2, "return count wrong\n");
192
193     format = "%p";
194     r = sprintf(buffer, format,0);
195     ok(!strcmp(buffer,"00000000"), "failed\n");
196     ok( r==8, "return count wrong\n");
197
198     format = "%s";
199     r = sprintf(buffer, format,0);
200     ok(!strcmp(buffer,"(null)"), "failed\n");
201     ok( r==6, "return count wrong\n");
202
203     format = "%s";
204     r = sprintf(buffer, format,"%%%%");
205     ok(!strcmp(buffer,"%%%%"), "failed\n");
206     ok( r==4, "return count wrong\n");
207
208     format = "%u";
209     r = sprintf(buffer, format,-1);
210     ok(!strcmp(buffer,"4294967295"), "failed\n");
211     ok( r==10, "return count wrong\n");
212
213     format = "%w";
214     r = sprintf(buffer, format,-1);
215     ok(!strcmp(buffer,""), "failed\n");
216     ok( r==0, "return count wrong\n");
217
218     format = "%h";
219     r = sprintf(buffer, format,-1);
220     ok(!strcmp(buffer,""), "failed\n");
221     ok( r==0, "return count wrong\n");
222
223     format = "%z";
224     r = sprintf(buffer, format,-1);
225     ok(!strcmp(buffer,"z"), "failed\n");
226     ok( r==1, "return count wrong\n");
227
228     format = "%j";
229     r = sprintf(buffer, format,-1);
230     ok(!strcmp(buffer,"j"), "failed\n");
231     ok( r==1, "return count wrong\n");
232
233     format = "x%cx";
234     r = sprintf(buffer, format, 0x100+'X');
235     ok(!strcmp(buffer,"xXx"), "failed\n");
236     ok( r==3, "return count wrong\n");
237 }
238
239 static void test_swprintf( void )
240 {
241     wchar_t buffer[100];
242     const wchar_t I64d[] = {'%','I','6','4','d',0};
243     double pnumber=789456123;
244     const wchar_t TwentyThreePoint15e[]= {'%','+','#','2','3','.','1','5','e',0};
245     const wchar_t e008[] = {'e','+','0','0','8',0};
246     const char string[]={'s','t','r','i','n','g',0};
247     const wchar_t S[]={'%','S',0};
248     swprintf(buffer,TwentyThreePoint15e,pnumber);
249     todo_wine
250       {
251         ok(wcsstr(buffer,e008) != 0,"Sprintf different\n");
252       }
253     swprintf(buffer,I64d,((ULONGLONG)0xffffffff)*0xffffffff);
254     todo_wine
255       {
256         ok(wcslen(buffer) == 11,"Problem with long long\n");
257       }
258     swprintf(buffer,S,string);
259       ok(wcslen(buffer) == 6,"Problem with \"%%S\" interpretation\n");
260 }
261
262 static void test_fwprintf( void )
263 {
264     const char *string="not a wide string";
265     todo_wine
266       {
267         ok(fwprintf(fopen("nul","r+"),(wchar_t *)string) == -1,"Non-wide string should not be printed by fwprintf\n");
268       }
269 }
270
271 static void test_snprintf (void)
272 {
273     struct snprintf_test {
274         const char *format;
275         int expected;
276         struct {
277             int retval;
278             int render;
279         } todo;
280     };
281     /* Pre-2.1 libc behaviour, not C99 compliant. */
282     const struct snprintf_test tests[] = {{"short", 5, {0, 0}},
283                                           {"justfit", 7, {0, 0}},
284                                           {"justfits", 8, {0, 1}},
285                                           {"muchlonger", -1, {1, 1}}};
286     char buffer[8];
287     const int bufsiz = sizeof buffer;
288     unsigned int i;
289
290     for (i = 0; i < sizeof tests / sizeof tests[0]; i++) {
291         const char *fmt  = tests[i].format;
292         const int expect = tests[i].expected;
293         const int n      = _snprintf (buffer, bufsiz, fmt);
294         const int valid  = n < 0 ? bufsiz : (n == bufsiz ? n : n+1);
295
296         todo (tests[i].todo.retval ? "wine" : "none")
297             ok (n == expect, "\"%s\": expected %d, returned %d\n",
298                 fmt, expect, n);
299         todo (tests[i].todo.render ? "wine" : "none")
300             ok (!memcmp (fmt, buffer, valid),
301                 "\"%s\": rendered \"%.*s\"\n", fmt, valid, buffer);
302     };
303 }
304
305 START_TEST(printf)
306 {
307     test_sprintf();
308     test_swprintf();
309     test_fwprintf();
310     test_snprintf();
311 }